Compare commits

...

758 Commits

Author SHA1 Message Date
Ian Parker 9a57758425 Add building instructions (#5) 5 years ago
Ian Parker 64a911333f
Merge pull request #6 from AaronDewes/patch-1
Update German translation
5 years ago
Ian Parker 300c482314
Merge pull request #4 from AaronDewes/master
A few improvements
5 years ago
Aaron Dewes ad456600ed
Update German translation 5 years ago
AaronDewes a5a9104e77 A few improvements 5 years ago
Ian Parker 9140e3392d Update English description 5 years ago
Ian Parker 06b6ca01f1 Update user-rules.html title 5 years ago
Ian Parker 1c45aa35a3 Fix Firefox extension validation by increasing min version 5 years ago
Ian Parker c3fd99a692 Bump version 5 years ago
Ian Parker 122e5ca082 Rebrand Firefox distribution 5 years ago
Ian Parker 088eea918b
Merge pull request #3 from geekprojects/xofe-minor-fixes-3
Xofe minor fixes 3
5 years ago
Ian Parker e4fd3a0e93 Merge branch 'minor-fixes-3' of https://github.com/xofe/uMatrix into xofe-minor-fixes-3 5 years ago
Ian Parker af770ebeb8 Update to nuTensor in locales 5 years ago
Ian Parker 1cc436b779 Add initial issue templates 5 years ago
Ian Parker b2f09f89b5 Rebranding: Initial work on renaming to nuTensor 5 years ago
Ian Parker e9274d6e30 Update tools to nuTensor and use nuAssets 5 years ago
Ian Parker eca5ca3f32 Update README.md with nuTensor 5 years ago
xofe bda7383bc8 Fix tooltip for "obsolete" icon in dashboard assets page 5 years ago
xofe 7562a3d697 Add missing styling for `fa-icon-vflipped` class
Fixes the search widget down arrow's direction in asset viewer.
5 years ago
xofe 954d827934 Allow line breaking for long domains in popup panel 5 years ago
xofe e7899435fe Open logger/dashboard links adjacent to current tab
This regressed in https://github.com/gorhill/uMatrix/commit/9b29230.
5 years ago
xofe 93edb4aca0 Call `python3` rather than `python` in build scripts
This prevents the build scripts failing when Python 2 isn't installed.
5 years ago
xofe c9ddc9d5d0 Only consider hostname blocklisted if it's a full match
Fixes https://github.com/uBlockOrigin/uMatrix-issues/issues/284
5 years ago
Raymond Hill 0bcb7669e7
Fix exception thrown when a stock asset is removed
Related feedback:
- https://www.reddit.com/r/uMatrix/comments/ftebgz/
6 years ago
Raymond Hill 89b7e026c3
Revert "Remove hpHosts from stock hosts files"
This reverts commit ba0dfe5d9b.

Related feedback:
- https://www.reddit.com/r/uMatrix/comments/ftebgz/
6 years ago
Raymond Hill ba0dfe5d9b
Remove hpHosts from stock hosts files
Related issue:
- https://github.com/uBlockOrigin/uBlock-issues/issues/971
6 years ago
Raymond Hill 57eb9fc150
Expect that IntersectionObserver API may not be available
Related issue:
- https://github.com/uBlockOrigin/uMatrix-issues/issues/235

The popup-resize functionality won't be available if the
IntersectionObserver API is not available. The purpose
of the popup-resize code is to adjust the matrix visuals
on small display -- i.e. on mobile or when the popup panel
is used in the overflow menu in Firefox.
6 years ago
Raymond Hill e0800f89df
Make Firefox dev build auto-update 6 years ago
Raymond Hill b26b3bb960
New revision for dev build 6 years ago
Raymond Hill 2d8e32c61b
Minor style changes 6 years ago
Raymond Hill 41133dffd2
Fix remnants of uBO code in cache storage manager
Related feedback:
- https://github.com/uBlockOrigin/uMatrix-issues/issues/227#issuecomment-590543891
6 years ago
Saitama a1ec20423c
mvps host list secure protocol http => https (#1014) 6 years ago
Raymond Hill e3ebfdfba4
Fix improper initial value for `suspendTabsUntilReady` 6 years ago
Raymond Hill 43cd137fff
Make Firefox dev build auto-update 6 years ago
Raymond Hill a697ce0be9
New revision for dev build 6 years ago
Raymond Hill b75500eff4
Import translation work from https://crowdin.com/project/umatrix 6 years ago
Raymond Hill 3f4425d9db
Fix broken handling of blocked document parameters
Related issue:
- https://github.com/uBlockOrigin/uMatrix-issues/issues/214

Regression from:
- https://github.com/gorhill/uMatrix/commit/9b292304d33a#diff-67a98e071667dfff264d50da29bb3a5cL38-R39
6 years ago
Raymond Hill f8c82add03
Fix python scripts used for pusblishing dev builds 6 years ago
Raymond Hill a78a6465b0
Make Firefox dev build auto-update 6 years ago
Raymond Hill ae7d450827
New revision for dev build 6 years ago
Raymond Hill c908ae5210
Import translation work from https://crowdin.com/project/umatrix 6 years ago
Raymond Hill ea688f3942
Fix network error message in logger
Related feedback:
- https://github.com/gorhill/uMatrix/issues/945#issuecomment-569792402

Regression from:
- https://github.com/gorhill/uMatrix/commit/9b292304d33a
6 years ago
Raymond Hill 8a39b0e171
New revision for dev build 6 years ago
Raymond Hill 5c06fed370
Make 1st and 3rd columns in logger clickable
These columns are unlikely to be used for text
selection, so there is no harm to make them
clickable.
6 years ago
Raymond Hill 035f3f53a2
Fix packaging/publishing scripts 6 years ago
Raymond Hill 17430ded93
Make Firefox dev build auto-update 6 years ago
Raymond Hill b8e62f0c55
Import translation work from https://crowdin.com/project/umatrix 6 years ago
Raymond Hill e800756163
New revision for dev build 6 years ago
Raymond Hill 0190fdaf3d
Add back missing tab context properties
These properties, used to detect/act on/report
unencrypted connection, were erroneously removed
when importing uBO's code en-bloc.

Related issue:
- https://github.com/uBlockOrigin/uMatrix-issues/issues/212
6 years ago
Raymond Hill 0db579da97
Make Firefox dev build auto-update 6 years ago
Raymond Hill e5cf0d4684
Import translation work from https://crowdin.com/project/umatrix 6 years ago
Raymond Hill a2f213492e
New revision for dev build 6 years ago
Raymond Hill a9f32a475f
Fix broken content scripts in Firefox
Related commit:
- https://github.com/gorhill/uMatrix/commit/9b292304d33a

Forgot to declare `/js/vapi.js` as first content script
to inject.
6 years ago
Raymond Hill cb9934f67a
Fix publish scripts for dev build versions 6 years ago
Raymond Hill e7140262f2
Use correct manifest key (instead of the alias) 6 years ago
Raymond Hill a9bcc70a2b
Minor code review of WASM-loading code 6 years ago
Raymond Hill 2936d73911
Fix odds and ends from mega commit 9b292304d3
Related commit:
- https://github.com/gorhill/uMatrix/commit/9b292304d33a
6 years ago
Raymond Hill df4a403473
Make use of css flex in matrix UI 6 years ago
Raymond Hill d993b8442a
Import translation work from https://crowdin.com/project/umatrix 6 years ago
Raymond Hill 5aab1fb00b
Import publish script fixes from uBO 6 years ago
Raymond Hill 9b292304d3
Bring uMatrix up to date
Notably:
- Import logger improvements from uBO
- Import CNAME uncloaking from uBO
- Import more improvements from uBO
- Make use of modern JS features

This should un-stall further development of uMatrix.
6 years ago
Raymond Hill 1d936742a7
New revision for stable release 6 years ago
Raymond Hill 5156e23a09
Import translation work from https://crowdin.com/project/umatrix 6 years ago
Raymond Hill 93b28cdd84
Silently ignore invalid tab id 6 years ago
Raymond Hill 3da449b8a4
Import translation work from https://crowdin.com/project/umatrix 7 years ago
Raymond Hill eb2a4699d4
make Firefox dev build auto-update 7 years ago
Raymond Hill e01ebef2cf
New revision for release candidate 7 years ago
Raymond Hill c3919da2c2
Add more cases for documentUrl to be safely used as root context
Related issue:
- https://github.com/uBlockOrigin/uMatrix-issues/issues/155
7 years ago
Raymond Hill d5fe3edb15
make Firefox dev build auto-update 7 years ago
Raymond Hill f332cd9f68
New revision for release candidate 7 years ago
Raymond Hill d6471b3556
Fix https://github.com/uBlockOrigin/uMatrix-issues/issues/159 7 years ago
Raymond Hill 0da9645d91
make Firefox dev build auto-update 7 years ago
Raymond Hill 6e9f23c940
Import translation work from https://crowdin.com/project/umatrix 7 years ago
Raymond Hill 04a9d00a5e
New revision for dev build 7 years ago
Raymond Hill 1ddb822509
Mitigate undesireable side-effect of 901c325eab
Related discussion/issue:
- https://github.com/uBlockOrigin/uMatrix-issues/issues/156#issuecomment-494427094
- https://github.com/uBlockOrigin/uMatrix-issues/issues/155

Due to a Chromium issue about not providing the proper context
information, a negative side-effect was introduced with fix
to #155. This commit will force the originator of a network
request of type `main_frame` to be that of the request URL
itself, i.e. the originator of a top-level document request
is the requested document itself.
7 years ago
Raymond Hill 0807d71704
make Firefox dev build auto-update 7 years ago
Raymond Hill d5f75e84d8
New revision for dev build 7 years ago
Raymond Hill 901c325eab
Use documentUrl for context purpose when available
Related issue:
- https://github.com/uBlockOrigin/uMatrix-issues/issues/155

documentUrl was currently used on onBeforeRequest but not
for onBeforeSendHeaders.
7 years ago
Raymond Hill dbe6218926
make Firefox dev build auto-update 7 years ago
Raymond Hill 732d0e84d8
New revision for dev build 7 years ago
Raymond Hill ab303d3c17
Fix the logger's rendering of hostnames starting with digits
Related issue:
- https://github.com/uBlockOrigin/uBlock-issues/issues/541
7 years ago
Raymond Hill 1f1429c47a Import translation work from https://crowdin.com/project/umatrix 7 years ago
Raymond Hill 5c3661b69c make Firefox dev build auto-update 7 years ago
Ryan Hendrickson 3f2916ed05 More unused code cleaning (#1009)
* remove many unused functions

* remove XAL abstraction
7 years ago
Raymond Hill fa795dd446 New revision for dev build 7 years ago
xofe 26aedcc5f9 show placeholder for blocked `frame` elements (fix https://github.com/uBlockOrigin/uMatrix-issues/issues/120) (#1010) 7 years ago
Raymond Hill 054935d025
Fix https://github.com/uBlockOrigin/uMatrix-issues/issues/98 7 years ago
Raymond Hill 62fc318e89
make Firefox dev build auto-update 7 years ago
Raymond Hill 6bba6c4f85
New revision for dev build 7 years ago
Raymond Hill fb94c85df1
Add ability to block early at launch; adapt to changes in Chromium 72+
Related issues:

- "Requests bypass uMatrix on Firefox start"
  <https://github.com/uBlockOrigin/uMatrix-issues/issues/69>

  Using same approach as with uBO:
  https://github.com/gorhill/uBloc/commit/41548be6be35

  `suspendTabsUntilReady` advanced setting added to "More" pane,
  useful only for Chromium -- the blocking of early network
  requests is enforced unconditionally on Firefox (because it
  supports returning Promises from webRequest handlers).

- "Cookies leaking temporarily"
  <https://github.com/uBlockOrigin/uMatrix-issues/issues/74>

  Changes in the webRequest API in Chromium 72+ caused uMatrix
  to fail to process `Cookie` and `Referer` headers on that
  platform.
7 years ago
Raymond Hill 3cc56afe63
make Firefox dev build auto-update 7 years ago
Raymond Hill 9789182b2c
New revision for dev build 7 years ago
Ryan Hendrickson 4d7109bf99 Cleaning (#1007)
* remove unused field distinctRequestCount

* remove mostly unused RequestStats

* write to pageStore.pageUrl, not pageStore.normalURL

* remove unused cookie code

* remove unused field off
7 years ago
Raymond Hill 130db1f351
Mind CR-terminated lines in recipe parser
Related issue:
- https://github.com/uBlockOrigin/uMatrix-issues/issues/97
7 years ago
xofe 2045397084 Minor fixes (#1005)
* correct cloud-download/upload icon CSS selectors

* fix scope tooltip in logger appearing offscreen

* open logger/dashboard links adjacent to current tab (match uBO's behaviour)

* opera: fix manifest version not being updated

Version code copied from tools/make-chromium-meta.py

* fix https://www.reddit.com/r/uBlockOrigin/comments/9gwrna/when_you_right_click_and_go_to_options_it_keeps/

source:
* 6dd6dc5f1d

* remove unused "processReferer" setting

It was changed to a matrix switch in 5d8bae3da2

* remove unused source code

source:
* f516cd3d26
* 0503f52b1e

* remove bold version of Roboto font (unused from HTTPSB)

* correct FontAwesome license after change from v5 back to v4.7

License copied from bb737e29d5

* fix build scripts after c0f4abfd00
7 years ago
Raymond Hill 9494da7195
New revision for stable release 7 years ago
Raymond Hill 94fdd3b587
Import translation work from https://crowdin.com/project/umatrix 7 years ago
Raymond Hill d7a96081f5
make Firefox dev build auto-update 7 years ago
Raymond Hill 521430115a
New revision for dev build 7 years ago
Raymond Hill acfb1a6310
Import translation work from https://crowdin.com/project/umatrix 7 years ago
Raymond Hill de56cfe351
Revert to Fontawesome 4.7 icons
Found out Fonteawesome 5 is a different project than
former Fontawesome (of which 4.7 is latest).

See https://github.com/uBlockOrigin/uBlock-issues/issues/249#issuecomment-448587658
7 years ago
Raymond Hill 5ed6a9703c re-phrase as suggested on https://crowdin.com/project/umatrix 7 years ago
Raymond Hill f94f0010b6 import translation work from https://crowdin.com/project/umatrix 7 years ago
Raymond Hill 9a6b1c2c9c address remaining quirks (see https://github.com/uBlockOrigin/uMatrix-issues/issues/62#issuecomment-428594617) 7 years ago
Raymond Hill 0f7c82a2d9
fix obsolete comment 7 years ago
Raymond Hill b71eed544f
make Firefox dev build auto-update 7 years ago
Raymond Hill 68e8d96b57
import translation work from https://crowdin.com/project/umatrix 7 years ago
Raymond Hill 073500ca81
new revision for release candidate 7 years ago
Raymond Hill 494cd9e95c
fix https://github.com/uBlockOrigin/uMatrix-issues/issues/72 7 years ago
Raymond Hill ae894fb571
make Firefox dev build auto-update 7 years ago
Raymond Hill 60da12b0ef
import translation work from https://crowdin.com/project/umatrix 7 years ago
Raymond Hill 5e86922100
new revision for release candidate 7 years ago
Raymond Hill 6dcc90c639
fix tooltip quirk in popup panel; add visual hint in logger for tab-less requests 7 years ago
Raymond Hill 45be8d04e3
make Firefox dev build auto-update 7 years ago
Raymond Hill 9bbfed8d37
new revision for dev build 7 years ago
Raymond Hill 5b1287d2de
use separate CSS file for styles 7 years ago
Raymond Hill 886664abd4
fix https://github.com/uBlockOrigin/uMatrix-issues/issues/59 and other unrelated quirks
Unrelated quirks:

- missing icons for magnifier (because https://github.com/uBlockOrigin/uMatrix-issues/issues/68)
- missing i18n string
- use separate file for CSS styles
7 years ago
Raymond Hill 495dddc389
fix https://github.com/uBlockOrigin/uMatrix-issues/issues/70 7 years ago
Raymond Hill b822ae72d9
fix https://github.com/uBlockOrigin/uMatrix-issues/issues/68 7 years ago
Raymond Hill 742fba96f0
make Firefox dev build auto-update 7 years ago
Raymond Hill 8eb17934b0
new revision for dev build 7 years ago
Raymond Hill 605368a6e2
import translation work from https://crowdin.com/project/umatrix 7 years ago
Raymond Hill 52246a5250
convert popup panel icons (https://github.com/uBlockOrigin/uMatrix-issues/issues/68) 7 years ago
Raymond Hill 3ce484688a
add generic support for icon badge (https://github.com/uBlockOrigin/uMatrix-issues/issues/68) 7 years ago
Raymond Hill ec7accc32c
fix icon invisible badge on Firefox (https://github.com/uBlockOrigin/uMatrix-issues/issues/68) 7 years ago
Raymond Hill 495c2bc916
make Firefox dev build auto-update 7 years ago
Raymond Hill 62a7d8f30f
new revision for dev build 7 years ago
Raymond Hill c6e29be792
bring back popup panel access from logger
Popup panel is now tab selector-bound, rather than logger
entry-bound.

Additonally, start migrating toward svg-based icons rather than
font-based icons.
7 years ago
Raymond Hill fc0bb7a35c
fix reload button (regression from 2256552899) 7 years ago
Raymond Hill 77a7b8febe
code review: fix quirks introduced with 2256552899 7 years ago
Raymond Hill 7c63d2b03d
make Firefox dev build auto-update 7 years ago
Raymond Hill 136c434b4d
new revision for dev build 7 years ago
Raymond Hill efa0085a67
fix scope selector for "base-domainless" hostnames 7 years ago
Raymond Hill 9432e3b6eb
make Firefox dev build auto-update 7 years ago
Raymond Hill 7c73664fc8
new revision for dev build 7 years ago
Raymond Hill 228e326111
import translation work from https://crowdin.com/project/umatrix 7 years ago
Raymond Hill 6b8be2ca43
add partiness column in logger 7 years ago
Raymond Hill 2256552899
fix https://github.com/gorhill/uMatrix/issues/951, https://github.com/uBlockOrigin/uMatrix-issues/issues/62 7 years ago
Raymond Hill cb2ab59297
make Firefox dev build auto-update 7 years ago
Raymond Hill 934d497ef5
new revision for dev build 7 years ago
Raymond Hill e02360f096
remove sidebar support for stable build; prevent sidebar opening at install for dev build 7 years ago
Raymond Hill d42abee957
fix https://github.com/uBlockOrigin/uMatrix-issues/issues/64 by importing CodeMirror 5.40.2 7 years ago
Raymond Hill 956b79816b
make Firefox dev build auto-update 7 years ago
Raymond Hill 7328a46086
new revision for dev build 7 years ago
Raymond Hill 8ed8666e77
fix https://github.com/uBlockOrigin/uMatrix-issues/issues/63 7 years ago
Raymond Hill db7feed9c5
make Firefox dev build auto-update 7 years ago
Raymond Hill 6699e5c56f
import translation work from https://crowdin.com/project/umatrix 7 years ago
Raymond Hill 017c167ea9
new revision for dev build 7 years ago
Raymond Hill f075f96c58
fix #589: use DOM-based CSP directive (idea from 6e80d3f130) 7 years ago
Raymond Hill 7f3122c5fd
improve workaround for https://github.com/uBlockOrigin/uMatrix-issues/issues/57: lower minimum text size value 7 years ago
Raymond Hill be19816f33
make Firefox dev build auto-update 7 years ago
Raymond Hill 1221431f44
new revision for dev build 7 years ago
Raymond Hill 12a471c3c5
fix regression from fix to https://github.com/uBlockOrigin/uMatrix-issues/issues/53 7 years ago
Raymond Hill cc0bed69bf
fix version parsing 7 years ago
Raymond Hill 0f5a155e4f
make Firefox dev build auto-update 7 years ago
Raymond Hill 66ec464b66
new revision for dev build 7 years ago
Raymond Hill 943d1084d4
import translation from https://crowdin.com/project/umatrix 7 years ago
Raymond Hill bb29ad2c34
fix https://github.com/uBlockOrigin/uMatrix-issues/issues/53 7 years ago
Raymond Hill b724a6356a
import translation work from https://crowdin.com/project/umatrix 7 years ago
Raymond Hill 0ae91ed00f
new revision for stable release 7 years ago
Raymond Hill a7753fd356
rename "webext" target to "firefox" 7 years ago
Raymond Hill a0c72fc302
removing unsupported firefox/legacy platform 7 years ago
Raymond Hill 28d50f2347
make Firefox dev build auto-update 7 years ago
Raymond Hill 3795b99fc5
possible fix for https://www.reddit.com/r/uMatrix/comments/8lc9ia/ 7 years ago
Raymond Hill 4b4db46663
new revision for dev build 7 years ago
Raymond Hill 637c0e42f1
make Firefox dev build auto-update 7 years ago
Raymond Hill 73891f217d
new revision for dev build 7 years ago
Raymond Hill e6b1648f53
Merge branch 'master' of https://github.com/gorhill/uMatrix 7 years ago
Raymond Hill b53d1be672
fix #992 7 years ago
Saitama d22981dfbe Added vivaldi-scheme (#1004) 8 years ago
Raymond Hill 5c3e8c6863
Update someonewhocares.org to use HTTPS (#1003)
http requests to someonewhocares.org now responds with 302 redirects to the secure version - so just use the https version to start with
8 years ago
Saitama a68f7a7899 µ to u (#1002) 8 years ago
Raymond Hill 322d689f8b
new revision for stable release 8 years ago
Raymond Hill 9693ea9e96
make Firefox dev build auto-update 8 years ago
Raymond Hill fbf3f1f263
new revision for release candidate 8 years ago
Raymond Hill 3f8794dd89
Code review for 18490b9bf8
- Use a time offset to ensure value fit in a int32
- Also, fix potential false positives re. blocked image placeholders
8 years ago
Raymond Hill 4284a57b4e
make Firefox dev build auto-update 8 years ago
Raymond Hill e1173fc0fd
new revision for release candidate 8 years ago
Raymond Hill 18490b9bf8
fix https://github.com/uBlockOrigin/uMatrix-issues/issues/28 8 years ago
Raymond Hill 2714193b73
Use "development build" instead of "dev build" before Chrome store complains 8 years ago
Raymond Hill 1930844e68
make Firefox dev build auto-update 8 years ago
Raymond Hill 297c2a3b35
new revision for dev build 8 years ago
Raymond Hill 46669115dc
code review: various fixes
- Ensure REFERER spoofing is always reported in logger
- Fixed possible exception thrown when asynchronously reporting cookies
8 years ago
Raymond Hill 18ecb90bd0
new revision for stable release 8 years ago
Raymond Hill c1bbf7b199
import translation work from https://crowdin.com/project/umatrix 8 years ago
Raymond Hill 925b3bdcc9
make Firefox dev build auto-update 8 years ago
Raymond Hill 94e4bdd9d6
new revision for dev build 8 years ago
Raymond Hill 8da0dcd84f
fix https://github.com/uBlockOrigin/uMatrix-issues/issues/9 8 years ago
Saitama d1afcd2e9e Updated few things in descriptions.txt (#1000)
* Updated few things

* minor correction

* minor grammatical mistake
8 years ago
Raymond Hill cd4fc2596e
update py scripts to publish in AMO/CWS 8 years ago
Raymond Hill 00e62b48be
make Firefox dev build auto-update 8 years ago
Raymond Hill bd7e864950
moving update template to more appropriate location 8 years ago
Raymond Hill abfe7a8037
import translation work from https://crowdin.com/project/umatrix 8 years ago
Raymond Hill ffcd211dcc
new revision for dev build 8 years ago
Raymond Hill 2d97fafbe8
Merge branch 'master' of https://github.com/gorhill/uMatrix 8 years ago
Raymond Hill aba697f2f0
fix https://github.com/uBlockOrigin/uMatrix-issues/issues/8 8 years ago
Saitama 4564ee3b6d Update Issue Tracker link in conjunction with uBO (#999)
* Update Issue Tracker in conjunction with uBO

* Update Issue tracker title and description

Update Issue tracker title and description in conjunction with uBO
8 years ago
Raymond Hill e768b78b73
import translation work from https://crowdin.com/project/umatrix 8 years ago
Raymond Hill b1d51861e5
new revision for stable release 8 years ago
Raymond Hill 14bcb5ed56
make Firefox dev build auto-update 8 years ago
Raymond Hill 9fa2777589
new revision for release candidate 8 years ago
Raymond Hill 41bec3b53e
import translation work from https://crowdin.com/project/umatrix 8 years ago
Raymond Hill 6958c4ed26
fix 1p recipes returned as 3p ones; preserve & show comments 8 years ago
Raymond Hill b793312143
Update README.md 8 years ago
Raymond Hill b986ff5565
Update README.md 8 years ago
Raymond Hill 97bb075cf1
Update ISSUE_TEMPLATE.md 8 years ago
Saitama 18aa29860c Update Permissions with the correct link (#997) 8 years ago
Raymond Hill fc80b2c581
Update CONTRIBUTING.md 8 years ago
Raymond Hill 4f1c7dd671
Update CONTRIBUTING.md 8 years ago
Raymond Hill 72b89e83e6
Update CONTRIBUTING.md 8 years ago
Raymond Hill 89aed08b4f
Update CONTRIBUTING.md 8 years ago
Raymond Hill a3812d52be
make Firefox dev build auto-update 8 years ago
Raymond Hill a7eeb40e13
new revision for dev build 8 years ago
Raymond Hill fe995d2bc8
fix #995, #945; other minor fixes; opportunistic code review 8 years ago
Raymond Hill 762de2aecd
make Firefox dev build auto-update 8 years ago
Raymond Hill 98e012599c
code review: attempt to lookup actual tab id of behind-the-scene requests 8 years ago
Raymond Hill 06436c61fc
code review: typos 8 years ago
Raymond Hill b627b62f6c
make Firefox dev build auto-update 8 years ago
Raymond Hill 7a1cb53c04
import translation work from https://crowdin.com/project/umatrix 8 years ago
Raymond Hill f45361fa56
new revision for dev build 8 years ago
Raymond Hill 31cc15ca6c
lots of informal fixes
- us integer tab id -- do not stringify anymore
- improved the parsing of hosts files
- better handling of behind-the-scene network requests when a
  context is provided by the webRequest API
- imported webextFlavor code from uBO
- converted instances of object-as-dict to Map()
8 years ago
Raymond Hill dd5a3a807c
fix https://www.reddit.com/r/uMatrix/comments/8atw04/2bc8_and_2bc6_characters_are_not_available_in/ 8 years ago
Raymond Hill 455155c635
make Firefox dev build auto-update 8 years ago
Raymond Hill 872975656c
new revision for dev build 8 years ago
Raymond Hill 62d06792f1
fix #990 8 years ago
Raymond Hill fde72e4f2a
make Firefox dev build auto-update 8 years ago
Raymond Hill d4d97d018c
new revision for dev build 8 years ago
Raymond Hill eb3a43a71c
new revision for stable release 8 years ago
Raymond Hill 1225405d8e
import translation work from https://crowdin.com/project/umatrix 8 years ago
Raymond Hill 5b86e2901e
make Firefox dev build auto-update 8 years ago
Raymond Hill 2c2f0f8f03
new revision for dev build 8 years ago
Raymond Hill 5dd6564b6a
move the recipe icon to a more suitable position 8 years ago
Raymond Hill fbfce62582
import translation work from https://github.com/gorhill/uMatrix 8 years ago
Raymond Hill 8741f7ee8e
make Firefox dev build auto-update 8 years ago
Raymond Hill 13451a3a4f
new revision for dev build 8 years ago
Raymond Hill 9fd6bdfddd
avoid over-reporting of cookies
Limit each distinct cookie to be reported at most
once a second. Sometimes a cookie's value can
be changed many times a second and it's not useful
to report every single instance of these
changes -- this just pollute both the badge
counter and the logger output.
8 years ago
Raymond Hill 7c0fd0c9b3
make Firefox dev build auto-update 8 years ago
Raymond Hill 591483d07e
import translation work from https://crowdin.com/project/umatrix 8 years ago
Raymond Hill 9d95bbe9b6
new revision for dev build 8 years ago
Raymond Hill 9b9d7e586f
fix #967 8 years ago
Raymond Hill 3935b8417b
make Firefox dev build auto-update 8 years ago
Raymond Hill d9251ce00b
new revision for dev build 8 years ago
Raymond Hill d2a0de861b
import translation work from https://crowdin.com/project/umatrix 8 years ago
Raymond Hill 24289831c2
polish recipe-related code, user interface 8 years ago
Raymond Hill 707fd92307
remove unused strings 8 years ago
Raymond Hill c8c8430993
make Firefox dev build auto-update 8 years ago
Raymond Hill 8fa12d8d7e
new revision for dev build 8 years ago
Raymond Hill a976bd0d22
fix cleaning script 8 years ago
Raymond Hill d825b5562e
integrate CodeMirror's MergeView to the 'My rules' pane 8 years ago
Raymond Hill 747748c9ba
remove unused code 8 years ago
Raymond Hill 4b368c407b
Update README.md 8 years ago
Raymond Hill b6d47f9e86
Update README.md 8 years ago
Raymond Hill a52ea23121
import translation work from https://crowdin.com/project/umatrix 8 years ago
Raymond Hill 6e119fbaaf
new revision for stable release 8 years ago
Raymond Hill 8e48dd18ba
add script to automate signing/publishing of slef-hosted Firefox version 8 years ago
Raymond Hill b4ce23f15e
make Firefox dev build auto-update 8 years ago
Raymond Hill 1470cf12bc
new revision for dev build 8 years ago
Raymond Hill 702fbba914
add changes needed for self-hosted signed beta version 8 years ago
Raymond Hill 08a0cdc218
fix #954 8 years ago
Raymond Hill 45ed6a7e25
import translation work from https://crowdin.com/project/umatrix 8 years ago
Raymond Hill f35b230c37
new revision for dev build 8 years ago
Raymond Hill fb4e07f107
fix regression reported at https://www.wilderssecurity.com/threads/umatrix-the-http-switchboard-successor.369601/page-27#post-2737419 8 years ago
Raymond Hill 429af12aa2
import translation work from https://crowdin.com/project/umatrix 8 years ago
Raymond Hill 4947019dbb
new revision for dev build 8 years ago
Miguel de Moura 2f0f038668 Update hyperlink auditing HTML spec url (#942) 8 years ago
Raymond Hill 51a68683f8
code review: fix error at extension console; allow recipes to override explicit rules 8 years ago
Raymond Hill 4e00e6e3b0
new revision for dev build 8 years ago
Raymond Hill 860e9185cd
add support for: switch-based rules; entity in source part of condition 8 years ago
Raymond Hill 21c9480965
import translation work from https://crowdin.com/project/umatrix 8 years ago
Raymond Hill 858ee6df69
new revision for dev build 8 years ago
Raymond Hill 335709bc50
fix #940 8 years ago
Raymond Hill 55b9f1c645
add contributor mode and tools to contribute ruleset recipes (need more) 8 years ago
Raymond Hill a88a301d81
import translation work from https://crowdin.com/project/umatrix 8 years ago
Raymond Hill 91cbd94ba7
new revision or dev build 8 years ago
Raymond Hill 749e8d5cc4
improve backup file output for rules: array instead of one huge string 8 years ago
Raymond Hill 1a5d7e400d
fix backward compatibility of restore from backup feature 8 years ago
Raymond Hill b5c377ec73
new revision for dev build 8 years ago
Raymond Hill 931a44ee9d
import translation work from https://crowdin.com/project/umatrix 8 years ago
Raymond Hill 01216b9520
code review: also take into account modifications to http headers 8 years ago
Raymond Hill 82ed807bd2
fix #938: show badge by default for new users 8 years ago
Raymond Hill ebfe08e0a2
fix #938 8 years ago
Raymond Hill b963ccb778
code review: simplify PSL selfie generator 8 years ago
Raymond Hill c2a46c5da4
add tooltip for global scope + setting to disable tooltips (see https://github.com/gorhill/uMatrix/issues/936#issuecomment-361936827) 8 years ago
Raymond Hill d0a41e09d0
remove more trailing periods as per https://github.com/gorhill/uMatrix/issues/30#issuecomment-361923994 8 years ago
Raymond Hill c90ce95f59
import translation work from https://crowdin.com/project/umatrix 8 years ago
Raymond Hill 00df01f633
new revision for dev build 8 years ago
Raymond Hill 081dbf8541
add space after newline: Firefox does not render newlines for placeholders 8 years ago
Raymond Hill e9e5aa295c
fix #935 8 years ago
Raymond Hill b8c4eadc7a
remove spurious trailing periods (https://github.com/gorhill/uMatrix/issues/30#issuecomment-361635820) 8 years ago
Raymond Hill 7b88cef36d
new revision for dev build 8 years ago
Raymond Hill 4ea5334275
import translation work from https://crowdin.com/project/umatrix 8 years ago
Raymond Hill 3e4e1d9def
new revision for dev build 8 years ago
Raymond Hill 2cf4a57bf4
first draft toward fixing #30 8 years ago
Raymond Hill bf4f3e71d3
add 1st recipe file to updatable assets 8 years ago
Raymond Hill 1867635e0d
code review: fix updating of non-hosts resources 8 years ago
Raymond Hill 6207e35a1e
fix #928 8 years ago
Raymond Hill 44a1f6da0d
new revision for bug fixes 8 years ago
Raymond Hill 6abc89dfd5
fix #924 8 years ago
Raymond Hill b8c0089a1a
new revision for release 8 years ago
Raymond Hill 1be2f40eae
move 3rd-party assets management to uBlockOrigin/uAssets 8 years ago
Raymond Hill a9799b70bc
code review for aafb85c6c62a: use `contentType`, `instanceof document` is unreliable on Firefox 8 years ago
Raymond Hill 785b430263
new revision for release candidate 8 years ago
Raymond Hill aafb85c6c6
fix https://bugzilla.mozilla.org/show_bug.cgi?id=1392090#c18 8 years ago
Raymond Hill eeb890000b
import translation work from https://crowdin.com/project/umatrix 8 years ago
Raymond Hill 6485c2e035
new revision for release candidate 8 years ago
Raymond Hill c89a4cfe5e
use worker-src on Firefox 58+ -- turns out this was fixed weeks ago 8 years ago
Raymond Hill 08275aa527
code review: mind inline styles too 8 years ago
Raymond Hill 328f9695d8
add ability to vertically expand a specific row 8 years ago
Raymond Hill 7dac50008a
remove unecessary padding 8 years ago
Raymond Hill f680fc004c
new revision for release candidate 8 years ago
Raymond Hill c3957d3979
import translation work from https://crowdin.com/project/umatrix 8 years ago
Raymond Hill a8ac21ced0
new revision for release candidate 8 years ago
Raymond Hill 3435f4f444
Merge branch 'master' of https://github.com/gorhill/uMatrix 8 years ago
Raymond Hill 1228ee55d6
add mitigation for #912 8 years ago
y. mise 93d827c63a Add store description for Japanese (#908)
Store description is translated into Japanese. This is based on latest
description.txt.
8 years ago
Raymond Hill 2aeb7696c3
fix https://github.com/gorhill/uBlock/issues/3416 8 years ago
Raymond Hill e8772404c7
new revision for dev build 8 years ago
Raymond Hill f1d0e7a3b1
fix cloud race condition as in 178b82eb6a 8 years ago
Raymond Hill d766209ab5
import translation work from https://crowdin.com/project/umatrix 8 years ago
Raymond Hill b2e760f40d
fix #904, #436 8 years ago
Raymond Hill ed8556a9fe
add logger-in-sidebar support for Opera 8 years ago
Raymond Hill 533d24b4be
new revision for release 8 years ago
Raymond Hill 6e273545a4
import translation work from https://crowdin.com/project/umatrix 8 years ago
Raymond Hill c5f90a9cae
use translated string for sidebar name 8 years ago
Raymond Hill 32819b5cca
new revision for dev build 8 years ago
Raymond Hill cfaed1e490
add ability to open the logger in sidebar 8 years ago
Raymond Hill 171552370a
ensure image placeholders' min width can take effect 8 years ago
Raymond Hill 2a2685ff84
new revision for dev build 8 years ago
Raymond Hill 6df5e5212c
code review following feedback: 821e45751a (commitcomment-26587989) 8 years ago
Raymond Hill 35ddcc80eb
code review: giving more thoughts to reporting CSP violations 8 years ago
Raymond Hill 60cd27c347
code review for 821e45751a2dff18: simplify 8 years ago
Raymond Hill 62f48a15ff
new revision for dev build 8 years ago
Raymond Hill 821e45751a
reliably report web worker and inline script presence 8 years ago
Raymond Hill b870757e94
use non-locale-specific URI 8 years ago
Raymond Hill 6ecea191b4
put back space: turns out it's needed for detection 8 years ago
Raymond Hill 2d14874d69
code review for deeb211c5d 8 years ago
Raymond Hill c96fbb4d5c
new revision for dev build 8 years ago
Raymond Hill 1b1d3ad728
add ability to block web workers on a per-site basis 8 years ago
Raymond Hill deeb211c5d
add ability to block web workers on a per-site basis 8 years ago
Raymond Hill 52139a9137
remove localhost `allow` rule from default ruleset 8 years ago
Raymond Hill 6d85d53868
Merge branch 'master' of https://github.com/gorhill/uMatrix 8 years ago
Raymond Hill aef92a21ef
import translation work from https://crowdin.com/project/umatrix 8 years ago
calibrations 204aaae213 Fix and update legacy firefox vapi-client in the style of fa2658c (#900)
* Minimal refactor of vapi-client to get firefox version working

* Move messagingConnector into vAPI.messaging

* Improve vAPI.messaging setup and connecting

* Shutdown-related changes, implement remaining missing functions
8 years ago
Raymond Hill 2b02690b93
code review: fix size of toggle button background 8 years ago
Raymond Hill c1494d719a
new revision for dev build 8 years ago
Raymond Hill af94a80c59
fix html entities 8 years ago
Raymond Hill 19c32608f3
add visual cue to hint at relevance of per-scope switches 8 years ago
Raymond Hill dba034fd90
address #853 8 years ago
Raymond Hill 2c262d1198
import translation work from https://crowdin.com/project/umatrix 8 years ago
Raymond Hill 9d1b89a0c1
fine tune rendering of slider 8 years ago
Raymond Hill 36e7c874cd
fix #479 8 years ago
Raymond Hill 748891a094
import translation work from https://crowdin.com/project/umatrix 8 years ago
Raymond Hill 3a6f550223
code review: be case-insensitive, "URL=" is also used sometimes 8 years ago
Raymond Hill 12630e8a8a
new revision for dev build 8 years ago
Raymond Hill f459f67e72
fix regression: ability to toggle per-scope switches 8 years ago
Raymond Hill 6581071b01
prevent hostname labels from wrapping 8 years ago
Raymond Hill eebf2c7d32
new revision for dev build 8 years ago
Raymond Hill 157045924b
fine tune various UI aspects
- more choices of matrix text size
- more accurate wording for matrix switches
- info links for various matrix switches
8 years ago
Raymond Hill c1325d06b7
new revision for release candidate 8 years ago
Raymond Hill fc24d902ad
import translation work from https://crowdin.com/project/umatrix 8 years ago
Raymond Hill dd14e13db9
Merge branch 'master' of https://github.com/gorhill/uMatrix 8 years ago
Raymond Hill 298dac337c
better defaults for new installation 8 years ago
Raymond Hill 9724cb0013
Update ISSUE_TEMPLATE.md 8 years ago
Raymond Hill c82fab635c
import translation work from https://crowdin.com/project/umatrix 8 years ago
Raymond Hill b35aa272d5
better translate NoScript whitelist directives into uMatrix rules 8 years ago
Raymond Hill 23cefde335
code review: better importing from RP/NS 8 years ago
Raymond Hill 111d44b7cb
new revision for release candidate 8 years ago
Raymond Hill 43630426ff
Merge pull request #879 from xofe/settings-fix
Fix noscript spoof setting not being saved on change
8 years ago
xofe 613bab0a9d fix noscript setting not being saved on change (regression from 73c8da05b7) 8 years ago
Raymond Hill 3b77c0732e
import translation work from https://crowdin.com/project/umatrix 8 years ago
Raymond Hill 4b5cd19396
new revision for release candidate 8 years ago
gorhill 8e073579f6
fix #485 8 years ago
gorhill 05a312f6d0
fix #621 8 years ago
gorhill 2016e28ee5
move support to https://www.reddit.com/r/uMatrix/ 8 years ago
gorhill dfb4127583
new revision for dev build 8 years ago
gorhill 8608b29ded
fix ##773 + added logger output for CSP modification 8 years ago
gorhill 72a9fbf267
new revision for dev build 8 years ago
gorhill e30f189a19
import translation work from https://crowdin.com/project/umatrix 8 years ago
gorhill c4c0d450fd
code review of request headers processing code
- drop needless overhead now that legacy support is dropped
- output extra information about the headers which are
  modified and their value before/after modification
8 years ago
gorhill ff5789d4ac
minor code review 8 years ago
gorhill 1e9f728a3b
new revision for dev build 8 years ago
gorhill b7127541a3
finally complete fix for #319 8 years ago
gorhill 038b047116
import translation work from https://crowdin.com/project/umatrix 8 years ago
gorhill 73c8da05b7
Fix #335
Additionally, performance improvements:
- Reduce overhead of collapsing elements
  (see https://github.com/gorhill/uBlock/issues/2839)
- Cache decomposition of source hostname when matrix-filtering

Also, various code review.
8 years ago
gorhill 8615f3b804
help with #872: reduce occurrences of "no tab found" cases 8 years ago
gorhill fa2658cd2b
import message handling code from uBO, simplify for uMatrix 8 years ago
gorhill 16eceedbf5
new revision for stable release 8 years ago
gorhill 776fda15a0
Merge branch 'master' of https://github.com/gorhill/uMatrix 8 years ago
gorhill a5a69c2fdf
code review: mind rtl languages 8 years ago
gorhill da20f49c59
code review: mind ltr languages 8 years ago
gorhill cadd9c751d
code review for #319: ensure valid URL 8 years ago
gorhill c983d47c8e
new revision for release candidate 8 years ago
gorhill 91db7e4a84
import translation work from https://crowdin.com/project/umatrix 8 years ago
gorhill e278a7d4e3
further address #853 8 years ago
gorhill a90e5cc7b4
finalize fix to #319 -- redirect if meta/refresh found in noscript tags 8 years ago
gorhill 5c340e85e8
set minimum chromium version to 45 8 years ago
gorhill 3ff2926871
fix #840 (need confirmation) 8 years ago
gorhill 8660d35dcf
new revision for release candidate 8 years ago
gorhill 25128992b1
important translation work from https://crowdin.com/project/umatrix 8 years ago
Raymond Hill 3059d15c17
Update ISSUE_TEMPLATE.md 8 years ago
Raymond Hill f80c8b8141
Update ISSUE_TEMPLATE.md 8 years ago
gorhill 23047bc23c
import translation work from https://crowdin.com/project/umatrix 8 years ago
gorhill 3292b030ce
new revision for release candidate 8 years ago
gorhill 9e2dd8108c
code review: further simplifying; jshint-ing 8 years ago
gorhill 6e15dba281
improve jshint-ing 8 years ago
gorhill 4b32e8b4d3
code review: fix spurious change in last commit 8 years ago
gorhill 6a10411f6a
new revision for dev build 8 years ago
gorhill a38a8d9c59
Merge branch 'master' of https://github.com/gorhill/uMatrix 8 years ago
gorhill ebac131247
code review: simplify code for counting distinct URLs 8 years ago
Raymond Hill 6f8a30c0e3
Update README.md 8 years ago
gorhill 67e7c8a5bf
import translation work from https://crowdin.com/project/umatrix 8 years ago
gorhill c05f9fe9c9
new revision for dev build 8 years ago
gorhill 3f8168ce0b
fix #502 8 years ago
gorhill 773fe2da59
new revision for dev build 8 years ago
gorhill a4ad3a4ea9
put back ability for "owner" of popup panel to resize it (regression from 878d4fa6d5) 8 years ago
gorhill 39b2f1ddac
add ability to create properly labelled dev build for chromium 8 years ago
gorhill d048ba15cb
import translation work from https://crowdin.com/project/umatrix 8 years ago
gorhill 0207c91312
enable ability to detach the logger (same as uBO) 8 years ago
gorhill 6aa8c856cf
code review: no need for try-catch, a dummy localStorage is created if none exists 8 years ago
gorhill 03120f8dd9
code review: avoid using innerHTML 8 years ago
gorhill fa95f964de
code review: simplify needlessly complicated logger buffering code 8 years ago
gorhill 29a59808ab
new revision for dev build 8 years ago
gorhill 43df802cff
fix #232 8 years ago
gorhill db30e572db
import translation work from https://crowdin.com/project/umatrix 8 years ago
gorhill 9d43f929bc
Revive formerly removed <noscript> tag spoofing code
Also:
- a new per-scope switch has been added to control <noscript> spoofing on
  a per site basis
- a global setting to be used as the default state of the <noscript>
  spoofing switch
- Privacy pane has been merged into Setting pane
8 years ago
gorhill b5d94c708d
Merge branch 'master' of https://github.com/gorhill/uMatrix 8 years ago
gorhill 357b44c265
[corrected commit message] code review of ad9d591b1666: remove more obsolete code 8 years ago
gorhill 6f7d793abd
code review of 88853070a1a4: remove obsolete code 8 years ago
gorhill ad9d591b16
Fix #118, #271, #649, #771: removing flawed-at-the-core UA spoofer
The end result of the flawed UA spoofer was to accomplish the
OPPOSITE of the intended goal. UA spoofing for privacy purpose
turns out to be a whole complicated task on its own, and is
best undertaken as a separate dedicated extension -- assuming
it is possible at all.

In any case, this had no place in a "Privacy" section in uMatrix,
this was a bad idea to create this feature in the first place. It's
never too late to correct a bad idea, and this is the purpose of
this commit.
8 years ago
gorhill ec5faf04f8
new revision for dev build 8 years ago
gorhill c095b722fc
import translation work from https://crowdin.com/project/umatrix 8 years ago
gorhill 040812d813
code review of 28d2f0b66e 8 years ago
gorhill 5b8bcb1a9a
remove obsolete indexedDB transition-related code 8 years ago
gorhill 28d2f0b66e
fix #852 8 years ago
gorhill 65d62ec379
code review of e9968713e4 8 years ago
gorhill e9968713e4
work toward resolving #853 8 years ago
gorhill c090fa175e
import translation work from https://crowdin.com/project/umatrix 8 years ago
gorhill 537f8ef79a
work toward resolving #853 8 years ago
gorhill 07eb60abc6
new stable release revision 8 years ago
gorhill f2bb21f129
properly set global scope visual when default scope is global 8 years ago
gorhill 9d6d27ae21
import translation work from https://crowdin.com/project/umatrix 8 years ago
gorhill b4112d5641 list changed files after import 8 years ago
gorhill 2ddde65a57 import translation work from https://crowdin.com/project/umatrix 8 years ago
gorhill 706fa4fca4 import translation work from https://crowdin.com/project/umatrix 8 years ago
gorhill a4d2ca6935 new revision for release candidate 8 years ago
gorhill d9cd957f4d highlight on hove only if it would result in a scope change 8 years ago
gorhill ac7870280a new revision for dev build 8 years ago
Raymond Hill 6e729c517d
Merge pull request #841 from shub-nougat/scopes-hover
Scopes hover
8 years ago
Raymond Hill 0cd3073134
Merge pull request #843 from PenguinDad/patch-1
Fix color-blind friendly mode
8 years ago
PenguinDad 284b26abf4
Fix color-blind friendly mode 8 years ago
shub-nougat 113cd638f5 highlight global scope for consistency 8 years ago
shub-nougat 3755655239 highlight scopes which are subject to toggle 8 years ago
gorhill 040b2a3d7f new revision for dev build 8 years ago
gorhill 2f2fea617b import translation work from https://crowdin.com/project/umatrix 8 years ago
gorhill 1825b65d4c various visual fixes 8 years ago
gorhill 0a43c6fedd fix minor rendering issue in popup panel on small viewports 8 years ago
gorhill 170a665d4a important translation work from https://crowdin.com/project/umatrix 8 years ago
Raymond Hill 11a47c189c
Merge pull request #838 from xofe/remove-unused-resources
Remove some unused resources (holdovers from HTTPSB)
8 years ago
Raymond Hill d3e789f5da
Merge pull request #839 from xofe/minor-fixes
Minor fixes
8 years ago
gorhill 068ffe6c9a trashcan instead of X to remove an imported list 8 years ago
xofe a36042b5ce webext: fix options_ui.js removal + remove unused options_ui.html
per ec3d1bfc88
8 years ago
xofe d9bfbb5525 firefox: only copy polyfill.js + vapi-*.js to js directory (other js files only needed in root dir of package) 8 years ago
xofe cacdb07a6e add favicon to dashboard/logger (fix #627) + add i18n for logger title 8 years ago
gorhill 396f4fc78e avoid CPU-costly Date.toLocale(Date|Time)String() in logger page
source:
* 02a79ea9fc
* 235d1266e8
* 3b41237e4b
8 years ago
xofe 9adc29318e add missing tooltip for dashboard link (fix #837) 8 years ago
xofe d4c0c1747b fade-in tooltips, like uBO 8 years ago
xofe e6a0379e54 add bottom border to logger toolbar (prevents toolbar blending in to log entries while scrolling) 8 years ago
xofe 5a070388ae remove some unused resources (holdovers from HTTPSB) 8 years ago
gorhill 53c786e73c new revision for dev build 8 years ago
gorhill 6ca45c66b8 hopefully improve UI for mobile devices (#828) 8 years ago
gorhill 06d7612bf5 Merge branch 'master' of https://github.com/gorhill/uMatrix 8 years ago
gorhill ca9229e40c import translation work from https://crowdin.com/project/umatrix 8 years ago
Raymond Hill f2a20688c6
Merge pull request #804 from Neui/native-textarea
Use native textarea when editing user rules
8 years ago
Raymond Hill 3f07dd4094
Merge pull request #800 from Pulsera/master
Commented out unused code
8 years ago
Raymond Hill f8a4630095
Merge pull request #805 from StoyanDimitrov/patch-1
Remove unused l10n string
8 years ago
gorhill ef7b831a82 fix minor glitch causing header row to be under the interactive permission setter 8 years ago
gorhill 083cf4bf46 fix CSS regression: https://github.com/gorhill/uMatrix/issues/821#issuecomment-346461071 8 years ago
gorhill 61ae0d2bee new revision for stable release 8 years ago
gorhill 8deb398675 import translation work from https://crowdin.com/project/umatrix 8 years ago
gorhill 878d4fa6d5 fix small popup panel glitch when first opened + minor cosmetic changes 8 years ago
gorhill 7c5a4b6e71 oops: release candidate revision number 8 years ago
gorhill 054d3a5b2b new revision for release candidate 8 years ago
gorhill d0a91d5f50 import translation work from https://github.com/gorhill/uMatrix 8 years ago
gorhill 364d2985db minor code review 8 years ago
gorhill d7cb45c237 maybe make uMatrix usable on a mobile device 8 years ago
gorhill a699567a61 new revision for dev build 8 years ago
gorhill dd1cb33626 import translation work from https://crowdin.com/project/umatrix 8 years ago
gorhill b1f53a6d09 fix #821 8 years ago
gorhill c4718246ea remove obsolete files 8 years ago
gorhill 0b8291c329 new revision for release candidate 8 years ago
gorhill cdffe16b98 import translation work from https://crowdin.com/project/umatrix 8 years ago
gorhill c2f9d10f71 new revision for dev build 8 years ago
gorhill e8136cb667 fix https://discourse.mozilla.org/t/support-umatrix/5131/158 8 years ago
gorhill 9fd92d2245 new revision for development build 8 years ago
gorhill 6460e5893c minor code review 8 years ago
gorhill 48eb207fa5 import translation work from https://crowdin.com/project/umatrix 8 years ago
gorhill 76639f528a fix #819 8 years ago
gorhill 88912170fc minor edit 8 years ago
gorhill 507c33dc0e drop support of Firefox-legacy 8 years ago
gorhill 404d740305 update issue template 8 years ago
gorhill a15f1fa92e fix #789 8 years ago
gorhill ef09f42af8 new revision for stable release 8 years ago
gorhill bc1ac63af0 issue template 8 years ago
gorhill 5ddffa6c00 new revision for dev build 8 years ago
gorhill e23276b83a add Esperanto; fix Serbian import 8 years ago
gorhill 2692e866dd import translation work from https://crowdin.com/project/umatrix 8 years ago
gorhill 70b4eb0877 fix #612 8 years ago
gorhill 97957b7bc3 fix #807: merging was supported after all 8 years ago
gorhill 9c634ebd45 Merge branch 'master' of https://github.com/gorhill/uMatrix 8 years ago
gorhill ffc44db085 fix #807: cloud-merging not supported 8 years ago
Raymond Hill 00d9f0c003
Update README.md 8 years ago
gorhill 540436fe7f remove webext-hybrid version 8 years ago
gorhill b8121aae79 new revision for stable release 8 years ago
gorhill f2d7d32d1e remove unused legacy code from HTTPSB 8 years ago
StoyanDimitrov 6de0f2b9b9 Remove unused l10n string 8 years ago
Neui 9672465292 Use native textarea when editing user rules
Use native textarea (no color set) when editing temporary user rules.
Improves visibility significantly when eg. using Firefox with a dark GTK theme.
8 years ago
gorhill 893b885b5a AMO validation errors: do not rely on innerHTML 8 years ago
gorhill acf318d83c fix AMO validation errors: innerHTML is forbidden 8 years ago
gorhill 84aa1fd0e6 fix min version number 8 years ago
gorhill 71fd4427cc set webext min version of to FF56 8 years ago
gorhill 08f93ae95a new stable release 8 years ago
gorhill c374ce60c3 new revision for release candidate 8 years ago
gorhill 9eda7bf59c import fix from f1036395f7 8 years ago
gorhill f36735a6b4 new revision for release candidate 8 years ago
gorhill bb84ffaf87 import fix to cloud storage from https://github.com/gorhill/uBlock/issues/3006 8 years ago
gorhill 2fa62e12a1 fix https://github.com/gorhill/uBlock/issues/3057 8 years ago
gorhill b92e03eff6 new revision for dev build 8 years ago
gorhill 406f6473b6 use indexedDB to cache assets: https://bugzilla.mozilla.org/show_bug.cgi?id=1371255#c11 8 years ago
gorhill 5ea59ab7c4 address https://github.com/WaldiPL/webpageScanner/issues/8 8 years ago
gorhill f8a54005bf new revision for release candidate 8 years ago
gorhill b58d09cf02 set proper max version for legacy version 8 years ago
gorhill 2388af05e1 fix http://forums.mozillazine.org/viewtopic.php?p=14763169#p14763169 8 years ago
gorhill c3f4f18115 new revision for dev build 8 years ago
gorhill 37ce825dc1 fix https://github.com/gorhill/uBlock/issues/2824 8 years ago
gorhill 10972a55df fix https://github.com/gorhill/uBlock/issues/2855 9 years ago
gorhill be2ab1bdca translation work from https://crowdin.com/project/umatrix 9 years ago
gorhill dc6a80a77d new revision for dev build 9 years ago
gorhill d7b3841f93 fix https://github.com/gorhill/uBlock/issues/2843 9 years ago
gorhill 08ecc1a241 add pure webext version 9 years ago
gorhill fa7b0777f3 rename more accurately webext version to webext-hybrid 9 years ago
gorhill 68b8baef34 rename more accurately webext version to webext-hybrid 9 years ago
gorhill 275899fd29 set FF56 as max version compatible with legacy version of uMatrix 9 years ago
gorhill df548f1db9 publish webext-hybrid to AOM dev channel 9 years ago
Pulsera 6da5e5e5b2 Commented unused code 9 years ago
gorhill ea16b28e65 fix popup panel width issue when photon disabled [firefox] 9 years ago
gorhill 839c185f5e new revision for dev build 9 years ago
gorhill c74174a3c4 fix https://discourse.mozilla-community.org/t/support-umatrix/5131/40 9 years ago
gorhill 3df27ffbdf fix https://github.com/gorhill/uBlock/issues/2696 9 years ago
Raymond Hill f2bb7df1db Create README.md 9 years ago
gorhill 4135a490ff Merge branch 'master' of https://github.com/gorhill/uMatrix 9 years ago
gorhill 3bff9d2aae new revision for dev build 9 years ago
gorhill cb482d3651 translation work from https://crowdin.com/project/umatrix 9 years ago
Raymond Hill 7730994a79 Update README.md 9 years ago
gorhill 930b6dd820 fix #793 9 years ago
gorhill 4765db4d86 code review: simplify CSP injection code 9 years ago
gorhill 27dea59284 fix #759 9 years ago
gorhill da8cc90ab4 fix visual glitch in recent versions of Chromium 9 years ago
gorhill 754e8213cf code review 6781a98f 9 years ago
gorhill 69a9cd66d1 new revision for dev build 9 years ago
gorhill 6781a98fd6 "fix" #771 9 years ago
gorhill 5922c3fcde fix https://github.com/gorhill/uBlock/issues/2558 9 years ago
gorhill 840bf9564d FF webext does not support chrome.contentSettings API 9 years ago
Raymond Hill 27f9925fd1 Update CONTRIBUTING.md 9 years ago
gorhill 3b48d64ec3 new version 9 years ago
gorhill 57022a410f translation work from https://crowdin.com/project/umatrix 9 years ago
gorhill 7b0cb1b729 remove unused i18n strings 9 years ago
gorhill b07972c526 minor code review 9 years ago
gorhill 35e9417e8f translation work from https://crowdin.com/project/umatrix 9 years ago
gorhill ef172bcf81 use xpi instead of zip for webext 9 years ago
gorhill 40cc80371b new revision for dev build 9 years ago
gorhill 29f0171291 fix timing issue at launch for Pale Moon by importing uBO's code 9 years ago
gorhill 12a6978748 fix https://github.com/gorhill/uBlock/issues/2506 9 years ago
gorhill e8bcc4ca9f fix #752 9 years ago
gorhill 5f77d89db6 fix https://github.com/gorhill/uBlock/issues/2506 9 years ago
gorhill 09abdc1b9f fix https://github.com/gorhill/uBlock/issues/2502#issuecomment-290941686 9 years ago
gorhill 6e8ebd8253 fix #727 9 years ago
gorhill 276a1dfa1b fix https://github.com/gorhill/uBlock/issues/2502#issuecomment-290943606 9 years ago
gorhill d361ee33fc fix https://github.com/gorhill/uBlock/issues/2499 9 years ago
gorhill 96012c6956 new revision for dev build 9 years ago
gorhill 3df7ee9cb1 fix regression bug introduced with 9a99a06c 9 years ago
gorhill 89c5f02d76 fix https://github.com/gorhill/uBlock/issues/2493
Fix by @gijsk, imported from https://github.com/gorhill/uBlock/pull/2497
9 years ago
gorhill 3e5afa025a new revision for dev build 9 years ago
gorhill 8835aceb35 translation work from https://crowdin.com/project/umatrix 9 years ago
gorhill ce97268895 fix #747 9 years ago
gorhill 85255cf195 fix https://bugs.chromium.org/p/project-zero/issues/detail?id=1225&desc=6#c10 9 years ago
gorhill 9a99a06cd4 fix https://bugs.chromium.org/p/project-zero/issues/detail?id=1225&desc=6#c10 9 years ago
gorhill ad4b9b7b00 fix #746 9 years ago
gorhill b1618632f0 forgot to add webext as target 9 years ago
gorhill e0251f55cd new revision for dev build 9 years ago
gorhill 97509f6d03 hybrid webextension for seamless migration from legacy 9 years ago
gorhill 585802510a report raw type in logger instead of normalized type 9 years ago
gorhill c2d7096500 refactor assets management; working webextension version 9 years ago
Raymond Hill a1e84f4978 Update CONTRIBUTING.md 9 years ago
gorhill 357753dc48 new revision for dev build 9 years ago
gorhill da992312f3 fix #711 (will need confirmations) 9 years ago
gorhill 076382caf3 fix #730 9 years ago
gorhill 4b8345bb94 translation work from https://crowdin.com/project/umatrix 9 years ago
gorhill 48d9a0fd26 fix #711 9 years ago
gorhill 1c27c01ac5 new revision for dev build 9 years ago
gorhill 33f2dc27d3 fix https://github.com/gorhill/uBlock/issues/2226 9 years ago
gorhill cc7be90de4 update tool scripts for proper versioning 9 years ago
gorhill 8828c4d5cb proper labelling of column 9 years ago
gorhill bf7acf678a fix #706 9 years ago
gorhill a4fb878b08 fix https://github.com/gorhill/uBlock/issues/2084 for uMatrix 9 years ago
gorhill 09004e0d1e translation work from https://crowdin.com/project/umatrix 9 years ago
gorhill 4ccb9bd0d4 fix uncaught exception 9 years ago
gorhill e68d9bd76e Merge branch 'master' of https://github.com/gorhill/uMatrix 9 years ago
gorhill e451e70fe0 fix #648 9 years ago
Raymond Hill b3941f8a33 Merge pull request #635 from alexeypetrenko/hyperlink_auditing_link
Fixed broken link
9 years ago
Alexey Petrenko 3b5b572f36 Fixed broken link 9 years ago
gorhill 70910fd2aa Merge branch 'master' of https://github.com/gorhill/uMatrix 9 years ago
gorhill af5afd12f2 translation work from https://crowdin.com/project/umatrix 9 years ago
Raymond Hill fb3a259e41 Merge pull request #617 from mathiasrw/patch-1
Correct check for undefined variable
9 years ago
Mathias Rangel Wulff 978c145180 Correct check for undefined variable
The code was comparing the result of `typeof` with a variable named `undefined`

As typeof returns a string it should compare to `'undefined'`
9 years ago
gorhill 3c539f0ec8 fix #604 10 years ago
gorhill fdc9c38f1a Merge branch 'master' of https://github.com/gorhill/uMatrix 10 years ago
gorhill e21f87a5f6 fix #591 10 years ago
Raymond Hill 52ae23c598 Merge pull request #599 from Llamatron2112/patch-1
Added black default color for popup buttons
10 years ago
Llamatron2112 e6bebd4775 Added black default color for popup buttons
On Linux Firefox with dark GTK theme, the three rightmost toolbar icons of the popup can be light gray, or even white some time, this fixes this issue.
10 years ago
gorhill 83b342d4e4 fix #597 + code review + merge media and image 10 years ago
gorhill 6df6794f7a update jshint default settings 10 years ago
gorhill d586c125a6 new revision for dev build 10 years ago
gorhill 8464e3d594 import uBO fix for some behind-the-scene requests in Pale Moon 10 years ago
gorhill 9a26274b11 fix #586 10 years ago
gorhill 2ef2505507 Merge branch 'master' of https://github.com/gorhill/uMatrix 10 years ago
gorhill 5bb96c1b74 release version 10 years ago
Raymond Hill cf4bb059f9 Merge pull request #572 from coffeemakr/allow-json-import-for-noscript
Allow JSON files as import from Noscript
10 years ago
Coffeemakr 12ebb136ba In addition to text files allow json files for import 10 years ago
gorhill 941d710247 fix https://github.com/gorhill/uBlock/issues/1702 10 years ago
gorhill a429b71665 code review re. #554: use channel data when available 10 years ago
gorhill 7f632afe29 code review re. #554
No longer need to evaluate within asyncOnChannelRedirect() since
all is now evaluated at `http-on-modify-request` time.
10 years ago
gorhill c978b2c5e9 code review re. https://bugzilla.mozilla.org/show_bug.cgi?id=1259169 10 years ago
gorhill 144a557ddb fix #561 10 years ago
gorhill 09cf683e1a fix #429 10 years ago
gorhill 73646ed7ce fix #554 10 years ago
gorhill 5fe51be814 this fixes #540 10 years ago
gorhill 4336c5c7c4 new revision for dev build 10 years ago
gorhill 93f963bc6c this fixes #538 10 years ago
gorhill 8f7f184837 this fixes #513 10 years ago
gorhill 2bbf72d9ab forgot to import zh-TW from https://crowdin.com/project/umatrix 10 years ago
gorhill 6b0e438cb5 need to bump revision for Opera build 10 years ago
gorhill 2e3e1ddb5a bring packages up-to-date with available translations 10 years ago
Raymond Hill 61b3978a5d Merge pull request #511 from JustinCheng12345/master
Adding traditional Chinese translation
10 years ago
JustinCheng12345 ddaa4d13fe Adding traditional Chinese translation 10 years ago
gorhill c0821da875 brought up to date with uBO's version 10 years ago
gorhill 65924d1be8 this fixes #489 10 years ago
gorhill 0031a47721 update hosts file locations -- https used where possible 10 years ago
gorhill 17cc720dc1 this addresses #506 10 years ago
gorhill adfc3b2a50 new revision for dev build 10 years ago
gorhill 44c1ddd00a translation work from https://crowdin.com/project/umatrix 10 years ago
gorhill e9e1f7e631 this fixes #489 10 years ago
gorhill 4f63e079bc reverting fix to #441: undesirable side effects on Firefox 10 years ago
Raymond Hill f3b98c9f9c Update CONTRIBUTING.md 10 years ago
Raymond Hill fa740a797d Update CONTRIBUTING.md 10 years ago
Raymond Hill fb1bd28460 Merge pull request #490 from WyohKnott/visualcue
Adding visual cue indicating that a temp rule will be deleted if clicked
10 years ago
WyohKnott c9f7cc1855 Adding visual cue indicating that a temp rule will be deleted if clicked
When clicking a temporary rule that is not in the permanent list, it is
deleted, yet no visual cue indicates this is the intended behaviour. I
initially thought it would commit the line to the permanent rules.

This patch adds a line-through on :hover to signal it.
10 years ago
gorhill 3150395375 new location for Console.jsm 10 years ago
Raymond Hill e206e62a02 Merge pull request #475 from TonnesM/master
L10n for Dutch AMO description
10 years ago
gorhill fbe58341e4 translation work from https://crowdin.com/project/umatrix 10 years ago
Raymond Hill 02a6fffcff Update CONTRIBUTING.md 10 years ago
TonnesM 1229edd1ea L10n for Dutch AMO description 10 years ago
gorhill 87e85fa0da code review: this fix broken pruning code for `domainCache` 10 years ago
gorhill 9cfc2ff6f8 this fixes https://github.com/gorhill/uBlock/issues/763 10 years ago
gorhill 8200c07a7f Merge tag '0.9.3.2' 10 years ago
gorhill 1d08de94fd translation work from https://crowdin.com/project/umatrix 10 years ago
gorhill 2b74a784df Nightly 46.0 is supported 10 years ago
gorhill 2da268f2ad Merge branch 'master' of https://github.com/gorhill/uMatrix 10 years ago
gorhill fc1662e742 Issue #441: code review
(fixed issue number in commit comment)
10 years ago
gorhill b56790799a #1076: code review 10 years ago
Raymond Hill 88c9440359 Merge pull request #441 from KenMacD/scroll
Allow horizontal scrolling.
10 years ago
Kenny MacDermid 9170fc4b96 Allow horizontal scrolling.
Provide a horizontal scrollbar when required, and scroll the
menu header correctly while keeping it fixed vertically.

This allows Chromium users with a `Page zoom` setting to be able to see
the whole matrix.

Closes #440.
10 years ago
Raymond Hill 43e2bf7453 Merge pull request #425 from WoLpH/master
Fixed chrome os x issue with too small popup size (fixes #423)
10 years ago
Rick van Hattem 9b1dda2c45 fixed chrome os x issue with too small popup size (fixes #423) 10 years ago
gorhill 93d28a8e38 this fixes https://github.com/gorhill/uBlock/issues/845 10 years ago
gorhill deecee477d this fixes invalid version number 10 years ago
gorhill f4dd0254aa translation work from https://crowdin.com/project/umatrix 10 years ago
gorhill 1df054d844 update compatible versions 10 years ago
gorhill 6eaa85eee1 this should fix #357, #395 10 years ago
gorhill 72c9429d74 code review for #390 10 years ago
gorhill 8c6413bfe2 new revision 10 years ago
gorhill 7d941d873d Merge branch 'master' of https://github.com/gorhill/uMatrix 10 years ago
gorhill d5e7bc8800 revert fix to #390 as suggested + hopefully also fixes #413 10 years ago
Raymond Hill 96ffb97a34 Update README.md 10 years ago
Raymond Hill 025446fac1 Update README.md 10 years ago
gorhill 15dc2dc1e9 works fine on latest Nightly, SeaMonkey 10 years ago
gorhill c668d4c17a new revision 10 years ago
gorhill 8c6b94e213 this addresses #358 for the time being 10 years ago
gorhill ef2c07e067 updated 3rd-party assets 10 years ago
gorhill 158eb0f45e translation work from https://crowdin.com/project/umatrix 10 years ago
gorhill 8d8f4b22d4 minor code review 10 years ago
gorhill 364c79d9ee this fixes #388 10 years ago
gorhill 6c0c62cc13 this should fix #390 10 years ago
gorhill b279c85afc Merge branch 'master' of https://github.com/gorhill/uMatrix 10 years ago
gorhill d82b455b4e this fixes #388 10 years ago
Raymond Hill ad9fe2a8ee Merge pull request #376 from hexaholic/patch-1
Fix minor mistake in German description
10 years ago
Pedro Hoffmann Alves 4f80239b4b Fix minor mistake in German description 10 years ago
gorhill 66a710359f forgot to commit this in last build -- this fixes #374 10 years ago
gorhill 3eedfd6fbb translation work from https://crowdin.com/project/umatrix 10 years ago
gorhill cf5143e876 this fixes https://github.com/gorhill/uBlock/issues/800#issuecomment-146580443 10 years ago
gorhill 6fdbf9dd94 this addresses #122 10 years ago
gorhill 7d4e569bd6 see if this helps #362 10 years ago
gorhill 3c1419ad3b this addresses https://github.com/gorhill/uBlock/issues/724 10 years ago
gorhill 50189a450f this fixes https://github.com/gorhill/uBlock/issues/640 10 years ago
gorhill 2d7ffc639e default config for jshint 10 years ago
gorhill 16f986860e translation work from https://crowdin.com/project/umatrix 10 years ago
gorhill c03d38a5c6 this fixes #349 10 years ago
gorhill e18782672d this fixes #345 10 years ago
gorhill 3b7130c525 for jshint 10 years ago
gorhill e25d748aa4 translation work from https://crowdin.com/project/umatrix 10 years ago
gorhill f3876463d3 imported cloud storage support from uBlock: user rules supported for now 10 years ago
gorhill 9e4e4943f3 this fixes many strictness warning in browser console 10 years ago
gorhill 7bc684f2b8 translation work from https://crowdin.com/project/umatrix 10 years ago
gorhill 99225e1688 ability to create a dev build for Firefox 10 years ago
gorhill 12c5acd287 this fixes #325 11 years ago
gorhill 2224ece1a5 this fixes #320 11 years ago
gorhill 7b651310b4 this fixes https://github.com/gorhill/uBlock/issues/574 11 years ago
Raymond Hill 85220191c2 Merge pull request #310 from Manouchehri/leak-warning
Warn user about User Agent leaking
11 years ago
David Manouchehri 471c314bed Added warning about User Agent leaking. 11 years ago
gorhill 9bda70293f interim version for dev build 11 years ago
gorhill cfbce5297a translation work from https://crowdin.com/project/umatrix 11 years ago
gorhill 0dcf068b56 new revision 11 years ago
gorhill ae0fdc8d10 this fixes #308 11 years ago
gorhill 98c51dbff4 #301: resize only if necessary 11 years ago
gorhill a8ceaa5dfb to be on the safe side 11 years ago
gorhill a914c01ea9 popup resize: code review 11 years ago
gorhill 479b454307 Hopefully this fixes #301 11 years ago
gorhill d265619145 new version 11 years ago
gorhill ff36607354 even better, just skip completely nsIContentPolicy for FF35+ 11 years ago
gorhill 51d18b4c47 shouldLoad needed only for FF34 and less (no need for sync messaging with e10s) 11 years ago
gorhill 77b0dd8233 translation work from https://crowdin.com/project/umatrix 11 years ago
gorhill 9cd5e959aa code review 11 years ago
gorhill 6c24fe8e2a this fixes scope button height in matrix popup + matrix popup from logger 11 years ago
gorhill bf7762ba0f forgot to import this as well 11 years ago
gorhill 1f4ba9dda9 this extends compatibility to FF-24-34
imported code from uBlock, including legacy toolbar support in 34485a04658ae7d8357dabe5e42b18e3e066a4b9,
which is itself directly based on work from @AlexVallat:
- 620a7d78d1
- d9b23d4f10
- 5ac4ec21e9
11 years ago
gorhill c8765697e1 bring in uBlock's changes to uDom 11 years ago
gorhill fac3e5d055 default about better than custom about 11 years ago
gorhill ee95ccca36 works fine on 42 11 years ago
gorhill fb5cac0455 developers who also contributed to the code base 11 years ago
gorhill e088e9cf70 this should fix #284 11 years ago
gorhill d333eb96ea Merge branch 'master' of https://github.com/gorhill/uMatrix 11 years ago
gorhill e543517500 this fixes #291 11 years ago
Raymond Hill 3c41bfcb12 Merge pull request #285 from johnkeeping/export-text-file
Add trailing newline to exported rules file
11 years ago
John Keeping 20e294884a Add trailing newline to exported rules file
According to POSIX a text file is "a file that contains characters
organized into zero or more lines" [1] and a line is "a sequence of zero
or more non- <newline> characters plus a terminating <newline>
character" [2].  Since we are claiming to produce a text file, it should
have a trailing newline.

[1] http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_397
[2] http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_206
11 years ago
Raymond Hill 2b230b85e1 Update CONTRIBUTING.md 11 years ago
gorhill 3591ca42f6 translation work from https://crowdin.com/project/umatrix 11 years ago
gorhill f7a9ba851d code review: importing uBlock's fixes 11 years ago
gorhill 3d3673f163 this fixes #283 11 years ago
gorhill 07ba0a0a4b this fixes #270 11 years ago
gorhill 22d5f9b052 Merge branch 'master' of https://github.com/gorhill/uMatrix 11 years ago
gorhill a7329ef71d support importing uBlock ruleset syntax 11 years ago
Raymond Hill 5e8de220e4 Merge pull request #255 from Alpengreis/Alpengreis-branch
Update README.md
11 years ago
Alpengreis 0cb267a081 Update README.md
Corrected the link ...
11 years ago
gorhill a1f8e9599e translation work from https://crowdin.com/project/umatrix 11 years ago
gorhill c8a461a815 interim version for dev build 11 years ago
gorhill cd760f33cb Merge branch 'master' of https://github.com/gorhill/uMatrix 11 years ago
gorhill d6a48df601 this fixes #246 -- FF tab management re-factored 11 years ago
gorhill fd4a7579f1 re-worked popup UI to access dashboard from title bar (like uBlock) 11 years ago
Raymond Hill 49ac2574b8 Update README.md 11 years ago

@ -0,0 +1,29 @@
---
name: Bug report
about: Create a report to help us improve
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Browser (please complete the following information):**
- OS: [e.g. MacOS, Linux]
- Browser [e.g. Firefox]
- Version [e.g. 80.0.1]
**Additional context**
Add any other context about the problem here.

@ -0,0 +1,17 @@
---
name: Feature request
about: Suggest an idea for this project
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

2
.gitignore vendored

@ -1 +1 @@
dist/ dist/build/

@ -0,0 +1,20 @@
{
"browser": true,
"devel": true,
"eqeqeq": true,
"esversion": 8,
"globals": {
"browser": false,
"self": false,
"chrome": false,
"log": false,
"webext": false,
"vAPI": false,
"µMatrix": false
},
"laxbreak": true,
"strict": "global",
"undef": true,
"unused": true,
"validthis": true
}

@ -3,12 +3,13 @@ env:
matrix: matrix:
- BROWSER=chromium EXT=zip - BROWSER=chromium EXT=zip
- BROWSER=firefox EXT=xpi - BROWSER=firefox EXT=xpi
script: ./tools/make-${BROWSER}.sh all script: "./tools/make-${BROWSER}.sh ${TRAVIS_TAG}"
deploy: deploy:
provider: releases provider: releases
prerelease: true
api_key: api_key:
secure: eQgPAHH6PKu2dLK+NafxwLl66t0cyW5x5NZFquOwsNMal5nsfof7lyXj2F0Q0vUpGeI21MOipBI8UGv5oXPoiXnr0fhEbEBz65C9vypK61WkDCQVGVeZVNGQwSXUm6gD2EzpPgTCIs52+7dKCDJ3stXzdimOiOTYs4WMNKKarFM= secure: eQgPAHH6PKu2dLK+NafxwLl66t0cyW5x5NZFquOwsNMal5nsfof7lyXj2F0Q0vUpGeI21MOipBI8UGv5oXPoiXnr0fhEbEBz65C9vypK61WkDCQVGVeZVNGQwSXUm6gD2EzpPgTCIs52+7dKCDJ3stXzdimOiOTYs4WMNKKarFM=
file: dist/build/uMatrix.${BROWSER}.${EXT} file: dist/build/uMatrix_${TRAVIS_TAG}.${BROWSER}.${EXT}
skip_cleanup: true skip_cleanup: true
on: on:
repo: gorhill/uMatrix repo: gorhill/uMatrix

@ -1,16 +1,4 @@
# Submitting issues ### Submitting issues
**Must read:** [How to Report Bugs Effectively](http://www.chiark.greenend.org.uk/~sgtatham/bugs.html). Submit on <https://github.com/geekprojects/nuTensor/issues>.
### IMPORTANT
1. When you file an issue, your **responsibility** is to provide **ALL** the exact steps needed for me to reproduce an issue.
1. Ideally, never should I have to _guess_ how to reproduce an issue.
- Hence this is why very detailed steps must be very carefully written down **the first time** the issue is filed.
- Never assume an important step is "obvious".
1. Every single step, in order, must be provided, with **ALL** relevant details.
1. Screenshots are nice, but use common sense: I can't cut and paste important text information from screenshots.
- Regarding screenshots: common sense, common sense, common sense. Too much of a thing can easily end up as noise.
1. Open source quality software comes from contributors carefully **crafting** code: conversely, issues must also be carefully **crafted**.
- In other words: you benefit from the carefully crafted code, return the favor by **carefully** crafting issues/bug reports.
1. If your mindset is that your time is more precious than that of my time, refrain from filing issues.

@ -1,34 +1,23 @@
## uMatrix<br>[<img src="https://travis-ci.org/gorhill/uMatrix.svg?branch=master" height="16">](https://travis-ci.org/gorhill/uMatrix) ## nuTensor
Definitely for advanced users. Definitely for advanced users.
Forked and refactored from [HTTP Switchboard](https://github.com/gorhill/httpswitchboard). This is a fork of the now-discontinued [uMatrix](https://github.com/gorhill/uMatrix).
My focus will be on keeping it working on Firefox for now. I'll do my best to keep it working, but sadly no guarantees. Help will always be welcome!
Install [manually](https://github.com/gorhill/uMatrix/blob/master/doc/README.md) the [latest release](https://github.com/gorhill/uMatrix/releases), or install from: ***
- [Firefox AMO](https://addons.mozilla.org/firefox/addon/umatrix/)
- [Chrome store](https://chrome.google.com/webstore/detail/µmatrix/ogfcmafjalglgifnmanfmnieipoejdcf)
- [Opera store](https://addons.opera.com/en-gb/extensions/details/umatrix/)
You may contribute with translation work: Forked and refactored from [uMatrix](https://github.com/gorhill/uMatrix).
- For in-app strings, on Crowdin: [uMatrix on Crowdin](https://crowdin.com/project/umatrix).
- For [description](https://github.com/gorhill/uMatrix/tree/master/doc/description) (to be used in AMO, Chrome store, etc.), submit a pull request. [Reference description is here](https://github.com/gorhill/uMatrix/blob/master/doc/description/description.en_US.txt) (feel free to improve as you wish, I am not a writer).
[HTTP Switchboard's documentation](https://github.com/gorhill/httpswitchboard/wiki) is still relevant, except for [uMatrix's differences with HTTP Switchboard](https://github.com/gorhill/uMatrix/wiki/Changes-from-HTTP-Switchboard).
You may contribute with documentation: [uMatrix's wiki](https://github.com/gorhill/uMatrix/wiki).
## Warnings ## Warnings
#### Regarding broken sites #### Regarding broken sites
uMatrix does not guarantee that sites will work fine: it is for advanced users who can figure how to un-break sites, because essentially uMatrix is a firewall which works in relaxed block-all/allow-exceptionally mode out of the box: it is not unexpected that sites will break. nuTensor does not guarantee that sites will work fine: it is for advanced users who can figure how to un-break sites, because essentially nuTensor is a firewall which works in relaxed block-all/allow-exceptionally mode out of the box: it is not unexpected that sites will break.
**So this means do not file issues to report broken sites when the sites are broken because uMatrix does its job as expected.** I will close any such issue without further comment.
I expect there will be community driven efforts for users to help each others. If uMatrix had a home, I would probably set up a forum, but I do not plan for such thing, I really just want to code, not manage web sites. If you need help to un-break a site when using uMatrix, you can try [Wilders Security](http://www.wilderssecurity.com/threads/umatrix-the-http-switchboard-successor.369601/), where you are likely to receive help if needed, whether by me or other users.
uMatrix can be set to work in [allow-all/block-exceptionally](https://github.com/gorhill/httpswitchboard/wiki/How-to-use-HTTP-Switchboard:-Two-opposing-views#the-allow-allblock-exceptionally-approach) mode with a single click on the `all` cell in the global scope `*`, if you prefer to work this way. This will of course break less sites, but you would then lose all the benefits which comes with block-all/allow-exceptionally mode -- though you will still benefit from the 62,000+ blacklisted hostnames by default. **So this means do not file issues to report broken sites when the sites are broken because nuTensor does its job as expected.** I will close any such issue without further comment.
**Using nuTensor logger is key to un-break sites:** the logger will show you all that nuTensor does internally.
## License ## License

@ -0,0 +1,88 @@
{
"assets.json": {
"content": "internal",
"updateAfter": 13,
"contentURL": [
"https://raw.githubusercontent.com/geekprojects/nuTensor/master/assets/assets.json",
"assets/assets.json"
]
},
"public_suffix_list.dat": {
"content": "internal",
"updateAfter": 19,
"contentURL": [
"https://publicsuffix.org/list/public_suffix_list.dat",
"assets/thirdparties/publicsuffix.org/list/public_suffix_list.dat",
"assets/thirdparties/publicsuffix.org/list/effective_tld_names.dat"
]
},
"malware-0": {
"content": "filters",
"title": "Malware Domain List",
"contentURL": [
"https://www.malwaredomainlist.com/hostslist/hosts.txt",
"assets/thirdparties/www.malwaredomainlist.com/hostslist/hosts.txt"
]
},
"malware-1": {
"content": "filters",
"title": "Malware domains",
"contentURL": [
"https://mirror.cedia.org.ec/malwaredomains/justdomains",
"https://mirror1.malwaredomains.com/files/justdomains",
"assets/thirdparties/mirror1.malwaredomains.com/files/justdomains",
"assets/thirdparties/mirror1.malwaredomains.com/files/justdomains.txt"
],
"supportURL": "http://www.malwaredomains.com/"
},
"dpollock-0": {
"content": "filters",
"updateAfter": 11,
"title": "Dan Pollocks hosts file",
"contentURL": [
"https://someonewhocares.org/hosts/hosts",
"assets/thirdparties/someonewhocares.org/hosts/hosts.txt"
],
"supportURL": "https://someonewhocares.org/hosts/"
},
"hphosts": {
"content": "filters",
"updateAfter": 11,
"title": "hpHosts Ad and tracking servers",
"contentURL": [
"https://hosts-file.net/.%5Cad_servers.txt",
"assets/thirdparties/hosts-file.net/ad_servers.txt"
],
"supportURL": "https://hosts-file.net/"
},
"mvps-0": {
"content": "filters",
"updateAfter": 11,
"title": "MVPS HOSTS",
"contentURL": [
"https://winhelp2002.mvps.org/hosts.txt",
"assets/thirdparties/winhelp2002.mvps.org/hosts.txt"
],
"supportURL": "https://winhelp2002.mvps.org/"
},
"plowe-0": {
"content": "filters",
"updateAfter": 13,
"title": "Peter Lowes Ad and tracking server list",
"contentURL": [
"https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=1&mimetype=plaintext",
"assets/thirdparties/pgl.yoyo.org/as/serverlist",
"assets/thirdparties/pgl.yoyo.org/as/serverlist.txt"
],
"supportURL": "https://pgl.yoyo.org/adservers/"
},
"recipes_en-0": {
"content": "recipes",
"title": "Ruleset recipes for English websites",
"contentURL": [
"https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/recipes/recipes_en.txt",
"assets/umatrix/recipes_en.txt"
],
"lang": "en"
}
}

@ -1,13 +0,0 @@
6c5b3873bdb65ad6b4f8c90eb254277e assets/umatrix/hosts-files.json
188ce926323d816ae9d7d5ebbb567862 assets/umatrix/blacklist.txt
1beb3b4b6458f6d3988b91cd981a97f0 assets/thirdparties/mirror1.malwaredomains.com/files/immortal_domains.txt
7f0443f3dcc9abfd47cfbc95ce824ddb assets/thirdparties/mirror1.malwaredomains.com/files/README.md
82711967354d935f4646014ee1d7c6a0 assets/thirdparties/mirror1.malwaredomains.com/files/justdomains
597f052c40b71ecd029eedd5752633aa assets/thirdparties/publicsuffix.org/list/effective_tld_names.dat
ccdb144db937e5f11e3ee7055b512831 assets/thirdparties/someonewhocares.org/hosts/hosts
83b2f4bc3c79f554f4eee5de018d2a89 assets/thirdparties/winhelp2002.mvps.org/hosts.txt
042419405031f0fcfac3735bf4f05e21 assets/thirdparties/www.malwaredomainlist.com/hostslist/README.md
ceb0394086d4e23b440cf3e186eea60c assets/thirdparties/www.malwaredomainlist.com/hostslist/hosts.txt
bd6b77760ea831b8961f1b69550511d9 assets/thirdparties/hosts-file.net/ad-servers
5663bfec7aea394ba4e1533950cb69b8 assets/thirdparties/pgl.yoyo.org/as/serverlist
5b8e13b618c68293430913029118781a assets/thirdparties/pgl.yoyo.org/as/README.md

File diff suppressed because it is too large Load Diff

@ -1,3 +0,0 @@
<http://www.malwaredomains.com/?page_id=1508>:
"This malware block lists provided here are for free for noncommercial use as part of the fight against malware."

@ -1,4 +0,0 @@
<http://pgl.yoyo.org/as/index.php>:
Site does encourage use of the list, and nowhere could I find terms and
conditions to use the list. Assuming it can be used freely.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -1,3 +0,0 @@
<http://www.malwaredomainlist.com/>:
"Our list can be used for free by anyone. Feel free to use it."

@ -1,61 +0,0 @@
# Blacklist maintained by HTTP Switchboard
# For those domain names which are not found in other blacklists
2mdn.net # "2mdn.net is a domain used by Doubleclick which is an advertising company..."
aad73c550c.se # Related to adrotator.se which is itself blacklisted
acxiom-online.com # Wikipedia: "Acxiom Corporation is a marketing technology and services company".
adextent.com # "We are an advertising technology company - we build technologies that improve ads performance"
adgear.com # "AdGear is an online advertising technologies company based in Montreal, Canada"
adnxs.com # "Adnxs.com is run by AppNexus, a company that provides technology, data and analytics to help companies buy and sell online display advertising" (Ref.: http://www.theguardian.com/technology/2012/apr/23/adnxs-tracking-trackers-cookies-web-monitoring)
adobetag.com # "Adobe Announces Adobe Tag Manager for the Online Marketing Suite"
aimatch.com # "Ad Server, SAS® Intelligent Advertising for Publishers"
analytics.edgesuite.net
atedra.com # "Atedra est un réseau de publicité Internet francophone au Canada"
axf8.net # https://www.eff.org/deeplinks/2013/06/third-party-resources-nsa-leaks
betrad.com # "Evidon: Home | Online Marketing Intelligence, Web Analytics, Privacy" (which also publishes "Ghostery" add-on..)
bizographics.com # "Business Audience Marketing"
bkrtx.com
# "Imagine Having The Power To Turn Abandoning Visitors Into Customers"
# "The BounceX software is tracking all the cursor movements of every visitor in real-time" (yikes!)
bounceexchange.com
clicktale.com # "See absolutely everything your visitors do on your webpage ... See their every mouse move, click and keystroke"
clicktale.net # Redirect to `clicktale.com`
crosspixel.net # (cookies, localStorage) "leading provider of high performance audience data and information for the real-time advertising industry"
crsspxl.com # Related to crosspixel.net
datarating.com # see https://github.com/gorhill/httpswitchboard/issues/343
displaymarketplace.com
erovinmo.com # No info whatsoever from site itself can be found = naughty corner. Ironically spotted at "http://www.technologyreview.com/news/519336/bruce-schneier-nsa-spying-is-making-us-less-safe/" (also: http://www.mywot.com/en/scorecard/erovinmo.com)
exelator.com # "domain used by eXelate Media which is an advertising company that is part of a network of sites, cookies, and other technologies used to track you" (Ref.: http://www.donottrackplus.com/trackers/exelator.com.php)
everestjs.net # related to `everesttech.net`
everesttech.net # "search engine marketing (SEM) solutions", pixel image on the page, looks like tracking to me. Spotted @ `http://www.homedepot.ca/` (search worked fine when blocking this hostname)
eyereturn.com # "eyeReturn Marketing is the only end-to-end digital advertising platform in the market"
gigya.com # "The tools you need to connect with consumers, harness rich data, and make marketing relevant"
inmuiads.info #
janrainbackplane.com # "Easily visualize, segment and update customer profiles to enable true personalized marketing"
krxd.net # https://www.eff.org/deeplinks/2013/06/third-party-resources-nsa-leaks
lijit.com # "We provide online advertising services, audience analytics"
llnwd.net # http://en.wikipedia.org/wiki/Limelight_Networks
lduhtrp.net
mathtag.com # "domain used by MediaMath to place cookies, on behalf of its customers, on the computers of visitors to our selected customer's websites and who may view our customer's display advertisements"
mxpnl.com #
moatads.com # https://www.eff.org/deeplinks/2013/06/third-party-resources-nsa-leaks
mookie1.com # "Specializing in online digital advertising, search marketing"
msads.net # Sounds like ads, and no home web page...
omtrdc.net # Redirect to Omniture
outbrain.com # https://www.eff.org/deeplinks/2013/06/third-party-resources-nsa-leaks
panoramtech.net # As seen in a screenshot at http://arstechnica.com/security/2014/01/malware-vendors-buy-chrome-extensions-to-send-adware-filled-updates/
parsely.com # http://en.wikipedia.org/wiki/Parse.ly
peer39.net # https://www.eff.org/deeplinks/2013/06/third-party-resources-nsa-leaks
pub2srv.com # "This url is used by ad network Propeller Ads Media for ad serving"
servebom.com # no home page, seen as 'tracking.servebom.com': good enough for this list
# These have "tracking" in domain name...
tracking.tomsguide.com
tracking.tomshardware.com
tracking.tomshardware.co.uk
wunderloop.net # https://www.eff.org/deeplinks/2013/06/third-party-resources-nsa-leaks
yceml.net

@ -1,30 +0,0 @@
{
"mirror1.malwaredomains.com/files/immortal_domains.txt": {
"title": "Long-lived malware domains",
"homeURL": "http://dns-bh.sagadc.org/immortal_domains.txt"
},
"mirror1.malwaredomains.com/files/justdomains": {
"title": "Malware domains",
"homeURL": "http://malwaredomains.lehigh.edu/files/justdomains"
},
"pgl.yoyo.org/as/serverlist": {
"title": "Peter Lowes Ad server list",
"homeURL": "http://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=1&mimetype=plaintext"
},
"www.malwaredomainlist.com/hostslist/hosts.txt": {
"title": "Malware Domain List",
"homeURL": "http://www.malwaredomainlist.com/hostslist/hosts.txt"
},
"hosts-file.net/ad-servers": {
"title": "hpHostss Ad and tracking servers",
"homeURL": "http://hosts-file.net/ad_servers.txt"
},
"someonewhocares.org/hosts/hosts": {
"title": "Dan Pollocks hosts file",
"homeURL": "http://someonewhocares.org/hosts/hosts"
},
"winhelp2002.mvps.org/hosts.txt": {
"title": "MVPS HOSTS",
"homeURL": "http://winhelp2002.mvps.org/hosts.txt"
}
}

@ -0,0 +1,192 @@
#!/usr/bin/env python3
import datetime
import json
import jwt
import os
import re
import requests
import shutil
import subprocess
import sys
import tempfile
import time
import zipfile
from distutils.version import StrictVersion
from string import Template
# - Download target (raw) uMatrix.chromium.zip from GitHub
# - This is referred to as "raw" package
# - This will fail if not a dev build
# - Upload uMatrix.chromium.zip to Chrome store
# - Publish uMatrix.chromium.zip to Chrome store
# Find path to project root
projdir = os.path.split(os.path.abspath(__file__))[0]
while not os.path.isdir(os.path.join(projdir, '.git')):
projdir = os.path.normpath(os.path.join(projdir, '..'))
# We need a version string to work with
if len(sys.argv) >= 2 and sys.argv[1]:
version = sys.argv[1]
else:
version = input('Github release version: ')
version.strip()
if not re.search('^\d+\.\d+\.\d+(b|rc)\d+$', version):
print('Error: Invalid version string.')
exit(1)
cs_extension_id = 'eckgcipdkhcfghnmincccnhpdmnbefki'
tmpdir = tempfile.TemporaryDirectory()
raw_zip_filename = 'uMatrix_'+ version + '.chromium.zip'
raw_zip_filepath = os.path.join(tmpdir.name, raw_zip_filename)
github_owner = 'gorhill'
github_repo = 'uMatrix'
# Load/save auth secrets
# The build directory is excluded from git
ubo_secrets = dict()
ubo_secrets_filename = os.path.join(projdir, 'dist', 'build', 'ubo_secrets')
if os.path.isfile(ubo_secrets_filename):
with open(ubo_secrets_filename) as f:
ubo_secrets = json.load(f)
def input_secret(prompt, token):
if token in ubo_secrets:
prompt += ''
prompt += ': '
value = input(prompt).strip()
if len(value) == 0:
if token not in ubo_secrets:
print('Token error:', token)
exit(1)
value = ubo_secrets[token]
elif token not in ubo_secrets or value != ubo_secrets[token]:
ubo_secrets[token] = value
exists = os.path.isfile(ubo_secrets_filename)
with open(ubo_secrets_filename, 'w') as f:
json.dump(ubo_secrets, f, indent=2)
if not exists:
os.chmod(ubo_secrets_filename, 0o600)
return value
# GitHub API token
github_token = input_secret('Github token', 'github_token')
github_auth = 'token ' + github_token
#
# Get metadata from GitHub about the release
#
# https://developer.github.com/v3/repos/releases/#get-a-single-release
print('Downloading release info from GitHub...')
release_info_url = 'https://api.github.com/repos/{0}/{1}/releases/tags/{2}'.format(github_owner, github_repo, version)
headers = { 'Authorization': github_auth, }
response = requests.get(release_info_url, headers=headers)
if response.status_code != 200:
print('Error: Release not found: {0}'.format(response.status_code))
exit(1)
release_info = response.json()
#
# Extract URL to raw package from metadata
#
# Find url for uMatrix.chromium.zip
raw_zip_url = ''
for asset in release_info['assets']:
if asset['name'] == raw_zip_filename:
raw_zip_url = asset['url']
if len(raw_zip_url) == 0:
print('Error: Release asset URL not found')
exit(1)
#
# Download raw package from GitHub
#
# https://developer.github.com/v3/repos/releases/#get-a-single-release-asset
print('Downloading raw zip package from GitHub...')
headers = {
'Authorization': github_auth,
'Accept': 'application/octet-stream',
}
response = requests.get(raw_zip_url, headers=headers)
# Redirections are transparently handled:
# http://docs.python-requests.org/en/master/user/quickstart/#redirection-and-history
if response.status_code != 200:
print('Error: Downloading raw package failed -- server error {0}'.format(response.status_code))
exit(1)
with open(raw_zip_filepath, 'wb') as f:
f.write(response.content)
print('Downloaded raw package saved as {0}'.format(raw_zip_filepath))
#
# Upload to Chrome store
#
# Auth tokens
cs_id = input_secret('Chrome store id', 'cs_id')
cs_secret = input_secret('Chrome store secret', 'cs_secret')
cs_refresh = input_secret('Chrome store refresh token', 'cs_refresh')
print('Uploading to Chrome store...')
with open(raw_zip_filepath, 'rb') as f:
print('Generating access token...')
auth_url = 'https://accounts.google.com/o/oauth2/token'
auth_payload = {
'client_id': cs_id,
'client_secret': cs_secret,
'grant_type': 'refresh_token',
'refresh_token': cs_refresh,
}
auth_response = requests.post(auth_url, data=auth_payload)
if auth_response.status_code != 200:
print('Error: Auth failed -- server error {0}'.format(auth_response.status_code))
print(auth_response.text)
exit(1)
response_dict = auth_response.json()
if 'access_token' not in response_dict:
print('Error: Auth failed -- no access token')
exit(1)
# Prepare access token
cs_auth = 'Bearer ' + response_dict['access_token']
headers = {
'Authorization': cs_auth,
'x-goog-api-version': '2',
}
# Upload
print('Uploading package...')
upload_url = 'https://www.googleapis.com/upload/chromewebstore/v1.1/items/{0}'.format(cs_extension_id)
upload_response = requests.put(upload_url, headers=headers, data=f)
f.close()
if upload_response.status_code != 200:
print('Upload failed -- server error {0}'.format(upload_response.status_code))
print(upload_response.text)
exit(1)
response_dict = upload_response.json();
if 'uploadState' not in response_dict or response_dict['uploadState'] != 'SUCCESS':
print('Upload failed -- server error {0}'.format(response_dict['uploadState']))
exit(1)
print('Upload succeeded.')
# Publish
print('Publishing package...')
publish_url = 'https://www.googleapis.com/chromewebstore/v1.1/items/{0}/publish'.format(cs_extension_id)
headers = {
'Authorization': cs_auth,
'x-goog-api-version': '2',
'Content-Length': '0',
}
publish_response = requests.post(publish_url, headers=headers)
if publish_response.status_code != 200:
print('Error: Chrome store publishing failed -- server error {0}'.format(publish_response.status_code))
exit(1)
response_dict = publish_response.json();
if 'status' not in response_dict or response_dict['status'][0] != 'OK':
print('Publishing failed -- server error {0}'.format(response_dict['status']))
exit(1)
print('Publishing succeeded.')
print('All done.')

@ -0,0 +1,321 @@
#!/usr/bin/env python3
import datetime
import json
import jwt
import os
import re
import requests
import shutil
import subprocess
import sys
import tempfile
import time
import zipfile
from distutils.version import LooseVersion
from string import Template
# - Download target (raw) nuTensor.firefox.xpi from GitHub
# - This is referred to as "raw" package
# - This will fail if not a dev build
# - Modify raw package to make it self-hosted
# - This is referred to as "unsigned" package
# - Ask AMO to sign nuTensor.firefox.xpi
# - Generate JWT to be used for communication with server
# - Upload unsigned package to AMO
# - Wait for a valid download URL for signed package
# - Download signed package as nuTensor.firefox.signed.xpi
# - This is referred to as "signed" package
# - Upload nuTensor.firefox.signed.xpi to GitHub
# - Remove nuTensor.firefox.xpi from GitHub
# - Modify updates.json to point to new version
# - Commit changes to repo
# Find path to project root
projdir = os.path.split(os.path.abspath(__file__))[0]
while not os.path.isdir(os.path.join(projdir, '.git')):
projdir = os.path.normpath(os.path.join(projdir, '..'))
# Check that found project root is valid
version_filepath = os.path.join(projdir, 'dist', 'version')
if not os.path.isfile(version_filepath):
print('Version file not found.')
exit(1)
# We need a version string to work with
if len(sys.argv) >= 2 and sys.argv[1]:
tag_version = sys.argv[1]
else:
tag_version = input('Github release version: ')
tag_version.strip()
match = re.search('^(\d+\.\d+\.\d+)(?:(b|rc)(\d+))?$', tag_version)
if not match:
print('Error: Invalid version string.')
exit(1)
ext_version = match.group(1);
if match.group(2):
revision = int(match.group(3))
if match.group(2) == 'rc':
revision += 100;
ext_version += '.' + str(revision)
extension_id = 'nuTensor@geekprojects.com'
tmpdir = tempfile.TemporaryDirectory()
raw_xpi_filename = 'nuTensor_' + tag_version + '.firefox.xpi'
raw_xpi_filepath = os.path.join(tmpdir.name, raw_xpi_filename)
unsigned_xpi_filepath = os.path.join(tmpdir.name, 'nuTensor.firefox.unsigned.xpi')
signed_xpi_filename = 'nuTensor_' + tag_version + '.firefox.signed.xpi'
signed_xpi_filepath = os.path.join(tmpdir.name, signed_xpi_filename)
github_owner = 'geekprojects'
github_repo = 'nuTensor'
# Load/save auth secrets
# The build directory is excluded from git
ubo_secrets = dict()
ubo_secrets_filename = os.path.join(projdir, 'dist', 'build', 'ubo_secrets')
if os.path.isfile(ubo_secrets_filename):
with open(ubo_secrets_filename) as f:
ubo_secrets = json.load(f)
def input_secret(prompt, token):
if token in ubo_secrets:
prompt += ''
prompt += ': '
value = input(prompt).strip()
if len(value) == 0:
if token not in ubo_secrets:
print('Token error:', token)
exit(1)
value = ubo_secrets[token]
elif token not in ubo_secrets or value != ubo_secrets[token]:
ubo_secrets[token] = value
exists = os.path.isfile(ubo_secrets_filename)
with open(ubo_secrets_filename, 'w') as f:
json.dump(ubo_secrets, f, indent=2)
if not exists:
os.chmod(ubo_secrets_filename, 0o600)
return value
# GitHub API token
github_token = input_secret('Github token', 'github_token')
github_auth = 'token ' + github_token
#
# Get metadata from GitHub about the release
#
# https://developer.github.com/v3/repos/releases/#get-a-single-release
print('Downloading release info from GitHub...')
release_info_url = 'https://api.github.com/repos/{0}/{1}/releases/tags/{2}'.format(github_owner, github_repo, tag_version)
headers = { 'Authorization': github_auth, }
response = requests.get(release_info_url, headers=headers)
if response.status_code != 200:
print('Error: Release not found: {0}'.format(response.status_code))
exit(1)
release_info = response.json()
#
# Extract URL to raw package from metadata
#
# Find url for nuTensor.firefox.xpi
raw_xpi_url = ''
for asset in release_info['assets']:
if asset['name'] == signed_xpi_filename:
print('Error: Found existing signed self-hosted package.')
exit(1)
if asset['name'] == raw_xpi_filename:
raw_xpi_url = asset['url']
if len(raw_xpi_url) == 0:
print('Error: Release asset URL not found')
exit(1)
#
# Download raw package from GitHub
#
# https://developer.github.com/v3/repos/releases/#get-a-single-release-asset
print('Downloading raw xpi package from GitHub...')
headers = {
'Authorization': github_auth,
'Accept': 'application/octet-stream',
}
response = requests.get(raw_xpi_url, headers=headers)
# Redirections are transparently handled:
# http://docs.python-requests.org/en/master/user/quickstart/#redirection-and-history
if response.status_code != 200:
print('Error: Downloading raw package failed -- server error {0}'.format(response.status_code))
exit(1)
with open(raw_xpi_filepath, 'wb') as f:
f.write(response.content)
print('Downloaded raw package saved as {0}'.format(raw_xpi_filepath))
#
# Convert the package to a self-hosted one: add `update_url` to the manifest
#
print('Converting raw xpi package into self-hosted xpi package...')
with zipfile.ZipFile(raw_xpi_filepath, 'r') as zipin:
with zipfile.ZipFile(unsigned_xpi_filepath, 'w') as zipout:
for item in zipin.infolist():
data = zipin.read(item.filename)
if item.filename == 'manifest.json':
manifest = json.loads(bytes.decode(data))
manifest['browser_specific_settings']['gecko']['update_url'] = 'https://raw.githubusercontent.com/{0}/{1}/master/dist/firefox/updates.json'.format(github_owner, github_repo)
data = json.dumps(manifest, indent=2, separators=(',', ': '), sort_keys=True).encode()
zipout.writestr(item, data)
#
# Ask AMO to sign the self-hosted package
# - https://developer.mozilla.org/en-US/Add-ons/Distribution#Distributing_your_add-on
# - https://pyjwt.readthedocs.io/en/latest/usage.html
# - https://addons-server.readthedocs.io/en/latest/topics/api/auth.html
# - https://addons-server.readthedocs.io/en/latest/topics/api/signing.html
#
amo_api_key = ''
amo_secret = ''
def get_jwt_auth():
global amo_api_key
if amo_api_key == '':
amo_api_key = input_secret('AMO API key', 'amo_api_key')
global amo_secret
if amo_secret == '':
amo_secret = input_secret('AMO API secret', 'amo_secret')
amo_nonce = os.urandom(8).hex()
jwt_payload = {
'iss': amo_api_key,
'jti': amo_nonce,
'iat': datetime.datetime.utcnow(),
'exp': datetime.datetime.utcnow() + datetime.timedelta(seconds=15),
}
return 'JWT ' + jwt.encode(jwt_payload, amo_secret).decode()
print('Ask AMO to sign self-hosted xpi package...')
with open(unsigned_xpi_filepath, 'rb') as f:
# https://blog.mozilla.org/addons/2019/11/11/security-improvements-in-amo-upload-tools/
# "We recommend allowing up to 15 minutes."
interval = 60 # check every 60 seconds
countdown = 15 * 60 / interval # for at most 15 minutes
headers = { 'Authorization': get_jwt_auth(), }
data = { 'channel': 'unlisted' }
files = { 'upload': f, }
signing_url = 'https://addons.mozilla.org/api/v3/addons/{0}/versions/{1}/'.format(extension_id, ext_version)
print('Submitting package to be signed...')
response = requests.put(signing_url, headers=headers, data=data, files=files)
if response.status_code != 202:
print('Error: Creating new version failed -- server error {0}'.format(response.status_code))
print(response.text)
exit(1)
print('Request for signing self-hosted xpi package succeeded.')
signing_request_response = response.json();
f.close()
print('Waiting for AMO to process the request to sign the self-hosted xpi package...')
# Wait for signed package to be ready
signing_check_url = signing_request_response['url']
while True:
sys.stdout.write('.')
sys.stdout.flush()
time.sleep(interval)
countdown -= 1
if countdown <= 0:
print('Error: AMO signing timed out')
exit(1)
headers = { 'Authorization': get_jwt_auth(), }
response = requests.get(signing_check_url, headers=headers)
if response.status_code != 200:
print('Error: AMO signing failed -- server error {0}'.format(response.status_code))
print(response.text)
exit(1)
signing_check_response = response.json()
if not signing_check_response['processed']:
continue
if not signing_check_response['valid']:
print('Error: AMO validation failed')
print(response.text)
exit(1)
if not signing_check_response['files'] or len(signing_check_response['files']) == 0:
continue
if not signing_check_response['files'][0]['signed']:
continue
if not signing_check_response['files'][0]['download_url']:
print('Error: AMO signing failed')
print(response.text)
exit(1)
print('\r')
print('Self-hosted xpi package successfully signed.')
download_url = signing_check_response['files'][0]['download_url']
print('Downloading signed self-hosted xpi package from {0}...'.format(download_url))
response = requests.get(download_url, headers=headers)
if response.status_code != 200:
print('Error: Download signed package failed -- server error {0}'.format(response.status_code))
print(response.text)
exit(1)
with open(signed_xpi_filepath, 'wb') as f:
f.write(response.content)
f.close()
print('Signed self-hosted xpi package downloaded.')
break
#
# Upload signed package to GitHub
#
# https://developer.github.com/v3/repos/releases/#upload-a-release-asset
print('Uploading signed self-hosted xpi package to GitHub...')
with open(signed_xpi_filepath, 'rb') as f:
url = release_info['upload_url'].replace('{?name,label}', '?name=' + signed_xpi_filename)
headers = {
'Authorization': github_auth,
'Content-Type': 'application/zip',
}
response = requests.post(url, headers=headers, data=f.read())
if response.status_code != 201:
print('Error: Upload signed package failed -- server error: {0}'.format(response.status_code))
exit(1)
#
# Remove raw package from GitHub
#
# https://developer.github.com/v3/repos/releases/#delete-a-release-asset
print('Remove raw xpi package from GitHub...')
headers = { 'Authorization': github_auth, }
response = requests.delete(raw_xpi_url, headers=headers)
if response.status_code != 204:
print('Error: Deletion of raw package failed -- server error: {0}'.format(response.status_code))
#
# Update updates.json to point to new package -- but only if just-signed
# package is higher version than current one.
#
print('Update GitHub to point to newly signed self-hosted xpi package...')
updates_json_filepath = os.path.join(projdir, 'dist', 'firefox', 'updates.json')
with open(updates_json_filepath) as f:
updates_json = json.load(f)
f.close()
previous_version = updates_json['addons'][extension_id]['updates'][0]['version']
if LooseVersion(ext_version) > LooseVersion(previous_version):
with open(os.path.join(projdir, 'dist', 'firefox', 'updates.template.json')) as f:
template_json = Template(f.read())
f.close()
updates_json = template_json.substitute(ext_version=ext_version, tag_version=tag_version)
with open(updates_json_filepath, 'w') as f:
f.write(updates_json)
f.close()
# Automatically git add/commit if needed.
# - Stage the changed file
r = subprocess.run(['git', 'status', '-s', updates_json_filepath], stdout=subprocess.PIPE)
rout = bytes.decode(r.stdout).strip()
if len(rout) >= 2 and rout[1] == 'M':
subprocess.run(['git', 'add', updates_json_filepath])
# - Commit the staged file
r = subprocess.run(['git', 'status', '-s', updates_json_filepath], stdout=subprocess.PIPE)
rout = bytes.decode(r.stdout).strip()
if len(rout) >= 2 and rout[0] == 'M':
subprocess.run(['git', 'commit', '-m', 'Make Firefox dev build auto-update', updates_json_filepath])
subprocess.run(['git', 'push', 'origin', 'HEAD'])
print('All done.')

@ -0,0 +1,14 @@
{
"addons": {
"nuTensor@geekprojects.com": {
"updates": [
{
"version": "1.4.1.6",
"browser_specific_settings": { "gecko": { "strict_min_version": "56" } },
"update_info_url": "https://github.com/geekprojects/nuTensor/releases/tag/1.4.1b6",
"update_link": "https://github.com/geekprojects/nuTensor/releases/download/1.4.1b6/nuTensor_1.4.1b6.firefox.signed.xpi"
}
]
}
}
}

@ -0,0 +1,14 @@
{
"addons": {
"nuTensor@geekprojects.com": {
"updates": [
{
"version": "$ext_version",
"browser_specific_settings": { "gecko": { "strict_min_version": "56" } },
"update_info_url": "https://github.com/geekprojects/nuTensor/releases/tag/$tag_version",
"update_link": "https://github.com/geekprojects/nuTensor/releases/download/$tag_version/nuTensor_$tag_version.firefox.signed.xpi"
}
]
}
}
}

1
dist/version vendored

@ -0,0 +1 @@
1.5.0.0

@ -0,0 +1,39 @@
## Building nuTensor
### Requirements
Tools:
* bash
* python 3
You will need both this nuTensor and the nuAssets repositories. These should both be placed in the same directory:
```
git clone https://github.com/geekprojects/nuAssets.git
git clone https://github.com/geekprojects/nuTensor.git
cd nuTensor
```
### Packaging
You can now run the scripts that package everything up.
These are bash scripts. They have only been tested on Linux and MacOS.
#### For Firefox
```
tools/make-firefox.sh all
```
#### For Chrome/Chromium (Not yet tested)
```
tools/make-chromium.sh all
```
#### For Opera (Not yet tested)
```
tools/make-opera.sh
```
The installation package should now be found in dist/build/
### Installing
Follow the instructions in [README.md](README.md) to install it.

@ -1,8 +1,8 @@
### This is µMatrix's manifesto ### This is uMatrix's manifesto
1. The **user decides** what web content is acceptable or not in their browser. 1. The **user decides** what web content is acceptable or not in their browser.
That is all. That is all.
The purpose of _µMatrix_ is to give the user the means for informed The purpose of _uMatrix_ is to give the user the means for informed
consent and informed dissent. consent and informed dissent.

@ -2,16 +2,16 @@
#### Chromium #### Chromium
- Download and unzip `uMatrix.chromium.zip` ([latest release desirable](https://github.com/gorhill/uMatrix/releases)). - Download and unzip `nuTensor.chromium.zip` ([latest release desirable](https://github.com/geekprojects/nuTensor/releases)).
- Rename the unzipped directory to `umatrix` - Rename the unzipped directory to `nuTensor`
- When you later update manually, replace the **content** of the `umatrix` folder with the **content** of the latest zipped version. - When you later update manually, replace the **content** of the `nuTensor` folder with the **content** of the latest zipped version.
- This will ensure that all the extension settings will be preserved - This will ensure that all the extension settings will be preserved
- As long as the extension loads **from same folder path from which it was originally installed**, all your settings will be preserved. - As long as the extension loads **from same folder path from which it was originally installed**, all your settings will be preserved.
- Go to chromium/chrome *Extensions*. - Go to chromium/chrome *Extensions*.
- Click to check *Developer mode*. - Click to check *Developer mode*.
- Click *Load unpacked extension...*. - Click *Load unpacked extension...*.
- In the file selector dialog: - In the file selector dialog:
- Select the directory `umatrix` which was created above. - Select the directory `nuTensor` which was created above.
- Click *Open*. - Click *Open*.
The extension will now be available in your chromium/chromium-based browser. The extension will now be available in your chromium/chromium-based browser.
@ -22,16 +22,16 @@ Remember that you have to update manually also. For some users, updating manuall
#### Firefox #### Firefox
Although uMatrix is a restartless addon, I found that **installing** a newer version over an older one often will glitch the installation. These steps always worked fine: Although nuTensor is a restartless addon, I found that **installing** a newer version over an older one often will glitch the installation. These steps always worked fine:
- Download `uMatrix.firefox.xpi` ([latest release desirable](https://github.com/gorhill/uMatrix/releases)). - Download `nuTensor.firefox.xpi` ([latest release desirable](https://github.com/geekprojects/nuTensor/releases)).
- Uninstall current uMatrix if already installed - Uninstall current nuTensor if already installed
- Quit Firefox completely - Quit Firefox completely
- Launch Firefox - Launch Firefox
- Drag and drop the previously downloaded `uMatrix.firefox.xpi` into Firefox - Drag and drop the previously downloaded `nuTensor.firefox.xpi` into Firefox
uMatrix settings are kept intact even after you uninstall the addon. nuTensor settings are kept intact even after you uninstall the addon.
On Linux, the settings are saved in a SQlite file located at `~/.mozilla/firefox/[profile name]/extension-data/umatrix.sqlite`. On Linux, the settings are saved in a SQlite file located at `~/.mozilla/firefox/[profile name]/extension-data/nuTensor.sqlite`.
On Windows, the settings are saved in a SQlite file located at `%APPDATA%\Mozilla\Firefox\Profiles\[profile name]\extension-data\umatrix.sqlite`. On Windows, the settings are saved in a SQlite file located at `%APPDATA%\Mozilla\Firefox\Profiles\[profile name]\extension-data\nuTensor.sqlite`.

@ -4,7 +4,7 @@ uMatrix gibt dir volle Kontrolle darüber, womit sich dein Browser verbindet, we
Voreingestellt arbeitet uMatrix in einem gelockerten "blockiere alles/erlaube ausnahmsweise"-Modus, was dazu führt, dass viele Webseiten, die Skripte von Drittseiten benötigen, "kaputt" sein werden. Mit zwei Klicks kannst du aber dafür sorgen, dass uMatrix in einem "erlaube alles/blockiere ausnahmsweise"-Modus arbeitet, der normalerweise Webseiten nicht kaputt macht. Details dazu auf https://github.com/gorhill/httpswitchboard/wiki/How-to-use-HTTP-Switchboard:-Two-opposing-views for more details on this topic. Voreingestellt arbeitet uMatrix in einem gelockerten "blockiere alles/erlaube ausnahmsweise"-Modus, was dazu führt, dass viele Webseiten, die Skripte von Drittseiten benötigen, "kaputt" sein werden. Mit zwei Klicks kannst du aber dafür sorgen, dass uMatrix in einem "erlaube alles/blockiere ausnahmsweise"-Modus arbeitet, der normalerweise Webseiten nicht kaputt macht. Details dazu auf https://github.com/gorhill/httpswitchboard/wiki/How-to-use-HTTP-Switchboard:-Two-opposing-views for more details on this topic.
* Sehe ALLE Verbindungen, ob fehlgeschlagen oder erfolgreich, je nachdem ob du sie blockiert oder erlaubt hast (deine Entscheidung). * Sieh ALLE Verbindungen, ob fehlgeschlagen oder erfolgreich, je nachdem ob du sie blockiert oder erlaubt hast (deine Entscheidung).
* Erlaube/blockiere mit einem Klick eine oder mehrere Arten von Verbindungsanfragen deines Browsers je nach Ziel und Datentyp (eine blockierte Anfrage wird NIE deinen Browser verlassen). * Erlaube/blockiere mit einem Klick eine oder mehrere Arten von Verbindungsanfragen deines Browsers je nach Ziel und Datentyp (eine blockierte Anfrage wird NIE deinen Browser verlassen).

@ -1,93 +1,81 @@
µMatrix: A point-and-click matrix-based firewall, with many privacy-enhancing tools. For advanced users. uMatrix格子状のマトリクスで管理するファイヤウォール。様々なプライバシー強化ツールを兼ね備えます。
µMatrix put you in full control of where your browser is allowed to connect, what type of data it is allowed to download, and what it is allowed to execute. Nobody else decides for you: You choose. You are in full control of your privacy. * 上級ユーザー向けです *
Out of the box, µMatrix works in relax block-all/allow-exceptionally mode, meaning web sites which require 3rd-party scripts are likely to be "broken". With two clicks, µMatrix can be set to work in allow-all/block-exceptionally mode, which generally will not break web sites. See https://github.com/gorhill/httpswitchboard/wiki/How-to-use-HTTP-Switchboard:-Two-opposing-views for more details on this topic. uMatrix を使うと、ブラウザーがどこと通信して良いのか、どの種類のデータをダウンロードするのか、何を実行して良いのかを決定することができます。誰か他の人があなたの代わりに決めてくれることはありません。自分のプライバシーを自分で制御するのです。
Regarding the myth that "Chromium-based browsers can't reliably block javascript", see: https://github.com/gorhill/httpswitchboard/wiki/Blocking-javascript-execution-reliably-in-Chromium-based-browsers. Summary: Yes, javascript can be blocked reliably in Chromium. 初期設定では、uMatrix は安心できる「すべてブロック・必要なら許可」の設定になっています。つまり、サードパーティーのスクリプトを必要とするウェブサイトは“壊れる”ことが多いでしょう。2クリックで、「すべて許可・必要ならブロック」の設定に変えることもでき、この場合、ウェブサイトを壊すことはほとんどありません。より詳しくは https://github.com/gorhill/httpswitchboard/wiki/How-to-use-HTTP-Switchboard:-Two-opposing-views を見て下さい。
* See ALL the remote connections, failed or attempted, depending on whether they were blocked or allowed (you decide). * あなたが選んだブロック/許可の結果による“すべての”リクエストの失敗/実施の状況を確認できます。
* A single-click to whitelist/blacklist one or multiple classes of requests according to the destination and type of data (a blocked request will NEVER leave your browser). * ワンクリックで、接続先やデータの種類に応じてリクエストを許可/ブロックすることができます。ブロックされたリクエストがブラウザーから外に出ることは決してありません。
* Efficient blacklisting: cookies won't leave your browser, javascript won't execute, plugins won't play, tracking pixels won't download, etc. * 効率的なブラックリストCookie はブラウザーの外には出ず、JavaScript もプラグインも実行されず、追跡ピクセルがダウンロードされることもありません。
* You do not have to solely rely on just one particular curated blacklist (arguably with many missing entries) outside which nothing else can be blocked: You are in full control. * リストにないとブロックしてくれない(そして多くの漏れがあるであろう)ブラックリストだけに頼る必要はありません。自分で制御できるのです。
* Ease of use: µMatrix lets you easily whitelist/blacklist net requests which originate from within a web page according to a point-and-click matrix: * 使い勝手の良さuMatrix では、ウェブページが発したリクエストを、マトリクスをクリックすることで簡単に許可/ブロックすることができます。
- domain names (left column) - ドメイン名(左の列)
* from very specific * 具体的なドメインから
* to very generic * 汎用的なドメインまで 選ぶことができます
- type of requests (top row) - リクエストの種類(先頭の行)
* cookies * Cookie
* CSS-related resources (stylesheets and web fonts) * CSS 関連のリソース(スタイルシートと Web フォント)
* images * 画像
* plugins * メディア
* scripts * スクリプト
* XHR (requests made by scripts) * XHR(スクリプトにより生成されるリクエスト)
* frames * フレーム
* others * その他
You can blacklist/whitelist a single cell, an entire row, a group of rows, an entire column, or the whole matrix with just one click. ワンクリックで、特定のセル、特定のドメイン、グループ化されたドメイン、特定のリクエストの種類、そしてマトリクス全体を許可/ブロックできます。
µMatrix's filtering engine uses precedence logic to evaluate what is blocked/allowed according to which cells are blacklisted/whitelisted. For example, this allows you to whitelist a whole page with one click, without having to repeatedly whitelist whatever new data appear on the page. uMatrix のフィルタリングエンジンは、どのセルが許可/ブロックされているかによって、優先順位に基づくロジックでリクエストを処理します。これにより、例えば、あるページ全体をワンクリックで許可しておけば、このページに新しいリクエストが見つかるたびに許可を追加する必要がなくなります。
All rules are scoped. For example, you can block `facebook.com` and `facebook.net` everywhere except when visiting a page on `www.facebook.com`. This way Facebook won't be able to build a profile of your browsing habits. それぞれのルールには有効範囲があります。例えば、www.facebook.com にアクセスしていない時だけ facebook.com と facebook.net をブロックすることができます。これにより、Facebook が、あなたのブラウジング習慣からあなたの人物像を作成することを防ぎます。
The goal of this extension is to make the allowing or blocking of web sites, wholly or partly, as straightforward as possible, so as to encourage users to care about their privacy. この拡張機能の最終目標は、ユーザーが自身のプライバシーに気を配れるよう、可能な限り簡潔に、ウェブサイトを包括的あるいは部分的に許可/ブロックできるようにすることです。
The extension comes with 3rd-party hosts files totaling over 58,000 distinct hostnames (lists can be selectively disabled/enabled according to your choice). この拡張機能には、合計 62,000 件以上のホスト名からなるサードパーティーのホストファイルが含まれます。これらのファイルは好みに応じてオンオフすることができます。
Ultimately, you can choose however you browse the net: まとめると、あなたはネットをブラウジングする方法を次のように選ぶことができます。
* Blacklist all by default, and whitelist as needed (default mode). * はじめはすべてブロック、必要に応じて許可していく(初期設定)
* Whitelist all by default, and blacklist as needed. * はじめはすべて許可、必要に応じてブロックしていく
Either way, you still benefit from the preset blacklists so that at least you get basic protection from trackers, malware sites, etc. Or you can disable all of these preset blacklists. どちらの方法でも、組み込みのホストファイルのおかげで、トラッカーやマルウェアサイトなどに対する基礎的な保護を得ることができます。もしくはこれらをすべて無効にすることもできます。
Your choice. 決めるのはあなたです。
Randomly assembled documentation: https://github.com/gorhill/uMatrix/wiki ドキュメント: https://github.com/gorhill/uMatrix/wiki
===== =====
FEEDBACK: この拡張機能のもう一つの使い道は、知識なしでも、ブラウザーの中でウェブページが何をしているか理解することです。あなたはウェブページがどこと通信するのかをすべて見た上で決断し、ウェブページ中の特定の種類の通信を制限できます。
For any question/issue you might have, use the "Send Feedback" button on the right, in order for me to be able to answer readily. I can't answer directly to reviews, but I will be more than happy to answer you directly in the feedback section. 拡張機能アイコンに表示される数値は、ウェブページによっていくつのリクエストが試みられたかの総数(許可/ブロック合わせて)を示します。
===== マトリクスの適切なセルをクリックして、許可/ブロック/グレーのいずれにするかを決めます。“グレー”では、マトリクス内のより優先度の高いセルからブロック/許可の状態を引き継ぎます。
BUGS, ISSUES, SUGEGSTIONS:
https://github.com/gorhill/uMatrix/issues
You are very welcomed to contribute your views on open issues and suggestions, various arguments for/against help me in deciding what is needed to improve the extension.
Ease of use is the primary goal. I've seen users give up on Firefox's NoScript because it gets too much in the way according to them, so rather than blame these users for poor security habits, I prefer to blame developers and this project is a tentative to address the issues which cause some users to give up on basic security.
This extension is also useful to understand what the web page in your browser is doing, often without your knowledge. You have full ability to see and decide with whom a web page communicates, and to restrict these communications to specific classes of objects within the web page. 赤いセル は事実上ブロックされている状態であり、リクエストは接続先に届きません。
* 濃い赤:そのドメイン名とリクエスト種類の組み合わせは、明示的にブロックされています。
* 淡い赤:セルが“グレー”状態のため、ブロック状態が引き継がれました。
The number which appear in the extension icon correspond to the total number of distinct requests attempted (successfully or not depending on whether these were allowed or blocked) by the web page. 緑のセル は事実上許可されている状態であり、リクエストは接続先に届きます。
* 濃い緑:そのドメイン名とリクエスト種類の組み合わせは、明示的に許可されています。
* 淡い緑:セルが“グレー”状態のため、許可が引き継がれました。
Simply click on the appropriate entry in the matrix in order to white-, black- or graylist a component. Graylisting means the blocked or allowed status will be inherited from another cell with higher precedence in the matrix. マトリクスの一番左上にある「すべて」のセルはデフォルトのグローバル設定を示し、「すべてを許可」と「すべてをブロック」のどちらをデフォルトにするかを選ぶことができます。人によっては、すべてを許可した上で必要に応じてブロックすることを好むでしょう。私の個人的な設定はもちろんその逆、すべてをブロックした上で必要なものを許可します。
Red square = effectively blacklisted, i.e. requests are prevented from reaching their intended destination: この拡張機能は、例えば画像の読み込みをすべてブロックすることで、ブラウジングスピードを上げるのにも役立ちます。
* Dark red square: the domain name and/or type of request is specifically blacklisted.
* Faded red square: the blacklist status is inherited because the entry is graylisted.
Green square = effectively whitelisted, i.e. requests are allowed to reach their intended destination:
* Dark green square: the domain name and/or type of request is specifically whitelisted.
* Faded green square: the whitelist status is inherited because the entry is graylisted.
The top-left cell in the matrix, the "all" cell, represents the default global setting, which allows you to choose whether allowing or blocking everything is the default behavior. Some prefer to allow everything while blocking exceptionally. My personal preference is of course the reverse, blocking everything and allowing exceptionally.
This extension is also useful if you wish to speed up your browsing, by globally blocking all requests for images as an example.
===== =====
SOURCE CODE: https://github.com/gorhill/uMatrix (GPLv3) バグ・問題報告: https://github.com/gorhill/uMatrix/issues
ソースコード: https://github.com/gorhill/uMatrix (GPLv3)
CHANGE LOG: https://github.com/gorhill/uMatrix/releases 更新履歴: https://github.com/gorhill/uMatrix/releases

@ -1,93 +1,81 @@
µMatrix: A point-and-click matrix-based firewall, with many privacy-enhancing tools. For advanced users. uMatrix: een contextafhankelijke en matrix-gebaseerde firewall, met vele functies ter verbetering van uw privacy.
µMatrix put you in full control of where your browser is allowed to connect, what type of data it is allowed to download, and what it is allowed to execute. Nobody else decides for you: You choose. You are in full control of your privacy. *Voor gevorderde gebruikers.*
Out of the box, µMatrix works in relax block-all/allow-exceptionally mode, meaning web sites which require 3rd-party scripts are likely to be "broken". With two clicks, µMatrix can be set to work in allow-all/block-exceptionally mode, which generally will not break web sites. See https://github.com/gorhill/httpswitchboard/wiki/How-to-use-HTTP-Switchboard:-Two-opposing-views for more details on this topic. uMatrix geeft volledige controle over welke verbindingen uw browser mag maken, welk type gegevens de browser mag downloaden, en wat erin mag worden uitgevoerd. Niemand anders beslist het: het is uw keuze. U hebt de volledige controle over uw privacy.
Regarding the myth that "Chromium-based browsers can't reliably block javascript", see: https://github.com/gorhill/httpswitchboard/wiki/Blocking-javascript-execution-reliably-in-Chromium-based-browsers. Summary: Yes, javascript can be blocked reliably in Chromium. Direct na installatie werkt uMatrix in de modus alles-blokkeren/bij-uitzondering-blokkeren, wat inhoudt dat websites die scripts van derden nodig hebben waarschijnlijk niet goed worden weergegeven. Met twee muisklikken kan uMatrix worden ingesteld om in de modus alles-toestaan/bij-uitzondering-blokkeren te werken, waarmee websites doorgaans wel goed worden weergegeven. Zie https://github.com/gorhill/httpswitchboard/wiki/How-to-use-HTTP-Switchboard:-Two-opposing-views voor meer details over dit onderwerp.
* See ALL the remote connections, failed or attempted, depending on whether they were blocked or allowed (you decide). * Bekijk ALLE externe verbindingen, mislukte of gepoogde, afhankelijk van of deze werden geblokkeerd of toegestaan (u beslist).
* A single-click to whitelist/blacklist one or multiple classes of requests according to the destination and type of data (a blocked request will NEVER leave your browser). * Eén muisklik voor het whitelisten/blacklisten van een of meer aanvraagklassen volgens de bestemming en het type gegevens (een geblokkeerde aanvraag zal uw browser NOOIT verlaten).
* Efficient blacklisting: cookies won't leave your browser, javascript won't execute, plugins won't play, tracking pixels won't download, etc. * Efficiënt blacklisten: cookies verlaten uw browser niet, JavaScript wordt niet uitgevoerd, plug-ins worden niet afgespeeld, trackingpixels worden niet gedownload, etc.
* You do not have to solely rely on just one particular curated blacklist (arguably with many missing entries) outside which nothing else can be blocked: You are in full control. * U hoeft niet slechts op één bepaalde beheerde blacklist (betwistbaar met veel ontbrekende vermeldingen) te vertrouwen waarbuiten niets anders kan worden geblokkeerd: u hebt de volledige controle.
* Ease of use: µMatrix lets you easily whitelist/blacklist net requests which originate from within a web page according to a point-and-click matrix: * Gebruikersgemak: met uMatrix kunt u eenvoudig netwerkaanvragen die van een webpagina afkomstig zijn whitelisten/blacklisten, volgens een matrix via aanwijzen en klikken:
- domain names (left column) - domeinnamen (linkerkolom)
* from very specific * van zeer specifieke
* to very generic * tot zeer algemene
- type of requests (top row) - type aanvragen (bovenste rij)
* cookies * cookies
* CSS-related resources (stylesheets and web fonts) * CSS-gerelateerde bronnen (stijlbladen en weblettertypen)
* images * afbeeldingen
* plugins * plug-ins
* scripts * scripts
* XHR (requests made by scripts) * XHR (aanvragen door scripts)
* frames * frames
* others * overig
You can blacklist/whitelist a single cell, an entire row, a group of rows, an entire column, or the whole matrix with just one click. Met slechts één klik kunt u een enkele cel, een hele rij, een groep rijen, een hele kolom, of de hele matrix blacklisten/whitelisten.
µMatrix's filtering engine uses precedence logic to evaluate what is blocked/allowed according to which cells are blacklisted/whitelisted. For example, this allows you to whitelist a whole page with one click, without having to repeatedly whitelist whatever new data appear on the page. De filterengine van uMatrix gebruikt voorrangslogica voor het evalueren van wat er volgens de cellen die zijn geblacklist/gewhitelist is geblokkeerd/toegestaan. Hierdoor kunt u bijvoorbeeld met één klik een hele pagina whitelisten, zonder dat u dat herhaaldelijk moet doen bij nieuwe gegevens die op de pagina verschijnen.
All rules are scoped. For example, you can block `facebook.com` and `facebook.net` everywhere except when visiting a page on `www.facebook.com`. This way Facebook won't be able to build a profile of your browsing habits. Alle regels worden aan een bereik gerelateerd. U kunt bijvoorbeeld facebook.com en facebook.net overal blokkeren, behalve wanneer u een pagina op www.facebook.com bezoekt. Op deze manier zal Facebook geen profiel van uw surfgedrag kunnen opbouwen.
The goal of this extension is to make the allowing or blocking of web sites, wholly or partly, as straightforward as possible, so as to encourage users to care about their privacy. Het doel van deze extensie is om het toestaan of blokkeren van websites, geheel of gedeeltelijk, zo overzichtelijk mogelijk te maken en daarmee gebruikers aan te moedigen om op hun privacy te letten.
The extension comes with 3rd-party hosts files totaling over 58,000 distinct hostnames (lists can be selectively disabled/enabled according to your choice). Standaard bevat de extensie hosts-bestanden van derden met meer dan 62.000 afzonderlijke hostnamen (lijsten kunnen naar keuze selectief worden in- en uitgeschakeld).
Ultimately, you can choose however you browse the net: Uiteindelijk kunt u kiezen hoe u op het internet wilt surfen:
* Blacklist all by default, and whitelist as needed (default mode). * Alles standaard blacklisten, en whitelisten wanneer nodig (standaardmodus).
* Whitelist all by default, and blacklist as needed. * Alles standaard whitelisten, en blacklisten wanneer nodig.
Either way, you still benefit from the preset blacklists so that at least you get basic protection from trackers, malware sites, etc. Or you can disable all of these preset blacklists. In beide gevallen heb u voordeel van de vooraf geleverde blacklists, zodat u op zijn minst basisbescherming krijgt tegen trackers, malwaresites, etc. U kunt al deze vooraf geleverde blacklists ook uitschakelen.
Your choice. Uw keuze.
Randomly assembled documentation: https://github.com/gorhill/uMatrix/wiki Willekeurig samengestelde documentatie: https://github.com/gorhill/uMatrix/wiki
===== =====
FEEDBACK: Deze extensie is ook bruikbaar om te begrijpen wat de webpagina in uw browser doet, vaak zonder uw medeweten. U hebt de volledige mogelijkheid om te zien en te beslissen waarmee een webpagina communiceert, en deze communicatie tot bepaalde objectklassen binnen dezelfde pagina te beperken.
For any question/issue you might have, use the "Send Feedback" button on the right, in order for me to be able to answer readily. I can't answer directly to reviews, but I will be more than happy to answer you directly in the feedback section. Het getal dat in het pictogram van de extensie verschijnt, komt overeen met het totale aantal afzonderlijke geprobeerde aanvragen (geslaagd of niet, afhankelijk van of deze werden toegestaan of geblokkeerd) door de webpagina.
===== Klik eenvoudig op de juiste vermelding in de matrix om een onderdeel te white-, black- of graylisten. Graylisten houdt in dat de status geblokkeerd of toegestaan van een andere cel met hogere voorrang in de matrix wordt overgenomen.
BUGS, ISSUES, SUGEGSTIONS:
https://github.com/gorhill/uMatrix/issues
You are very welcomed to contribute your views on open issues and suggestions, various arguments for/against help me in deciding what is needed to improve the extension.
Ease of use is the primary goal. I've seen users give up on Firefox's NoScript because it gets too much in the way according to them, so rather than blame these users for poor security habits, I prefer to blame developers and this project is a tentative to address the issues which cause some users to give up on basic security.
This extension is also useful to understand what the web page in your browser is doing, often without your knowledge. You have full ability to see and decide with whom a web page communicates, and to restrict these communications to specific classes of objects within the web page. Rood vierkant = effectief geblacklist, m.a.w. aanvragen richting hun bedoelde eindbestemming worden voorkomen:
* Donkerrood vierkant: de domeinnaam en/of het type aanvraag is specifiek geblacklist.
* Vaalrood vierkant: de blacklist-status is overgenomen, omdat de vermelding is gegraylist.
The number which appear in the extension icon correspond to the total number of distinct requests attempted (successfully or not depending on whether these were allowed or blocked) by the web page. Groen vierkant = effectief gewhitelist, m.a.w. aanvragen mogen hun bedoelde eindbestemming bereiken:
* Donkergroen vierkant: de domeinnaam en/of het type aanvraag is specifiek gewhitelist.
* Vaalgroen vierkant: de whitelist-status is overgenomen, omdat de vermelding is gegraylist.
Simply click on the appropriate entry in the matrix in order to white-, black- or graylist a component. Graylisting means the blocked or allowed status will be inherited from another cell with higher precedence in the matrix. De cel in de linkerbovenhoek van de matrix, de cel alle, vertegenwoordigt de algemene standaardinstelling waarmee u kunt kiezen of alles toestaan of blokkeren het standaardgedrag is. Sommige gebruikers geven de voorkeur aan alles toestaan en bij uitzondering blokkeren. Mijn persoonlijke voorkeur is natuurlijk het omgekeerde, alles blokkeren en bij uitzondering toestaan.
Red square = effectively blacklisted, i.e. requests are prevented from reaching their intended destination: Deze extensie is ook nuttig als u het browsen wilt versnellen, bijvoorbeeld door alle aanvragen voor afbeeldingen overal te blokkeren.
* Dark red square: the domain name and/or type of request is specifically blacklisted.
* Faded red square: the blacklist status is inherited because the entry is graylisted.
Green square = effectively whitelisted, i.e. requests are allowed to reach their intended destination:
* Dark green square: the domain name and/or type of request is specifically whitelisted.
* Faded green square: the whitelist status is inherited because the entry is graylisted.
The top-left cell in the matrix, the "all" cell, represents the default global setting, which allows you to choose whether allowing or blocking everything is the default behavior. Some prefer to allow everything while blocking exceptionally. My personal preference is of course the reverse, blocking everything and allowing exceptionally.
This extension is also useful if you wish to speed up your browsing, by globally blocking all requests for images as an example.
===== =====
SOURCE CODE: https://github.com/gorhill/uMatrix (GPLv3) BUGS, PROBLEMEN: https://github.com/gorhill/uMatrix/issues
BRONCODE: https://github.com/gorhill/uMatrix (GPLv3)
CHANGE LOG: https://github.com/gorhill/uMatrix/releases CHANGELOG: https://github.com/gorhill/uMatrix/releases

@ -10,7 +10,7 @@ Out of the box, uMatrix works in relax block-all/allow-exceptionally mode, meani
* A single-click to whitelist/blacklist one or multiple classes of requests according to the destination and type of data (a blocked request will NEVER leave your browser). * A single-click to whitelist/blacklist one or multiple classes of requests according to the destination and type of data (a blocked request will NEVER leave your browser).
* Efficient blacklisting: cookies won't leave your browser, JavaScript won't execute, plugins won't play, tracking pixels won't download, etc. * Efficient blacklisting: cookies won't leave your browser, JavaScript won't execute, media won't play, tracking pixels won't download, etc.
* You do not have to solely rely on just one particular curated blacklist (arguably with many missing entries) outside which nothing else can be blocked: You are in full control. * You do not have to solely rely on just one particular curated blacklist (arguably with many missing entries) outside which nothing else can be blocked: You are in full control.
@ -22,11 +22,11 @@ Out of the box, uMatrix works in relax block-all/allow-exceptionally mode, meani
- type of requests (top row) - type of requests (top row)
* cookies * cookies
* CSS-related resources (stylesheets and web fonts) * css (stylesheets and web fonts)
* images * images
* plugins * media
* scripts * scripts
* XHR (requests made by scripts) * xhr (requests made by scripts)
* frames * frames
* others * others
@ -56,7 +56,7 @@ Randomly assembled documentation: https://github.com/gorhill/uMatrix/wiki
This extension is also useful to understand what the web page in your browser is doing, often without your knowledge. You have full ability to see and decide with whom a web page communicates, and to restrict these communications to specific classes of objects within the web page. This extension is also useful to understand what the web page in your browser is doing, often without your knowledge. You have full ability to see and decide with whom a web page communicates, and to restrict these communications to specific classes of objects within the web page.
The number which appear in the extension icon correspond to the total number of distinct requests attempted (successfully or not depending on whether these were allowed or blocked) by the web page. The number which appears in the extension icon correspond to the total number of distinct requests blocked by the extension.
Simply click on the appropriate entry in the matrix in order to white-, black- or graylist a component. Graylisting means the blocked or allowed status will be inherited from another cell with higher precedence in the matrix. Simply click on the appropriate entry in the matrix in order to white-, black- or graylist a component. Graylisting means the blocked or allowed status will be inherited from another cell with higher precedence in the matrix.
@ -74,7 +74,7 @@ This extension is also useful if you wish to speed up your browsing, by globally
===== =====
BUGS, ISSUES: https://github.com/gorhill/uMatrix/issues BUGS, ISSUES: https://github.com/uBlockOrigin/uMatrix-issues/issues
SOURCE CODE: https://github.com/gorhill/uMatrix (GPLv3) SOURCE CODE: https://github.com/gorhill/uMatrix (GPLv3)

@ -1,8 +1,8 @@
{ {
"manifest_version": 2, "manifest_version": 2,
"name": "uMatrix", "name": "nuTensor",
"short_name": "uMatrix", "short_name": "nuTensor",
"version": "0.9.1.2", "version": "1.3.3.8",
"description": "__MSG_extShortDesc__", "description": "__MSG_extShortDesc__",
"icons": { "icons": {
"16": "img/icon_16.png", "16": "img/icon_16.png",
@ -12,64 +12,36 @@
"default_icon": { "default_icon": {
"19": "img/browsericons/icon19-19.png" "19": "img/browsericons/icon19-19.png"
}, },
"default_title": "uMatrix", "default_title": "nuTensor",
"default_popup": "popup.html" "default_popup": "popup.html"
}, },
"author": "Raymond Hill", "author": "Raymond Hill",
"background": { "background": {
"page": "background.html" "page": "background.html"
}, },
"commands": {
"revert-all": {
"description": "__MSG_commandRevertAll__",
"suggested_key": {
"default": "Alt+Q",
"mac": "Command+Shift+Q"
}
},
"whitelist-all": {
"description": "__MSG_commandWhitelistAll__",
"suggested_key": {
"default": "Alt+A",
"mac": "Command+Shift+A"
}
},
"whitelist-page-domain": {
"description": "__MSG_commandWhitelistPageDomain__",
"suggested_key": {
"default": "Alt+W",
"mac": "Command+Shift+W"
}
},
"open-dashboard": {
"description": "__MSG_commandOpenDashboard__",
"suggested_key": {
"default": "Alt+S",
"mac": "Command+Shift+S"
}
}
},
"content_scripts": [ "content_scripts": [
{ {
"matches": ["http://*/*", "https://*/*"], "matches": ["http://*/*", "https://*/*"],
"js": ["js/vapi-client.js", "js/contentscript-start.js"], "js": ["/js/vapi.js", "/js/vapi-client.js", "/js/contentscript-start.js"],
"run_at": "document_start", "run_at": "document_start",
"all_frames": true "all_frames": true
}, },
{ {
"matches": ["http://*/*", "https://*/*"], "matches": ["http://*/*", "https://*/*"],
"js": ["js/contentscript-end.js"], "js": ["/js/contentscript.js"],
"run_at": "document_end", "run_at": "document_end",
"all_frames": true "all_frames": true
} }
], ],
"default_locale": "en", "default_locale": "en",
"homepage_url": "https://github.com/gorhill/uMatrix/wiki", "homepage_url": "https://github.com/geekprojects/nuTensor",
"minimum_chrome_version": "22.0", "minimum_chrome_version": "45.0",
"options_page": "dashboard.html", "options_ui": {
"page": "dashboard.html",
"open_in_tab": true
},
"permissions": [ "permissions": [
"browsingData", "browsingData",
"contentSettings",
"cookies", "cookies",
"privacy", "privacy",
"storage", "storage",
@ -78,7 +50,6 @@
"webNavigation", "webNavigation",
"webRequest", "webRequest",
"webRequestBlocking", "webRequestBlocking",
"http://*/*", "<all_urls>"
"https://*/*"
] ]
} }

@ -1,9 +0,0 @@
<!DOCTYPE html>
<head>
<script src="js/vapi-client.js"></script>
<script src="js/options_ui.js"></script>
<title></title>
</head>
<body>
</body>
</html>

File diff suppressed because it is too large Load Diff

@ -0,0 +1,308 @@
/*******************************************************************************
uBlock Origin - a browser extension to block requests.
Copyright (C) 2019-present Raymond Hill
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see {http://www.gnu.org/licenses/}.
Home: https://github.com/gorhill/uBlock
*/
// For non-background page
'use strict';
/******************************************************************************/
// Direct messaging connection ability
(( ) => {
// >>>>>>>> start of private namespace
if (
typeof vAPI !== 'object' ||
vAPI.messaging instanceof Object === false ||
vAPI.MessagingConnection instanceof Function
) {
return;
}
const listeners = new Set();
const connections = new Map();
vAPI.MessagingConnection = class {
constructor(handler, details) {
this.messaging = vAPI.messaging;
this.handler = handler;
this.id = details.id;
this.to = details.to;
this.toToken = details.toToken;
this.from = details.from;
this.fromToken = details.fromToken;
this.checkTimer = undefined;
// On Firefox it appears ports are not automatically disconnected
// when navigating to another page.
const ctor = vAPI.MessagingConnection;
if ( ctor.pagehide !== undefined ) { return; }
ctor.pagehide = ( ) => {
for ( const connection of connections.values() ) {
connection.disconnect();
connection.handler(
connection.toDetails('connectionBroken')
);
}
};
window.addEventListener('pagehide', ctor.pagehide);
}
toDetails(what, payload) {
return {
what: what,
id: this.id,
from: this.from,
fromToken: this.fromToken,
to: this.to,
toToken: this.toToken,
payload: payload
};
}
disconnect() {
if ( this.checkTimer !== undefined ) {
clearTimeout(this.checkTimer);
this.checkTimer = undefined;
}
connections.delete(this.id);
const port = this.messaging.getPort();
if ( port === null ) { return; }
port.postMessage({
channel: 'vapi',
msg: this.toDetails('connectionBroken'),
});
}
checkAsync() {
if ( this.checkTimer !== undefined ) {
clearTimeout(this.checkTimer);
}
this.checkTimer = vAPI.setTimeout(
( ) => { this.check(); },
499
);
}
check() {
this.checkTimer = undefined;
if ( connections.has(this.id) === false ) { return; }
const port = this.messaging.getPort();
if ( port === null ) { return; }
port.postMessage({
channel: 'vapi',
msg: this.toDetails('connectionCheck'),
});
this.checkAsync();
}
receive(details) {
switch ( details.what ) {
case 'connectionAccepted':
this.toToken = details.toToken;
this.handler(details);
this.checkAsync();
break;
case 'connectionBroken':
connections.delete(this.id);
this.handler(details);
break;
case 'connectionMessage':
this.handler(details);
this.checkAsync();
break;
case 'connectionCheck':
const port = this.messaging.getPort();
if ( port === null ) { return; }
if ( connections.has(this.id) ) {
this.checkAsync();
} else {
details.what = 'connectionBroken';
port.postMessage({ channel: 'vapi', msg: details });
}
break;
case 'connectionRefused':
connections.delete(this.id);
this.handler(details);
break;
}
}
send(payload) {
const port = this.messaging.getPort();
if ( port === null ) { return; }
port.postMessage({
channel: 'vapi',
msg: this.toDetails('connectionMessage', payload),
});
}
static addListener(listener) {
listeners.add(listener);
}
static async connectTo(from, to, handler) {
const port = vAPI.messaging.getPort();
if ( port === null ) { return; }
const connection = new vAPI.MessagingConnection(handler, {
id: `${from}-${to}-${vAPI.sessionId}`,
to: to,
from: from,
fromToken: port.name
});
connections.set(connection.id, connection);
port.postMessage({
channel: 'vapi',
msg: {
what: 'connectionRequested',
id: connection.id,
from: from,
fromToken: port.name,
to: to,
}
});
return connection.id;
}
static disconnectFrom(connectionId) {
const connection = connections.get(connectionId);
if ( connection === undefined ) { return; }
connection.disconnect();
}
static sendTo(connectionId, payload) {
const connection = connections.get(connectionId);
if ( connection === undefined ) { return; }
connection.send(payload);
}
static canDestroyPort() {
return listeners.length === 0 && connections.size === 0;
}
static mustDestroyPort() {
if ( connections.size === 0 ) { return; }
for ( const connection of connections.values() ) {
connection.receive({ what: 'connectionBroken' });
}
connections.clear();
}
static canProcessMessage(details) {
if ( details.channel !== 'vapi' ) { return; }
switch ( details.msg.what ) {
case 'connectionAccepted':
case 'connectionBroken':
case 'connectionCheck':
case 'connectionMessage':
case 'connectionRefused': {
const connection = connections.get(details.msg.id);
if ( connection === undefined ) { break; }
connection.receive(details.msg);
return true;
}
case 'connectionRequested':
if ( listeners.length === 0 ) { return; }
const port = vAPI.messaging.getPort();
if ( port === null ) { break; }
let listener, result;
for ( listener of listeners ) {
result = listener(details.msg);
if ( result !== undefined ) { break; }
}
if ( result === undefined ) { break; }
if ( result === true ) {
details.msg.what = 'connectionAccepted';
details.msg.toToken = port.name;
const connection = new vAPI.MessagingConnection(
listener,
details.msg
);
connections.set(connection.id, connection);
} else {
details.msg.what = 'connectionRefused';
}
port.postMessage(details);
return true;
default:
break;
}
}
};
vAPI.messaging.extensions.push(vAPI.MessagingConnection);
// <<<<<<<< end of private namespace
})();
/******************************************************************************/
// Broadcast listening ability
(( ) => {
// >>>>>>>> start of private namespace
if (
typeof vAPI !== 'object' ||
vAPI.messaging instanceof Object === false ||
vAPI.broadcastListener instanceof Object
) {
return;
}
const listeners = new Set();
vAPI.broadcastListener = {
add: function(listener) {
listeners.add(listener);
vAPI.messaging.getPort();
},
remove: function(listener) {
listeners.delete(listener);
},
canDestroyPort() {
return listeners.size === 0;
},
mustDestroyPort() {
listeners.clear();
},
canProcessMessage(details) {
if ( details.broadcast === false ) { return; }
for ( const listener of listeners ) {
listener(details.msg);
}
},
};
vAPI.messaging.extensions.push(vAPI.broadcastListener);
// <<<<<<<< end of private namespace
})();
/******************************************************************************/
/*******************************************************************************
DO NOT:
- Remove the following code
- Add code beyond the following code
Reason:
- https://github.com/gorhill/uBlock/pull/3721
- uBO never uses the return value from injected content scripts
**/
void 0;

@ -1,7 +1,8 @@
/******************************************************************************* /*******************************************************************************
µBlock - a browser extension to block requests. uBlock Origin - a browser extension to block requests.
Copyright (C) 2014 The µBlock authors Copyright (C) 2014-2015 The uBlock Origin authors
Copyright (C) 2014-present Raymond Hill
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
@ -19,90 +20,56 @@
Home: https://github.com/gorhill/uBlock Home: https://github.com/gorhill/uBlock
*/ */
// For non background pages // For non-background page
/******************************************************************************/
(function(self) {
'use strict'; 'use strict';
/******************************************************************************/ /******************************************************************************/
var vAPI = self.vAPI = self.vAPI || {};
var chrome = self.chrome;
// https://github.com/chrisaljoudi/uBlock/issues/456 // https://github.com/chrisaljoudi/uBlock/issues/456
// Already injected? // Skip if already injected.
if ( vAPI.vapiClientInjected ) {
//console.debug('vapi-client.js already injected: skipping.');
return;
}
vAPI.vapiClientInjected = true;
vAPI.sessionId = String.fromCharCode(Date.now() % 25 + 97) + // >>>>>>>> start of HUGE-IF-BLOCK
Math.random().toString(36).slice(2); if (
vAPI.chrome = true; typeof vAPI === 'object' &&
vAPI.randomToken instanceof Function === false
) {
/******************************************************************************/
/******************************************************************************/ /******************************************************************************/
vAPI.shutdown = (function() { vAPI.randomToken = function() {
var jobs = []; const now = Date.now();
return String.fromCharCode(now % 26 + 97) +
var add = function(job) { Math.floor((1 + Math.random()) * now).toString(36);
jobs.push(job); };
};
var exec = function() {
//console.debug('Shutting down...');
var job;
while ( job = jobs.pop() ) {
job();
}
};
return { vAPI.sessionId = vAPI.randomToken();
add: add, vAPI.setTimeout = vAPI.setTimeout || self.setTimeout.bind(self);
exec: exec
};
})();
/******************************************************************************/ /******************************************************************************/
var messagingConnector = function(response) { vAPI.shutdown = {
if ( !response ) { jobs: [],
return; add: function(job) {
} this.jobs.push(job);
},
var channels = vAPI.messaging.channels; exec: function() {
var channel, listener; // Shutdown asynchronously, to ensure shutdown jobs are called from
// the top context.
if ( response.broadcast === true && !response.channelName ) { self.requestIdleCallback(( ) => {
for ( channel in channels ) { const jobs = this.jobs.slice();
if ( channels.hasOwnProperty(channel) === false ) { this.jobs.length = 0;
continue; while ( jobs.length !== 0 ) {
} (jobs.pop())();
listener = channels[channel].listener;
if ( typeof listener === 'function' ) {
listener(response.msg);
} }
});
},
remove: function(job) {
let pos;
while ( (pos = this.jobs.indexOf(job)) !== -1 ) {
this.jobs.splice(pos, 1);
} }
return;
}
if ( response.requestId ) {
listener = vAPI.messaging.listeners[response.requestId];
delete vAPI.messaging.listeners[response.requestId];
delete response.requestId;
}
if ( !listener ) {
channel = channels[response.channelName];
listener = channel && channel.listener;
}
if ( typeof listener === 'function' ) {
listener(response.msg);
} }
}; };
@ -110,82 +77,192 @@ var messagingConnector = function(response) {
vAPI.messaging = { vAPI.messaging = {
port: null, port: null,
channels: {}, portTimer: null,
listeners: {}, portTimerDelay: 10000,
requestId: 1, extended: undefined,
extensions: [],
setup: function() { msgIdGenerator: 1,
this.port = chrome.runtime.connect({name: vAPI.sessionId}); pending: new Map(),
this.port.onMessage.addListener(messagingConnector); shuttingDown: false,
shutdown: function() {
this.shuttingDown = true;
this.destroyPort();
}, },
close: function() { // https://github.com/uBlockOrigin/uBlock-issues/issues/403
if ( this.port === null ) { // Spurious disconnection can happen, so do not consider such events
return; // as world-ending, i.e. stay around. Except for embedded frames.
}
this.port.disconnect(); disconnectListener: function() {
this.port.onMessage.removeListener(messagingConnector);
this.port = null; this.port = null;
this.channels = {}; if ( window !== window.top ) {
this.listeners = {}; vAPI.shutdown.exec();
}
},
disconnectListenerBound: null,
messageListener: function(details) {
if ( details instanceof Object === false ) { return; }
// Response to specific message previously sent
if ( details.msgId !== undefined ) {
const resolver = this.pending.get(details.msgId);
if ( resolver !== undefined ) {
this.pending.delete(details.msgId);
resolver(details.msg);
return;
}
}
// Unhandled messages
this.extensions.every(ext => ext.canProcessMessage(details) !== true);
},
messageListenerBound: null,
canDestroyPort: function() {
return this.pending.size === 0 &&
(
this.extensions.length === 0 ||
this.extensions.every(e => e.canDestroyPort())
);
},
mustDestroyPort: function() {
if ( this.extensions.length === 0 ) { return; }
this.extensions.forEach(e => e.mustDestroyPort());
this.extensions.length = 0;
}, },
channel: function(channelName, callback) { portPoller: function() {
if ( !channelName ) { this.portTimer = null;
return; if ( this.port !== null && this.canDestroyPort() ) {
return this.destroyPort();
} }
this.portTimer = vAPI.setTimeout(this.portPollerBound, this.portTimerDelay);
this.portTimerDelay = Math.min(this.portTimerDelay * 2, 60 * 60 * 1000);
},
portPollerBound: null,
this.channels[channelName] = { destroyPort: function() {
channelName: channelName, if ( this.portTimer !== null ) {
listener: typeof callback === 'function' ? callback : null, clearTimeout(this.portTimer);
send: function(message, callback) { this.portTimer = null;
if ( vAPI.messaging.port === null ) { }
vAPI.messaging.setup(); const port = this.port;
} if ( port !== null ) {
port.disconnect();
message = { port.onMessage.removeListener(this.messageListenerBound);
channelName: this.channelName, port.onDisconnect.removeListener(this.disconnectListenerBound);
msg: message this.port = null;
}; }
this.mustDestroyPort();
if ( callback ) { // service pending callbacks
message.requestId = vAPI.messaging.requestId++; if ( this.pending.size !== 0 ) {
vAPI.messaging.listeners[message.requestId] = callback; const pending = this.pending;
} this.pending = new Map();
for ( const resolver of pending.values() ) {
vAPI.messaging.port.postMessage(message); resolver();
},
close: function() {
delete vAPI.messaging.channels[this.channelName];
if ( Object.keys(vAPI.messaging.channels).length === 0 ) {
vAPI.messaging.close();
}
} }
}; }
},
return this.channels[channelName]; createPort: function() {
} if ( this.shuttingDown ) { return null; }
if ( this.messageListenerBound === null ) {
this.messageListenerBound = this.messageListener.bind(this);
this.disconnectListenerBound = this.disconnectListener.bind(this);
this.portPollerBound = this.portPoller.bind(this);
}
try {
this.port = browser.runtime.connect({name: vAPI.sessionId}) || null;
} catch (ex) {
this.port = null;
}
// Not having a valid port at this point means the main process is
// not available: no point keeping the content scripts alive.
if ( this.port === null ) {
vAPI.shutdown.exec();
return null;
}
this.port.onMessage.addListener(this.messageListenerBound);
this.port.onDisconnect.addListener(this.disconnectListenerBound);
this.portTimerDelay = 10000;
if ( this.portTimer === null ) {
this.portTimer = vAPI.setTimeout(
this.portPollerBound,
this.portTimerDelay
);
}
return this.port;
},
getPort: function() {
return this.port !== null ? this.port : this.createPort();
},
send: function(channel, msg) {
// Too large a gap between the last request and the last response means
// the main process is no longer reachable: memory leaks and bad
// performance become a risk -- especially for long-lived, dynamic
// pages. Guard against this.
if ( this.pending.size > 50 ) {
vAPI.shutdown.exec();
}
const port = this.getPort();
if ( port === null ) {
return Promise.resolve();
}
const msgId = this.msgIdGenerator++;
const promise = new Promise(resolve => {
this.pending.set(msgId, resolve);
});
port.postMessage({ channel, msgId, msg });
return promise;
},
// Dynamically extend capabilities.
extend: function() {
if ( this.extended === undefined ) {
this.extended = vAPI.messaging.send('vapi', {
what: 'extendClient'
}).then(( ) => {
return self.vAPI instanceof Object &&
this.extensions.length !== 0;
}).catch(( ) => {
});
}
return this.extended;
},
}; };
vAPI.shutdown.add(( ) => {
vAPI.messaging.shutdown();
window.vAPI = undefined;
});
/******************************************************************************/
/******************************************************************************/ /******************************************************************************/
// No need to have vAPI client linger around after shutdown if
// we are not a top window (because element picker can still
// be injected in top window).
if ( window !== window.top ) {
vAPI.shutdown.add(function() {
vAPI = null;
});
} }
// <<<<<<<< end of HUGE-IF-BLOCK
/******************************************************************************/
vAPI.setTimeout = vAPI.setTimeout || function(callback, delay) {
setTimeout(function() { callback(); }, delay);
};
/******************************************************************************/
})(this);
/******************************************************************************/
/*******************************************************************************
DO NOT:
- Remove the following code
- Add code beyond the following code
Reason:
- https://github.com/gorhill/uBlock/pull/3721
- uBO never uses the return value from injected content scripts
**/
void 0;

@ -1,7 +1,7 @@
/******************************************************************************* /*******************************************************************************
µMatrix - a browser extension to block requests. uMatrix - a browser extension to black/white list requests.
Copyright (C) 2014 The µBlock authors Copyright (C) 2014-present The uMatrix/uBlock Origin authors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
@ -21,64 +21,200 @@
// For background page or non-background pages // For background page or non-background pages
/* global self */ 'use strict';
/******************************************************************************/ /******************************************************************************/
/******************************************************************************/ /******************************************************************************/
(function() { vAPI.T0 = Date.now();
'use strict';
/******************************************************************************/ /******************************************************************************/
var vAPI = self.vAPI = self.vAPI || {}; vAPI.setTimeout = vAPI.setTimeout || self.setTimeout.bind(self);
var chrome = self.chrome;
/******************************************************************************/ /******************************************************************************/
// http://www.w3.org/International/questions/qa-scripts#directions vAPI.webextFlavor = {
major: 0,
var setScriptDirection = function(language) { soup: new Set()
document.body.setAttribute(
'dir',
['ar', 'he', 'fa', 'ps', 'ur'].indexOf(language) !== -1 ? 'rtl' : 'ltr'
);
}; };
/******************************************************************************/ (( ) => {
const ua = navigator.userAgent;
const flavor = vAPI.webextFlavor;
const soup = flavor.soup;
const dispatch = function() {
window.dispatchEvent(new CustomEvent('webextFlavor'));
};
vAPI.download = function(details) { // This is always true.
if ( !details.url ) { soup.add('ublock').add('webext');
// Whether this is a dev build.
if ( /^\d+\.\d+\.\d+\D/.test(browser.runtime.getManifest().version) ) {
soup.add('devbuild');
}
if ( /\bMobile\b/.test(ua) ) {
soup.add('mobile');
}
// Asynchronous
if (
browser instanceof Object &&
typeof browser.runtime.getBrowserInfo === 'function'
) {
browser.runtime.getBrowserInfo().then(info => {
flavor.major = parseInt(info.version, 10) || 60;
soup.add(info.vendor.toLowerCase())
.add(info.name.toLowerCase());
if ( soup.has('firefox') && flavor.major < 57 ) {
soup.delete('html_filtering');
}
dispatch();
});
if ( browser.runtime.getURL('').startsWith('moz-extension://') ) {
soup.add('mozilla')
.add('firefox')
.add('user_stylesheet')
.add('html_filtering');
flavor.major = 60;
}
return; return;
} }
var a = document.createElement('a'); // Synchronous -- order of tests is important
a.href = details.url; let match;
a.setAttribute('download', details.filename || ''); if ( (match = /\bEdge\/(\d+)/.exec(ua)) !== null ) {
a.dispatchEvent(new MouseEvent('click')); flavor.major = parseInt(match[1], 10) || 0;
}; soup.add('microsoft').add('edge');
} else if ( (match = /\bOPR\/(\d+)/.exec(ua)) !== null ) {
const reEx = /\bChrom(?:e|ium)\/([\d.]+)/;
if ( reEx.test(ua) ) { match = reEx.exec(ua); }
flavor.major = parseInt(match[1], 10) || 0;
soup.add('opera').add('chromium');
} else if ( (match = /\bChromium\/(\d+)/.exec(ua)) !== null ) {
flavor.major = parseInt(match[1], 10) || 0;
soup.add('chromium');
} else if ( (match = /\bChrome\/(\d+)/.exec(ua)) !== null ) {
flavor.major = parseInt(match[1], 10) || 0;
soup.add('google').add('chromium');
} else if ( (match = /\bSafari\/(\d+)/.exec(ua)) !== null ) {
flavor.major = parseInt(match[1], 10) || 0;
soup.add('apple').add('safari');
}
// https://github.com/gorhill/uBlock/issues/3588
if ( soup.has('chromium') && flavor.major >= 66 ) {
soup.add('user_stylesheet');
}
// Don't starve potential listeners
vAPI.setTimeout(dispatch, 97);
})();
/******************************************************************************/
{
const punycode = self.punycode;
const reCommonHostnameFromURL = /^https?:\/\/([0-9a-z_][0-9a-z._-]*[0-9a-z])\//;
const reAuthorityFromURI = /^(?:[^:\/?#]+:)?(\/\/[^\/?#]+)/;
const reHostFromNakedAuthority = /^[0-9a-z._-]+[0-9a-z]$/i;
const reHostFromAuthority = /^(?:[^@]*@)?([^:]+)(?::\d*)?$/;
const reIPv6FromAuthority = /^(?:[^@]*@)?(\[[0-9a-f:]+\])(?::\d*)?$/i;
const reMustNormalizeHostname = /[^0-9a-z._-]/;
vAPI.hostnameFromURI = function(uri) {
let matches = reCommonHostnameFromURL.exec(uri);
if ( matches !== null ) { return matches[1]; }
matches = reAuthorityFromURI.exec(uri);
if ( matches === null ) { return ''; }
const authority = matches[1].slice(2);
if ( reHostFromNakedAuthority.test(authority) ) {
return authority.toLowerCase();
}
matches = reHostFromAuthority.exec(authority);
if ( matches === null ) {
matches = reIPv6FromAuthority.exec(authority);
if ( matches === null ) { return ''; }
}
let hostname = matches[1];
while ( hostname.endsWith('.') ) {
hostname = hostname.slice(0, -1);
}
if ( reMustNormalizeHostname.test(hostname) ) {
hostname = punycode.toASCII(hostname.toLowerCase());
}
return hostname;
};
const reHostnameFromNetworkURL =
/^(?:http|ws|ftp)s?:\/\/([0-9a-z_][0-9a-z._-]*[0-9a-z])\//;
vAPI.hostnameFromNetworkURL = function(url) {
const matches = reHostnameFromNetworkURL.exec(url);
return matches !== null ? matches[1] : '';
};
const psl = self.publicSuffixList;
const reIPAddressNaive = /^\d+\.\d+\.\d+\.\d+$|^\[[\da-zA-Z:]+\]$/;
vAPI.domainFromHostname = function(hostname) {
return reIPAddressNaive.test(hostname)
? hostname
: psl.getDomain(hostname);
};
vAPI.domainFromURI = function(uri) {
return uri !== ''
? vAPI.domainFromHostname(vAPI.hostnameFromURI(uri))
: '';
};
}
/******************************************************************************/ /******************************************************************************/
vAPI.insertHTML = function(node, html) { vAPI.download = function(details) {
node.innerHTML = html; if ( !details.url ) { return; }
const a = document.createElement('a');
a.href = details.url;
a.setAttribute('download', details.filename || '');
a.setAttribute('type', 'text/plain');
a.dispatchEvent(new MouseEvent('click'));
}; };
/******************************************************************************/ /******************************************************************************/
vAPI.getURL = chrome.runtime.getURL; vAPI.getURL = browser.runtime.getURL;
/******************************************************************************/ /******************************************************************************/
vAPI.i18n = chrome.i18n.getMessage; vAPI.i18n = browser.i18n.getMessage;
setScriptDirection(vAPI.i18n('@@ui_locale')); // http://www.w3.org/International/questions/qa-scripts#directions
document.body.setAttribute(
'dir',
['ar', 'he', 'fa', 'ps', 'ur'].indexOf(vAPI.i18n('@@ui_locale')) !== -1
? 'rtl'
: 'ltr'
);
/******************************************************************************/ /******************************************************************************/
// https://github.com/gorhill/uBlock/issues/3057
// - webNavigation.onCreatedNavigationTarget become broken on Firefox when we
// try to make the popup panel close itself using the original
// `window.open('', '_self').close()`.
vAPI.closePopup = function() { vAPI.closePopup = function() {
window.open('','_self').close(); if ( vAPI.webextFlavor.soup.has('firefox') ) {
window.close();
return;
}
// TODO: try to figure why this was used instead of a plain window.close().
// https://github.com/gorhill/uBlock/commit/b301ac031e0c2e9a99cb6f8953319d44e22f33d2#diff-bc664f26b9c453e0d43a9379e8135c6a
window.open('', '_self').close();
}; };
/******************************************************************************/ /******************************************************************************/
@ -88,14 +224,56 @@ vAPI.closePopup = function() {
// This storage is optional, but it is nice to have, for a more polished user // This storage is optional, but it is nice to have, for a more polished user
// experience. // experience.
vAPI.localStorage = window.localStorage; // https://github.com/gorhill/uBlock/issues/2824
// Use a dummy localStorage if for some reasons it's not available.
// https://github.com/gorhill/uMatrix/issues/840
// Always use a wrapper to seamlessly handle exceptions
vAPI.localStorage = {
clear: function() {
try {
window.localStorage.clear();
} catch(ex) {
}
},
getItem: function(key) {
try {
return window.localStorage.getItem(key);
} catch(ex) {
}
return null;
},
removeItem: function(key) {
try {
window.localStorage.removeItem(key);
} catch(ex) {
}
},
setItem: function(key, value) {
try {
window.localStorage.setItem(key, value);
} catch(ex) {
}
}
};
/******************************************************************************/
vAPI.setTimeout = vAPI.setTimeout || window.setTimeout.bind(window);
/******************************************************************************/
})();
/******************************************************************************/
/*******************************************************************************
DO NOT:
- Remove the following code
- Add code beyond the following code
Reason:
- https://github.com/gorhill/uBlock/pull/3721
- uBO never uses the return value from injected content scripts
**/
void 0;

@ -0,0 +1,178 @@
/*******************************************************************************
uMatrix - a browser extension to block requests.
Copyright (C) 2017-present Raymond Hill
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see {http://www.gnu.org/licenses/}.
Home: https://github.com/gorhill/uMatrix
*/
// For background page
'use strict';
/******************************************************************************/
(( ) => {
// https://github.com/uBlockOrigin/uBlock-issues/issues/407
if ( vAPI.webextFlavor.soup.has('chromium') === false ) { return; }
const extToTypeMap = new Map([
['eot','font'],['otf','font'],['svg','font'],['ttf','font'],['woff','font'],['woff2','font'],
['mp3','media'],['mp4','media'],['webm','media'],
['gif','image'],['ico','image'],['jpeg','image'],['jpg','image'],['png','image'],['webp','image']
]);
const headerValue = (headers, name) => {
let i = headers.length;
while ( i-- ) {
if ( headers[i].name.toLowerCase() === name ) {
return headers[i].value.trim();
}
}
return '';
};
const parsedURL = new URL('https://www.example.org/');
// Extend base class to normalize as per platform.
vAPI.Net = class extends vAPI.Net {
constructor() {
super();
this.suspendedTabIds = new Set();
}
normalizeDetails(details) {
// Chromium 63+ supports the `initiator` property, which contains
// the URL of the origin from which the network request was made.
if (
typeof details.initiator === 'string' &&
details.initiator !== 'null'
) {
details.documentUrl = details.initiator;
}
let type = details.type;
if ( type === 'imageset' ) {
details.type = 'image';
return;
}
// The rest of the function code is to normalize type
if ( type !== 'other' ) { return; }
// Try to map known "extension" part of URL to request type.
parsedURL.href = details.url;
const path = parsedURL.pathname,
pos = path.indexOf('.', path.length - 6);
if ( pos !== -1 && (type = extToTypeMap.get(path.slice(pos + 1))) ) {
details.type = type;
return;
}
// Try to extract type from response headers if present.
if ( details.responseHeaders ) {
type = headerValue(details.responseHeaders, 'content-type');
if ( type.startsWith('font/') ) {
details.type = 'font';
return;
}
if ( type.startsWith('image/') ) {
details.type = 'image';
return;
}
if ( type.startsWith('audio/') || type.startsWith('video/') ) {
details.type = 'media';
return;
}
}
}
// https://www.reddit.com/r/uBlockOrigin/comments/9vcrk3/
// Some types can be mapped from 'other', thus include 'other' if and
// only if the caller is interested in at least one of those types.
denormalizeTypes(types) {
if ( types.length === 0 ) {
return Array.from(this.validTypes);
}
const out = new Set();
for ( const type of types ) {
if ( this.validTypes.has(type) ) {
out.add(type);
}
}
if ( out.has('other') === false ) {
for ( const type of extToTypeMap.values() ) {
if ( out.has(type) ) {
out.add('other');
break;
}
}
}
return Array.from(out);
}
suspendOneRequest(details) {
this.suspendedTabIds.add(details.tabId);
return { cancel: true };
}
unsuspendAllRequests() {
for ( const tabId of this.suspendedTabIds ) {
vAPI.tabs.reload(tabId);
}
this.suspendedTabIds.clear();
}
};
})();
/******************************************************************************/
// https://github.com/uBlockOrigin/uBlock-issues/issues/548
// Use `X-DNS-Prefetch-Control` to workaround Chromium's disregard of the
// setting "Predict network actions to improve page load performance".
vAPI.prefetching = (( ) => {
// https://github.com/uBlockOrigin/uBlock-issues/issues/407
if ( vAPI.webextFlavor.soup.has('chromium') === false ) { return; }
let listening = false;
const onHeadersReceived = function(details) {
details.responseHeaders.push({
name: 'X-DNS-Prefetch-Control',
value: 'off'
});
return { responseHeaders: details.responseHeaders };
};
return state => {
const wr = chrome.webRequest;
if ( state && listening ) {
wr.onHeadersReceived.removeListener(onHeadersReceived);
listening = false;
} else if ( !state && !listening ) {
wr.onHeadersReceived.addListener(
onHeadersReceived,
{
urls: [ 'http://*/*', 'https://*/*' ],
types: [ 'main_frame', 'sub_frame' ]
},
[ 'blocking', 'responseHeaders' ]
);
listening = true;
}
};
})();
/******************************************************************************/

@ -0,0 +1,86 @@
/*******************************************************************************
uMatrix - a browser extension to block requests.
Copyright (C) 2017-present Raymond Hill
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see {http://www.gnu.org/licenses/}.
Home: https://github.com/gorhill/uBlock
*/
'use strict';
/* global HTMLDocument, XMLDocument */
// For background page, auxiliary pages, and content scripts.
/******************************************************************************/
if ( self.browser instanceof Object ) {
self.chrome = self.browser;
} else {
self.browser = self.chrome;
}
/******************************************************************************/
// https://bugzilla.mozilla.org/show_bug.cgi?id=1408996#c9
var vAPI = self.vAPI; // jshint ignore:line
// https://github.com/chrisaljoudi/uBlock/issues/464
// https://github.com/chrisaljoudi/uBlock/issues/1528
// A XMLDocument can be a valid HTML document.
// https://github.com/gorhill/uBlock/issues/1124
// Looks like `contentType` is on track to be standardized:
// https://dom.spec.whatwg.org/#concept-document-content-type
// https://forums.lanik.us/viewtopic.php?f=64&t=31522
// Skip text/plain documents.
if (
(
document instanceof HTMLDocument ||
document instanceof XMLDocument &&
document.createElement('div') instanceof HTMLDivElement
) &&
(
/^image\/|^text\/plain/.test(document.contentType || '') === false
) &&
(
self.vAPI instanceof Object === false || vAPI.nuTensor !== true
)
) {
vAPI = self.vAPI = { nuTensor: true };
}
/*******************************************************************************
DO NOT:
- Remove the following code
- Add code beyond the following code
Reason:
- https://github.com/gorhill/uBlock/pull/3721
- uMatrix never uses the return value from injected content scripts
**/
void 0;

@ -0,0 +1,176 @@
/*******************************************************************************
uBlock Origin - a browser extension to block requests.
Copyright (C) 2019-present Raymond Hill
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see {http://www.gnu.org/licenses/}.
Home: https://github.com/gorhill/uBlock
*/
'use strict';
// `webext` is a promisified api of `chrome`. Entries are added as
// the promisification of uBO progress.
const webext = (( ) => { // jshint ignore:line
// >>>>> start of private scope
const noopFunc = ( ) => { };
const promisifyNoFail = function(thisArg, fnName, outFn = r => r) {
const fn = thisArg[fnName];
return function() {
return new Promise(resolve => {
fn.call(thisArg, ...arguments, function() {
if ( chrome.runtime.lastError instanceof Object ) {
void chrome.runtime.lastError.message;
}
resolve(outFn(...arguments));
});
});
};
};
const promisify = function(thisArg, fnName) {
const fn = thisArg[fnName];
return function() {
return new Promise((resolve, reject) => {
fn.call(thisArg, ...arguments, function() {
const lastError = chrome.runtime.lastError;
if ( lastError instanceof Object ) {
return reject(lastError.message);
}
resolve(...arguments);
});
});
};
};
const webext = {
// https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/browserAction
browserAction: {
setBadgeBackgroundColor: promisifyNoFail(chrome.browserAction, 'setBadgeBackgroundColor'),
setBadgeText: promisifyNoFail(chrome.browserAction, 'setBadgeText'),
setBadgeTextColor: noopFunc,
setIcon: promisifyNoFail(chrome.browserAction, 'setIcon'),
setTitle: promisifyNoFail(chrome.browserAction, 'setTitle'),
},
cookies: {
getAll: promisifyNoFail(chrome.cookies, 'getAll'),
remove: promisifyNoFail(chrome.cookies, 'remove'),
},
// https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/menus
/*
menus: {
create: function() {
return chrome.contextMenus.create(...arguments, ( ) => {
void chrome.runtime.lastError;
});
},
onClicked: chrome.contextMenus.onClicked,
remove: promisifyNoFail(chrome.contextMenus, 'remove'),
},
*/
// https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/privacy
privacy: {
},
// https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage
storage: {
// https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage/local
local: {
clear: promisify(chrome.storage.local, 'clear'),
get: promisify(chrome.storage.local, 'get'),
getBytesInUse: promisify(chrome.storage.local, 'getBytesInUse'),
remove: promisify(chrome.storage.local, 'remove'),
set: promisify(chrome.storage.local, 'set'),
},
},
// https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs
tabs: {
get: promisifyNoFail(chrome.tabs, 'get', tab => tab instanceof Object ? tab : null),
executeScript: promisifyNoFail(chrome.tabs, 'executeScript'),
insertCSS: promisifyNoFail(chrome.tabs, 'insertCSS'),
query: promisifyNoFail(chrome.tabs, 'query', tabs => Array.isArray(tabs) ? tabs : []),
reload: promisifyNoFail(chrome.tabs, 'reload'),
remove: promisifyNoFail(chrome.tabs, 'remove'),
update: promisifyNoFail(chrome.tabs, 'update', tab => tab instanceof Object ? tab : null),
},
// https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webNavigation
webNavigation: {
getFrame: promisify(chrome.webNavigation, 'getFrame'),
},
// https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/windows
windows: {
get: promisifyNoFail(chrome.windows, 'get', win => win instanceof Object ? win : null),
create: promisifyNoFail(chrome.windows, 'create', win => win instanceof Object ? win : null),
update: promisifyNoFail(chrome.windows, 'update', win => win instanceof Object ? win : null),
},
};
// browser.privacy entries
{
const settings = [
// https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/privacy/network
[ 'network', 'networkPredictionEnabled' ],
[ 'network', 'webRTCIPHandlingPolicy' ],
// https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/privacy/websites
[ 'websites', 'hyperlinkAuditingEnabled' ],
];
for ( const [ category, setting ] of settings ) {
let categoryEntry = webext.privacy[category];
if ( categoryEntry instanceof Object === false ) {
categoryEntry = webext.privacy[category] = {};
}
const settingEntry = categoryEntry[setting] = {};
const thisArg = chrome.privacy[category][setting];
settingEntry.clear = promisifyNoFail(thisArg, 'clear');
settingEntry.get = promisifyNoFail(thisArg, 'get');
settingEntry.set = promisifyNoFail(thisArg, 'set');
}
}
// https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage/managed
if ( chrome.storage.managed instanceof Object ) {
webext.storage.managed = {
get: promisify(chrome.storage.managed, 'get'),
};
}
// https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage/sync
if ( chrome.storage.sync instanceof Object ) {
webext.storage.sync = {
QUOTA_BYTES: chrome.storage.sync.QUOTA_BYTES,
QUOTA_BYTES_PER_ITEM: chrome.storage.sync.QUOTA_BYTES_PER_ITEM,
MAX_ITEMS: chrome.storage.sync.MAX_ITEMS,
MAX_WRITE_OPERATIONS_PER_HOUR: chrome.storage.sync.MAX_WRITE_OPERATIONS_PER_HOUR,
MAX_WRITE_OPERATIONS_PER_MINUTE: chrome.storage.sync.MAX_WRITE_OPERATIONS_PER_MINUTE,
clear: promisify(chrome.storage.sync, 'clear'),
get: promisify(chrome.storage.sync, 'get'),
getBytesInUse: promisify(chrome.storage.sync, 'getBytesInUse'),
remove: promisify(chrome.storage.sync, 'remove'),
set: promisify(chrome.storage.sync, 'set'),
};
}
// https://bugs.chromium.org/p/chromium/issues/detail?id=608854
if ( chrome.tabs.removeCSS instanceof Function ) {
webext.tabs.removeCSS = promisifyNoFail(chrome.tabs, 'removeCSS');
}
return webext;
// <<<<< end of private scope
})();

@ -1,156 +0,0 @@
/*******************************************************************************
µBlock - a browser extension to block requests.
Copyright (C) 2014 The µBlock authors
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see {http://www.gnu.org/licenses/}.
Home: https://github.com/gorhill/uMatrix
*/
/* global ADDON_UNINSTALL, APP_SHUTDOWN, APP_STARTUP */
/* exported startup, shutdown, install, uninstall */
'use strict';
/******************************************************************************/
// Accessing the context of the background page:
// var win = Services.appShell.hiddenDOMWindow.document.querySelector('iframe[src*=umatrix]').contentWindow;
let bgProcess;
let version;
const hostName = 'umatrix';
const restartListener = {
get messageManager() {
return Components.classes['@mozilla.org/parentprocessmessagemanager;1']
.getService(Components.interfaces.nsIMessageListenerManager);
},
receiveMessage: function() {
shutdown();
startup();
}
};
/******************************************************************************/
function startup(data, reason) {
if ( data !== undefined ) {
version = data.version;
}
let appShell = Components.classes['@mozilla.org/appshell/appShellService;1']
.getService(Components.interfaces.nsIAppShellService);
let onReady = function(e) {
if ( e ) {
this.removeEventListener(e.type, onReady);
}
let hiddenDoc = appShell.hiddenDOMWindow.document;
// https://github.com/gorhill/uBlock/issues/10
// Fixed by github.com/AlexVallat:
// https://github.com/chrisaljoudi/uBlock/issues/1149
// https://github.com/AlexVallat/uBlock/commit/e762a29d308caa46578cdc34a9be92c4ad5ecdd0
if ( hiddenDoc.readyState === 'loading' ) {
hiddenDoc.addEventListener('DOMContentLoaded', onReady);
return;
}
bgProcess = hiddenDoc.documentElement.appendChild(
hiddenDoc.createElementNS('http://www.w3.org/1999/xhtml', 'iframe')
);
bgProcess.setAttribute(
'src',
'chrome://' + hostName + '/content/background.html#' + version
);
restartListener.messageManager.addMessageListener(
hostName + '-restart',
restartListener
);
};
if ( reason !== APP_STARTUP ) {
onReady();
return;
}
let ww = Components.classes['@mozilla.org/embedcomp/window-watcher;1']
.getService(Components.interfaces.nsIWindowWatcher);
ww.registerNotification({
observe: function(win, topic) {
if ( topic !== 'domwindowopened' ) {
return;
}
try {
appShell.hiddenDOMWindow;
} catch (ex) {
return;
}
ww.unregisterNotification(this);
win.addEventListener('DOMContentLoaded', onReady);
}
});
}
/******************************************************************************/
function shutdown(data, reason) {
if ( reason === APP_SHUTDOWN ) {
return;
}
bgProcess.parentNode.removeChild(bgProcess);
if ( data === undefined ) {
return;
}
// Remove the restartObserver only when the extension is being disabled
restartListener.messageManager.removeMessageListener(
hostName + '-restart',
restartListener
);
}
/******************************************************************************/
function install() {
// https://bugzil.la/719376
Components.classes['@mozilla.org/intl/stringbundle;1']
.getService(Components.interfaces.nsIStringBundleService)
.flushBundles();
}
/******************************************************************************/
function uninstall(data, aReason) {
if ( aReason !== ADDON_UNINSTALL ) {
return;
}
// To cleanup vAPI.localStorage in vapi-common.js, aka
// "extensions.umatrix.*" in `about:config`.
Components.utils.import('resource://gre/modules/Services.jsm', null)
.Services.prefs
.getBranch('extensions.' + hostName + '.')
.deleteBranch('');
}
/******************************************************************************/

@ -1 +0,0 @@
content umatrix ./

@ -1,241 +0,0 @@
/*******************************************************************************
µBlock - a browser extension to block requests.
Copyright (C) 2014 The µBlock authors
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see {http://www.gnu.org/licenses/}.
Home: https://github.com/gorhill/uMatrix
*/
'use strict';
/******************************************************************************/
this.EXPORTED_SYMBOLS = ['contentObserver'];
const {interfaces: Ci, utils: Cu} = Components;
const {Services} = Cu.import('resource://gre/modules/Services.jsm', null);
const {XPCOMUtils} = Cu.import('resource://gre/modules/XPCOMUtils.jsm', null);
const hostName = Services.io.newURI(Components.stack.filename, null, null).host;
// Cu.import('resource://gre/modules/devtools/Console.jsm');
/******************************************************************************/
const getMessageManager = function(win) {
return win
.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDocShell)
.sameTypeRootTreeItem
.QueryInterface(Ci.nsIDocShell)
.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIContentFrameMessageManager);
};
/******************************************************************************/
const contentObserver = {
classDescription: 'content-policy for ' + hostName,
classID: Components.ID('{c84283d4-9975-41b7-b1a4-f106af56b51d}'),
contractID: '@' + hostName + '/content-policy;1',
ACCEPT: Ci.nsIContentPolicy.ACCEPT,
MAIN_FRAME: Ci.nsIContentPolicy.TYPE_DOCUMENT,
contentBaseURI: 'chrome://' + hostName + '/content/js/',
uniqueSandboxId: 1,
get componentRegistrar() {
return Components.manager.QueryInterface(Ci.nsIComponentRegistrar);
},
get categoryManager() {
return Components.classes['@mozilla.org/categorymanager;1']
.getService(Ci.nsICategoryManager);
},
QueryInterface: XPCOMUtils.generateQI([
Ci.nsIFactory,
Ci.nsIObserver,
Ci.nsIContentPolicy,
Ci.nsISupportsWeakReference
]),
createInstance: function(outer, iid) {
if ( outer ) {
throw Components.results.NS_ERROR_NO_AGGREGATION;
}
return this.QueryInterface(iid);
},
register: function() {
Services.obs.addObserver(this, 'document-element-inserted', true);
this.componentRegistrar.registerFactory(
this.classID,
this.classDescription,
this.contractID,
this
);
this.categoryManager.addCategoryEntry(
'content-policy',
this.contractID,
this.contractID,
false,
true
);
},
unregister: function() {
Services.obs.removeObserver(this, 'document-element-inserted');
this.componentRegistrar.unregisterFactory(this.classID, this);
this.categoryManager.deleteCategoryEntry(
'content-policy',
this.contractID,
false
);
},
// https://bugzil.la/612921
shouldLoad: function(type, location, origin, context) {
return this.ACCEPT;
},
initContentScripts: function(win, sandbox) {
let messager = getMessageManager(win);
let sandboxId = hostName + ':sb:' + this.uniqueSandboxId++;
if ( sandbox ) {
let sandboxName = [
win.location.href.slice(0, 100),
win.document.title.slice(0, 100)
].join(' | ');
sandbox = Cu.Sandbox([win], {
sandboxName: sandboxId + '[' + sandboxName + ']',
sandboxPrototype: win,
wantComponents: false,
wantXHRConstructor: false
});
sandbox.injectScript = function(script) {
Services.scriptloader.loadSubScript(script, sandbox);
};
}
else {
sandbox = win;
}
sandbox._sandboxId_ = sandboxId;
sandbox.sendAsyncMessage = messager.sendAsyncMessage;
sandbox.addMessageListener = function(callback) {
if ( sandbox._messageListener_ ) {
sandbox.removeMessageListener();
}
sandbox._messageListener_ = function(message) {
callback(message.data);
};
messager.addMessageListener(
sandbox._sandboxId_,
sandbox._messageListener_
);
messager.addMessageListener(
hostName + ':broadcast',
sandbox._messageListener_
);
};
sandbox.removeMessageListener = function() {
try {
messager.removeMessageListener(
sandbox._sandboxId_,
sandbox._messageListener_
);
messager.removeMessageListener(
hostName + ':broadcast',
sandbox._messageListener_
);
} catch (ex) {
// It throws sometimes, mostly when the popup closes
}
sandbox._messageListener_ = null;
};
return sandbox;
},
observe: function(doc) {
let win = doc.defaultView;
if ( !win ) {
return;
}
let loc = win.location;
if ( !loc ) {
return;
}
// https://github.com/gorhill/uBlock/issues/260
// TODO: We may have to skip more types, for now let's be
// conservative, i.e. let's not test against `text/html`.
if ( doc.contentType.lastIndexOf('image/', 0) === 0 ) {
return;
}
if ( loc.protocol !== 'http:' && loc.protocol !== 'https:' && loc.protocol !== 'file:' ) {
if ( loc.protocol === 'chrome:' && loc.host === hostName ) {
this.initContentScripts(win);
}
// What about data: and about:blank?
return;
}
let lss = Services.scriptloader.loadSubScript;
let sandbox = this.initContentScripts(win, true);
// Can throw with attempts at injecting into non-HTML document.
// Example: https://a.pomf.se/avonjf.webm
try {
lss(this.contentBaseURI + 'vapi-client.js', sandbox);
lss(this.contentBaseURI + 'contentscript-start.js', sandbox);
} catch (ex) {
return; // don't further try to inject anything
}
let docReady = (e) => {
let doc = e.target;
doc.removeEventListener(e.type, docReady, true);
lss(this.contentBaseURI + 'contentscript-end.js', sandbox);
};
if ( doc.readyState === 'loading') {
doc.addEventListener('DOMContentLoaded', docReady, true);
} else {
docReady({ target: doc, type: 'DOMContentLoaded' });
}
}
};
/******************************************************************************/
contentObserver.register();
/******************************************************************************/

@ -1,61 +0,0 @@
/*******************************************************************************
µBlock - a browser extension to block requests.
Copyright (C) 2014 The µBlock authors
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see {http://www.gnu.org/licenses/}.
Home: https://github.com/gorhill/uMatrix
*/
/******************************************************************************/
(function() {
'use strict';
/******************************************************************************/
let {contentObserver} = Components.utils.import(
Components.stack.filename.replace('Script', 'Module'),
null
);
let injectContentScripts = function(win) {
if ( !win || !win.document ) {
return;
}
contentObserver.observe(win.document);
if ( win.frames && win.frames.length ) {
let i = win.frames.length;
while ( i-- ) {
injectContentScripts(win.frames[i]);
}
}
};
let onLoadCompleted = function() {
removeMessageListener('umatrix-load-completed', onLoadCompleted);
injectContentScripts(content);
};
addMessageListener('umatrix-load-completed', onLoadCompleted);
/******************************************************************************/
})();
/******************************************************************************/

Binary file not shown.

Before

Width:  |  Height:  |  Size: 750 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 777 B

@ -1,25 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<r:RDF xmlns:r="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.mozilla.org/2004/em-rdf#">
<r:Description about="urn:mozilla:install-manifest">
<id>uMatrix@raymondhill.net</id>
<version>{version}</version>
<name>{name}</name>
<description>{description}</description>
<homepageURL>{homepage}</homepageURL>
<creator>{author}</creator>
<type>2</type>
<bootstrap>true</bootstrap>
<multiprocessCompatible>true</multiprocessCompatible>
<optionsType>2</optionsType>
{localized}
<!-- Firefox -->
<targetApplication>
<r:Description>
<id>{{ec8030f7-c20a-464f-9b0e-13a3a9e97384}}</id>
<minVersion>35.0</minVersion>
<maxVersion>41.0</maxVersion>
</r:Description>
</targetApplication>
</r:Description>
</r:RDF>

@ -0,0 +1,69 @@
{
"browser_specific_settings": {
"gecko": {
"id": "nuTensor@geekprojects.com",
"strict_min_version": "60.0"
}
},
"author": "Raymond Hill",
"background": {
"page": "background.html"
},
"browser_action": {
"browser_style": false,
"default_icon": {
"19": "img/browsericons/icon19-off.png"
},
"default_title": "nuTensor",
"default_popup": "popup.html"
},
"content_scripts": [
{
"matches": ["http://*/*", "https://*/*"],
"js": ["/js/vapi.js", "/js/vapi-client.js", "/js/contentscript-start.js"],
"run_at": "document_start",
"all_frames": true
},
{
"matches": ["http://*/*", "https://*/*"],
"js": ["/js/contentscript.js"],
"run_at": "document_end",
"all_frames": true
}
],
"default_locale": "en",
"description": "__MSG_extShortDesc__",
"icons": {
"16": "img/icon_16.png",
"128": "img/icon_128.png"
},
"manifest_version": 2,
"name": "nuTensor",
"options_ui": {
"page":"dashboard.html",
"open_in_tab": true
},
"permissions": [
"browsingData",
"cookies",
"dns",
"privacy",
"storage",
"tabs",
"webNavigation",
"webRequest",
"webRequestBlocking",
"<all_urls>"
],
"short_name": "nuTensor",
"sidebar_action": {
"default_title": "__MSG_loggerPageName__",
"default_panel": "logger-ui.html",
"default_icon": {
"16": "img/icon_16.png",
"128": "img/icon_128.png"
},
"open_at_install": false
},
"version": "0.9.9"
}

@ -1,9 +0,0 @@
<?xml version="1.0" ?>
<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<setting type="control">
<vbox>
<button id="showDashboardButton"/>
<button id="showLoggerButton"/>
</vbox>
</setting>
</vbox>

File diff suppressed because it is too large Load Diff

@ -1,211 +0,0 @@
/*******************************************************************************
µBlock - a browser extension to block requests.
Copyright (C) 2014 The µBlock authors
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see {http://www.gnu.org/licenses/}.
Home: https://github.com/gorhill/uMatrix
*/
/* jshint boss: true, esnext: true */
/* global addMessageListener, removeMessageListener, sendAsyncMessage */
// For non background pages
/******************************************************************************/
(function(self) {
'use strict';
/******************************************************************************/
var vAPI = self.vAPI = self.vAPI || {};
vAPI.firefox = true;
vAPI.sessionId = String.fromCharCode(Date.now() % 25 + 97) +
Math.random().toString(36).slice(2);
/******************************************************************************/
vAPI.setTimeout = vAPI.setTimeout || function(callback, delay) {
return setTimeout(function() { callback(); }, delay);
};
/******************************************************************************/
vAPI.shutdown = (function() {
var jobs = [];
var add = function(job) {
jobs.push(job);
};
var exec = function() {
//console.debug('Shutting down...');
var job;
while ( job = jobs.pop() ) {
job();
}
};
return {
add: add,
exec: exec
};
})();
/******************************************************************************/
var messagingConnector = function(response) {
if ( !response ) {
return;
}
var channels = vAPI.messaging.channels;
var channel, listener;
if ( response.broadcast === true && !response.channelName ) {
for ( channel in channels ) {
if ( channels.hasOwnProperty(channel) === false ) {
continue;
}
listener = channels[channel].listener;
if ( typeof listener === 'function' ) {
listener(response.msg);
}
}
return;
}
if ( response.requestId ) {
listener = vAPI.messaging.listeners[response.requestId];
delete vAPI.messaging.listeners[response.requestId];
delete response.requestId;
}
if ( !listener ) {
channel = channels[response.channelName];
listener = channel && channel.listener;
}
if ( typeof listener === 'function' ) {
listener(response.msg);
}
};
/******************************************************************************/
vAPI.messaging = {
channels: {},
listeners: {},
requestId: 1,
setup: function() {
this.connector = function(msg) {
messagingConnector(JSON.parse(msg));
};
addMessageListener(this.connector);
this.channels.vAPI = {
listener: function(msg) {
if ( msg.cmd === 'injectScript' ) {
var details = msg.details;
if ( !details.allFrames && window !== window.top ) {
return;
}
self.injectScript(details.file);
}
}
};
},
close: function() {
if ( !this.connector ) {
return;
}
removeMessageListener();
this.connector = null;
this.channels = {};
this.listeners = {};
},
channel: function(channelName, callback) {
if ( !channelName ) {
return;
}
this.channels[channelName] = {
channelName: channelName,
listener: typeof callback === 'function' ? callback : null,
send: function(message, callback) {
if ( !vAPI.messaging.connector ) {
vAPI.messaging.setup();
}
message = {
channelName: self._sandboxId_ + '|' + this.channelName,
msg: message
};
if ( callback ) {
message.requestId = vAPI.messaging.requestId++;
vAPI.messaging.listeners[message.requestId] = callback;
}
sendAsyncMessage('umatrix:background', message);
},
close: function() {
delete vAPI.messaging.channels[this.channelName];
}
};
return this.channels[channelName];
},
toggleListener: function({type, persisted}) {
if ( !vAPI.messaging.connector ) {
return;
}
if ( type === 'pagehide' ) {
removeMessageListener();
return;
}
if ( persisted ) {
addMessageListener(vAPI.messaging.connector);
}
}
};
window.addEventListener('pagehide', vAPI.messaging.toggleListener, true);
window.addEventListener('pageshow', vAPI.messaging.toggleListener, true);
/******************************************************************************/
// No need to have vAPI client linger around after shutdown if
// we are not a top window (because element picker can still
// be injected in top window).
if ( window !== window.top ) {
// Can anything be done?
}
/******************************************************************************/
})(this);
/******************************************************************************/

@ -1,164 +0,0 @@
/*******************************************************************************
µBlock - a browser extension to block requests.
Copyright (C) 2014 The µBlock authors
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see {http://www.gnu.org/licenses/}.
Home: https://github.com/gorhill/uMatrix
*/
/* jshint esnext: true */
/* global sendAsyncMessage */
// For background page or non-background pages
/******************************************************************************/
(function() {
'use strict';
/******************************************************************************/
const {Services} = Components.utils.import(
'resource://gre/modules/Services.jsm',
null
);
self.vAPI = self.vAPI || {};
/******************************************************************************/
vAPI.setTimeout = vAPI.setTimeout || function(callback, delay) {
return setTimeout(function() { callback(); }, delay);
};
/******************************************************************************/
// http://www.w3.org/International/questions/qa-scripts#directions
var setScriptDirection = function(language) {
document.body.setAttribute(
'dir',
['ar', 'he', 'fa', 'ps', 'ur'].indexOf(language) !== -1 ? 'rtl' : 'ltr'
);
};
/******************************************************************************/
vAPI.download = function(details) {
if ( !details.url ) {
return;
}
var a = document.createElement('a');
a.href = details.url;
a.setAttribute('download', details.filename || '');
a.dispatchEvent(new MouseEvent('click'));
};
/******************************************************************************/
vAPI.insertHTML = (function() {
const parser = Components.classes['@mozilla.org/parserutils;1']
.getService(Components.interfaces.nsIParserUtils);
return function(node, html) {
while ( node.firstChild ) {
node.removeChild(node.firstChild);
}
node.appendChild(parser.parseFragment(
html,
parser.SanitizerAllowStyle,
false,
Services.io.newURI(document.baseURI, null, null),
document.documentElement
));
};
})();
/******************************************************************************/
vAPI.getURL = function(path) {
return 'chrome://' + location.host + '/content/' + path.replace(/^\/+/, '');
};
/******************************************************************************/
vAPI.i18n = (function() {
var stringBundle = Services.strings.createBundle(
'chrome://' + location.host + '/locale/messages.properties'
);
return function(s) {
try {
return stringBundle.GetStringFromName(s);
} catch (ex) {
return '';
}
};
})();
setScriptDirection(navigator.language);
/******************************************************************************/
vAPI.closePopup = function() {
sendAsyncMessage(location.host + ':closePopup');
};
/******************************************************************************/
// A localStorage-like object which should be accessible from the
// background page or auxiliary pages.
// This storage is optional, but it is nice to have, for a more polished user
// experience.
vAPI.localStorage = {
PB: Services.prefs.getBranch('extensions.' + location.host + '.'),
str: Components.classes['@mozilla.org/supports-string;1']
.createInstance(Components.interfaces.nsISupportsString),
getItem: function(key) {
try {
return this.PB.getComplexValue(
key,
Components.interfaces.nsISupportsString
).data;
} catch (ex) {
return null;
}
},
setItem: function(key, value) {
this.str.data = value;
this.PB.setComplexValue(
key,
Components.interfaces.nsISupportsString,
this.str
);
},
removeItem: function(key) {
this.PB.clearUserPref(key);
},
clear: function() {
this.PB.deleteBranch('');
}
};
/******************************************************************************/
})();
/******************************************************************************/

@ -1 +0,0 @@
/* Firefox: no platform-specific code */

@ -0,0 +1,263 @@
/*******************************************************************************
uMatrix - a browser extension to block requests.
Copyright (C) 2017-present Raymond Hill
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see {http://www.gnu.org/licenses/}.
Home: https://github.com/gorhill/uMatrix
*/
// For background page
'use strict';
/******************************************************************************/
(( ) => {
// https://github.com/uBlockOrigin/uBlock-issues/issues/407
if ( vAPI.webextFlavor.soup.has('firefox') === false ) { return; }
// https://github.com/gorhill/uBlock/issues/2950
// Firefox 56 does not normalize URLs to ASCII, uBO must do this itself.
// https://bugzilla.mozilla.org/show_bug.cgi?id=945240
const evalMustPunycode = ( ) => {
return vAPI.webextFlavor.soup.has('firefox') &&
vAPI.webextFlavor.major < 57;
};
let mustPunycode = evalMustPunycode();
// The real actual webextFlavor value may not be set in stone, so listen
// for possible future changes.
window.addEventListener('webextFlavor', ( ) => {
mustPunycode = evalMustPunycode();
}, { once: true });
const punycode = self.punycode;
const reAsciiHostname = /^https?:\/\/[0-9a-z_.:@-]+[/?#]/;
const parsedURL = new URL('about:blank');
// Related issues:
// - https://github.com/gorhill/uBlock/issues/1327
// - https://github.com/uBlockOrigin/uBlock-issues/issues/128
// - https://bugzilla.mozilla.org/show_bug.cgi?id=1503721
// Extend base class to normalize as per platform.
vAPI.Net = class extends vAPI.Net {
constructor() {
super();
this.pendingRequests = [];
this.cnames = new Map([ [ '', '' ] ]);
this.cnameIgnoreList = null;
this.cnameIgnore1stParty = true;
this.cnameIgnoreExceptions = true;
this.cnameIgnoreRootDocument = true;
this.cnameMaxTTL = 60;
this.cnameReplayFullURL = false;
this.cnameTimer = undefined;
this.canRevealCNAME = browser.dns instanceof Object;
}
setOptions(options) {
super.setOptions(options);
this.cnameIgnoreList = this.regexFromStrList(options.cnameIgnoreList);
this.cnameIgnore1stParty = options.cnameIgnore1stParty !== false;
this.cnameIgnoreExceptions = options.cnameIgnoreExceptions !== false;
this.cnameIgnoreRootDocument = options.cnameIgnoreRootDocument !== false;
this.cnameMaxTTL = options.cnameMaxTTL || 120;
this.cnameReplayFullURL = options.cnameReplayFullURL === true;
this.cnames.clear(); this.cnames.set('', '');
}
normalizeDetails(details) {
if ( mustPunycode && !reAsciiHostname.test(details.url) ) {
parsedURL.href = details.url;
details.url = details.url.replace(
parsedURL.hostname,
punycode.toASCII(parsedURL.hostname)
);
}
const type = details.type;
if ( type === 'imageset' ) {
details.type = 'image';
return;
}
// https://github.com/uBlockOrigin/uBlock-issues/issues/345
// Re-categorize an embedded object as a `sub_frame` if its
// content type is that of a HTML document.
if ( type === 'object' && Array.isArray(details.responseHeaders) ) {
for ( const header of details.responseHeaders ) {
if ( header.name.toLowerCase() === 'content-type' ) {
if ( header.value.startsWith('text/html') ) {
details.type = 'sub_frame';
}
break;
}
}
}
}
denormalizeTypes(types) {
if ( types.length === 0 ) {
return Array.from(this.validTypes);
}
const out = new Set();
for ( const type of types ) {
if ( this.validTypes.has(type) ) {
out.add(type);
}
if ( type === 'image' && this.validTypes.has('imageset') ) {
out.add('imageset');
}
if ( type === 'sub_frame' ) {
out.add('object');
}
}
return Array.from(out);
}
processCanonicalName(hn, cn, details) {
const hnBeg = details.url.indexOf(hn);
if ( hnBeg === -1 ) { return; }
const oldURL = details.url;
let newURL = oldURL.slice(0, hnBeg) + cn;
const hnEnd = hnBeg + hn.length;
if ( this.cnameReplayFullURL ) {
newURL += oldURL.slice(hnEnd);
} else {
const pathBeg = oldURL.indexOf('/', hnEnd);
if ( pathBeg !== -1 ) {
newURL += oldURL.slice(hnEnd, pathBeg + 1);
}
}
details.url = newURL;
details.aliasURL = oldURL;
return super.onBeforeSuspendableRequest(details);
}
recordCanonicalName(hn, record) {
let cname =
typeof record.canonicalName === 'string' &&
record.canonicalName !== hn
? record.canonicalName
: '';
if (
cname !== '' &&
this.cnameIgnore1stParty &&
vAPI.domainFromHostname(cname) === vAPI.domainFromHostname(hn)
) {
cname = '';
}
if (
cname !== '' &&
this.cnameIgnoreList !== null &&
this.cnameIgnoreList.test(cname)
) {
cname = '';
}
this.cnames.set(hn, cname);
if ( this.cnameTimer === undefined ) {
this.cnameTimer = self.setTimeout(
( ) => {
this.cnameTimer = undefined;
this.cnames.clear(); this.cnames.set('', '');
},
this.cnameMaxTTL * 60000
);
}
return cname;
}
regexFromStrList(list) {
if (
typeof list !== 'string' ||
list.length === 0 ||
list === 'unset' ||
browser.dns instanceof Object === false
) {
return null;
}
if ( list === '*' ) {
return /^./;
}
return new RegExp(
'(?:^|\.)(?:' +
list.trim()
.split(/\s+/)
.map(a => a.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'))
.join('|') +
')$'
);
}
onBeforeSuspendableRequest(details) {
const r = super.onBeforeSuspendableRequest(details);
if ( this.canRevealCNAME === false ) { return r; }
if ( r !== undefined ) {
if ( r.cancel === false ) { return; }
if (
r.cancel === true ||
r.redirectUrl !== undefined ||
this.cnameIgnoreExceptions
) {
return r;
}
}
if (
details.type === 'main_frame' &&
this.cnameIgnoreRootDocument
) {
return;
}
const hn = vAPI.hostnameFromNetworkURL(details.url);
const cname = this.cnames.get(hn);
if ( cname === '' ) { return; }
if ( cname !== undefined ) {
return this.processCanonicalName(hn, cname, details);
}
return browser.dns.resolve(hn, [ 'canonical_name' ]).then(
rec => {
const cname = this.recordCanonicalName(hn, rec);
if ( cname === '' ) { return; }
return this.processCanonicalName(hn, cname, details);
},
( ) => {
this.cnames.set(hn, '');
}
);
}
suspendOneRequest(details) {
const pending = {
details: Object.assign({}, details),
resolve: undefined,
promise: undefined
};
pending.promise = new Promise(resolve => {
pending.resolve = resolve;
});
this.pendingRequests.push(pending);
return pending.promise;
}
unsuspendAllRequests() {
const pendingRequests = this.pendingRequests;
this.pendingRequests = [];
for ( const entry of pendingRequests ) {
entry.resolve(this.onBeforeSuspendableRequest(entry.details));
}
}
canSuspend() {
return true;
}
};
})();
/******************************************************************************/

@ -0,0 +1,24 @@
/*******************************************************************************
uBlock Origin - a browser extension to block requests.
Copyright (C) 2019-present Raymond Hill
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see {http://www.gnu.org/licenses/}.
Home: https://github.com/gorhill/uBlock
*/
'use strict';
const webext = browser; // jshint ignore:line

@ -0,0 +1,10 @@
{
"sidebar_action": {
"default_title": "__MSG_loggerPageName__",
"default_panel": "logger-ui.html",
"default_icon": {
"16": "img/icon_16.png",
"128": "img/icon_128.png"
}
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -1,16 +1,20 @@
{ {
"extName": { "extName": {
"message": "uMatrix", "message": "nuTensor",
"description": "" "description": ""
}, },
"extShortDesc": { "extShortDesc": {
"message": "Point & click to forbid/allow any class of requests made by your browser. Use it to block scripts, iframes, ads, facebook, etc.", "message": "Point & click to forbid/allow any class of requests made by your browser. A fork of Raymond Hill's uMatrix.",
"description": "this will be used as short description in web stores: MUST BE 132 characters OR LESS" "description": "this will be used as short description in web stores: MUST BE 132 characters OR LESS"
}, },
"dashboardPageName": { "dashboardPageName": {
"message": "uMatrix — Dashboard", "message": "nuTensor — Dashboard",
"description": "" "description": ""
}, },
"loggerPageName": {
"message": "nuTensor — Logger",
"description": "Title for the logger window"
},
"settingsPageName": { "settingsPageName": {
"message": "Settings", "message": "Settings",
"description": "a tab in dashboard" "description": "a tab in dashboard"
@ -28,7 +32,11 @@
"description": "a tab in dashboard" "description": "a tab in dashboard"
}, },
"ubiquitousRulesPageName" : { "ubiquitousRulesPageName" : {
"message": "Hosts files", "message": "Assets",
"description": "a tab in dashboard"
},
"rawSettingsPageName": {
"message": "More",
"description": "a tab in dashboard" "description": "a tab in dashboard"
}, },
"aboutPageName": { "aboutPageName": {
@ -53,6 +61,10 @@
"message": "image", "message": "image",
"description": "HAS TO FIT IN MATRIX HEADER!" "description": "HAS TO FIT IN MATRIX HEADER!"
}, },
"mediaPrettyName": {
"message": "media",
"description": "HAS TO FIT IN MATRIX HEADER!"
},
"pluginPrettyName": { "pluginPrettyName": {
"message": "plugin", "message": "plugin",
"description": "HAS TO FIT IN MATRIX HEADER!" "description": "HAS TO FIT IN MATRIX HEADER!"
@ -61,8 +73,8 @@
"message": "script", "message": "script",
"description": "HAS TO FIT IN MATRIX HEADER!" "description": "HAS TO FIT IN MATRIX HEADER!"
}, },
"xhrPrettyName": { "fetchPrettyName": {
"message": "XHR", "message": "fetch",
"description": "HAS TO FIT IN MATRIX HEADER!" "description": "HAS TO FIT IN MATRIX HEADER!"
}, },
"framePrettyName": { "framePrettyName": {
@ -79,20 +91,28 @@
"message": "No net traffic seen for this tab so far.", "message": "No net traffic seen for this tab so far.",
"description": "" "description": ""
}, },
"matrixLocalScopeTip" : {
"message": "Select a local scope to see/create rules which apply only in that scope",
"description": "Tool tip for the local scope button"
},
"matrixGlobalScopeTip" : {
"message": "Select the global scope to see/create rules which apply everywhere",
"description": "Tool tip for the global scope button"
},
"matrixMtxButtonTip" : { "matrixMtxButtonTip" : {
"message": "Disable/enable matrix filtering for this scope.", "message": "Disable/enable matrix filtering for this scope",
"description": "Tool tip for matrix button" "description": "Tool tip for matrix button"
}, },
"matrixPersistButtonTip" : { "matrixPersistButtonTip" : {
"message": "Save all temporary changes for this scope.", "message": "Save all temporary changes for this scope",
"description": "Tool tip for the persist button" "description": "Tool tip for the persist button"
}, },
"matrixRevertButtonTip" : { "matrixRevertButtonTip" : {
"message": "Revert temporary changes for this scope.", "message": "Revert temporary changes for this scope",
"description": "Tool tip for the revert local permission button" "description": "Tool tip for the revert local permission button"
}, },
"matrixReloadButton" : { "matrixReloadButton" : {
"message": "Reload the page.", "message": "Reload the page. \nPress Shift to bypass the browser cache.",
"description": "Tool tip for the reload button" "description": "Tool tip for the reload button"
}, },
"matrix1stPartyLabel" : { "matrix1stPartyLabel" : {
@ -104,15 +124,23 @@
"description": "Appears in the metadata row of bottom-most group: **mind the limited width**" "description": "Appears in the metadata row of bottom-most group: **mind the limited width**"
}, },
"matrixSwitchNoMixedContent" : { "matrixSwitchNoMixedContent" : {
"message": "Strict HTTPS", "message": "Forbid mixed content",
"description": "A menu entry in the matrix popup" "description": "A menu entry in the matrix popup"
}, },
"matrixSwitchUASpoof" : { "matrixSwitchNoWorker" : {
"message": "User agent spoofing", "message": "Forbid web workers",
"description": "A menu entry in the matrix popup" "description": "A menu entry in the matrix popup"
}, },
"matrixSwitchReferrerSpoof" : { "matrixSwitchReferrerSpoof" : {
"message": "Referrer spoofing", "message": "Spoof <code>Referer</code> header",
"description": "A menu entry in the matrix popup"
},
"matrixSwitchNoscriptSpoof" : {
"message": "Spoof <code><noscript></code> tags",
"description": "A menu entry in the matrix popup"
},
"matrixSwitchRevealCname" : {
"message": "Reveal canonical names",
"description": "A menu entry in the matrix popup" "description": "A menu entry in the matrix popup"
}, },
"matrixRevertAllEntry" : { "matrixRevertAllEntry" : {
@ -127,9 +155,21 @@
"message": "Go to dashboard", "message": "Go to dashboard",
"description": "A menu entry in the matrix popup" "description": "A menu entry in the matrix popup"
}, },
"matrixNoTabFound" : {
"message": "No web page found",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip" : {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip" : {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle" : { "statsPageTitle" : {
"message": "uMatrix &ndash; Statistics", "message": "nuTensor &ndash; Statistics",
"description": "" "description": ""
}, },
"statsPageGenericStats" : { "statsPageGenericStats" : {
@ -145,7 +185,7 @@
"description": "" "description": ""
}, },
"statsPageHyperlinkAuditingFoiled" : { "statsPageHyperlinkAuditingFoiled" : {
"message": "<a href='http://www.whatwg.org/specs/web-apps/current-work/multipage/links.html#hyperlink-auditing'>Hyperlink auditing</a> attempts foiled: {{count}}", "message": "<a href='https://html.spec.whatwg.org/multipage/semantics.html#hyperlink-auditing'>Hyperlink auditing</a> attempts foiled: {{count}}",
"description": "" "description": ""
}, },
"statsPageCookiesRemoved" : { "statsPageCookiesRemoved" : {
@ -237,38 +277,180 @@
"description": "First part of Remember the last [n] HTTP requests per page" "description": "First part of Remember the last [n] HTTP requests per page"
}, },
"statsPageLogSizePrompt2" : { "statsPageLogSizePrompt2" : {
"message": "HTTP requests <b>per page</b>.", "message": "HTTP requests <b>per page</b>",
"description": "Second part of Remember the last [n] HTTP requests per page" "description": "Second part of Remember the last [n] HTTP requests per page"
}, },
"statsPageLogSizeHelp" : { "statsPageLogSizeHelp" : {
"message": "<p>You can inspect details of the most recent raw HTTP requests which have been made by a web page (see below).</p><p>This is mostly useful to advanced users who want to investigate exactly what a web page has been doing. But logging these HTTP requests requires memory, and if you don't care about this technical information, then memory is being wasted.</p><p>Hence this field which lets you adjust the maximum number of the most recent HTTP requests which are to be logged for further inspection.</p><p>Enter &ldquo;<code>0</code>&rdquo; to turn off detailed logging (and consequently reduce the memory footprint of <i>uMatrix</i>).</p>", "message": "<p>You can inspect details of the most recent raw HTTP requests which have been made by a web page (see below).</p><p>This is mostly useful to advanced users who want to investigate exactly what a web page has been doing. But logging these HTTP requests requires memory, and if you don't care about this technical information, then memory is being wasted.</p><p>Hence this field which lets you adjust the maximum number of the most recent HTTP requests which are to be logged for further inspection.</p><p>Enter &ldquo;<code>0</code>&rdquo; to turn off detailed logging (and consequently reduce the memory footprint of <i>nuTensor</i>).</p>",
"description": "To help user understand the purpose of the log size value" "description": "To help user understand the purpose of the log size value"
}, },
"statsPageRefresh" : { "statsPageRefresh" : {
"message": "Refresh", "message": "Refresh",
"description": "" "description": ""
}, },
"logAll":{
"message":"All",
"description":"Appears in the logger's tab selector"
},
"logBehindTheScene":{
"message":"Tabless",
"description":"Pretty name for behind-the-scene network requests"
},
"loggerCurrentTab":{
"message":"Current tab",
"description":"Appears in the logger's tab selector"
},
"loggerReloadTip":{
"message":"Reload the tab content",
"description":"Tooltip for the reload button in the logger page"
},
"loggerFilterInputPlaceholder" : {
"message": "filter expression(s)",
"description": "Appears in the input filed where filter expressions are entered"
},
"loggerEntryCookieDeleted" : {
"message": "cookie deleted: {{value}}",
"description": "An entry for when a cookie is deleted"
},
"loggerEntryDeleteCookieError" : {
"message": "failed to delete cookie: {{value}}",
"description": "An entry for when the browser cache is cleared"
},
"loggerEntryBrowserCacheCleared" : {
"message": "browser cache cleared",
"description": "An entry for when a cookie can't be deleted"
},
"loggerEntryAssetUpdated" : {
"message": "asset updated: {{value}}",
"description": "An entry for when an asset was updated"
},
"loggerRowFiltererButtonTip":{
"message":"Toggle logger filtering",
"description":"Tooltip for the row filterer button in the logger page"
},
"logFilterPrompt":{
"message":"filter logger content",
"description": "Placeholder string for logger output filtering input field"
},
"loggerPopupPanelTip":{
"message":"Toggle the popup panel",
"description":"Tooltip for the popup panel button in the logger page"
},
"loggerInfoTip":{
"message":"uBlock Origin wiki: The logger",
"description":"Tooltip for the top-right info label in the logger page"
},
"loggerClearTip":{
"message":"Clear logger",
"description":"Tooltip for the eraser in the logger page; used to blank the content of the logger"
},
"loggerPauseTip":{
"message":"Pause logger (discard all incoming data)",
"description":"Tooltip for the pause button in the logger page"
},
"loggerUnpauseTip":{
"message":"Unpause logger",
"description":"Tooltip for the play button in the logger page"
},
"loggerRowFiltererBuiltinTip":{
"message":"Logger filtering options",
"description":"Tooltip for the button to bring up logger output filtering options"
},
"loggerRowFiltererBuiltinNot":{
"message":"Not",
"description":"A keyword in the built-in row filtering expression"
},
"loggerRowFiltererBuiltinBlocked":{
"message":"blocked",
"description":"A keyword in the built-in row filtering expression"
},
"loggerRowFiltererBuiltinInfo":{
"message":"info",
"description":"A keyword in the built-in row filtering expression"
},
"loggerRowFiltererBuiltin1p":{
"message":"1st-party",
"description":"A keyword in the built-in row filtering expression"
},
"loggerRowFiltererBuiltin3p":{
"message":"3rd-party",
"description":"A keyword in the built-in row filtering expression"
},
"loggerEntryDetailsHeader":{
"message":"Details",
"description":"Small header to identify the 'Details' pane for a specific logger entry"
},
"loggerEntryDetailsContext":{
"message":"Context",
"description":"Label to identify a context field (typically a hostname)"
},
"loggerEntryDetailsPartyness":{
"message":"Partyness",
"description":"Label to identify a field providing partyness information"
},
"loggerEntryDetailsType":{
"message":"Type",
"description":"Label to identify the type of an entry"
},
"loggerEntryDetailsURL":{
"message":"URL",
"description":"Label to identify the URL of an entry"
},
"loggerEntryRuleHeader":{
"message":"Rule",
"description":"Small header to identify the 'Rule' pane for a specific logger entry"
},
"loggerSettingDiscardPrompt":{
"message":"Logger entries which do not fulfill all three conditions below will be automatically discarded:",
"description":"Logger setting: A sentence to describe the purpose of the settings below"
},
"loggerSettingPerEntryMaxAge":{
"message":"Preserve entries from the last {{input}} minutes",
"description":"A logger setting"
},
"loggerSettingPerTabMaxLoads":{
"message":"Preserve at most {{input}} page loads per tab",
"description":"A logger setting"
},
"loggerSettingPerTabMaxEntries":{
"message":"Preserve at most {{input}} entries per tab",
"description":"A logger setting"
},
"loggerSettingPerEntryLineCount":{
"message":"Use {{input}} lines per entry in vertically expanded mode",
"description":"A logger setting"
},
"loggerExportFormatList":{
"message":"List",
"description":"Label for radio-button to pick export format"
},
"loggerExportFormatTable":{
"message":"Table",
"description":"Label for radio-button to pick export format"
},
"loggerExportEncodePlain":{
"message":"Plain",
"description":"Label for radio-button to pick export text format"
},
"loggerExportEncodeMarkdown":{
"message":"Markdown",
"description":"Label for radio-button to pick export text format"
},
"settingsPageTitle" : { "settingsPageTitle" : {
"message": "uMatrix &ndash; Settings", "message": "nuTensor &ndash; Settings",
"description": "" "description": ""
}, },
"settingsMatrixDisplayHeader" : { "settingsMatrixDisplayHeader" : {
"message": "Appearance", "message": "Matrix",
"description": "" "description": "header for matrix settings used in Settings page"
}, },
"settingsMatrixDisplayTextSizePrompt" : { "settingsMatrixDisplayTextSizePrompt" : {
"message": "Text size:", "message": "Text size:",
"description": "" "description": ""
}, },
"settingsMatrixDisplayTextSizeNormal" : { "settingsIconBadgeEnabled":{
"message": "Normal", "message":"Show the number of blocked resources on the icon",
"description": "" "description":""
},
"settingsMatrixDisplayTextSizeLarge" : {
"message": "Large",
"description": ""
}, },
"settingsMatrixDisplayColorBlind" : { "settingsMatrixDisplayColorBlind" : {
"message": "Color-blind friendly", "message": "Color-blind friendly",
@ -278,54 +460,53 @@
"message": "Convenience", "message": "Convenience",
"description": "English: Convenience" "description": "English: Convenience"
}, },
"settingsMatrixAutoReloadPrompt" : { "settingsDefaultScopeLevel" : {
"message": "When the matrix is closed, smart reload these tabs:", "message": "Default scope level:",
"description": "" "description": "Label for default scope level selector in Settings pane"
}, },
"settingsMatrixAutoReloadNone" : { "settingsDefaultScopeLevel0" : {
"message": "None", "message": "Global",
"description": "" "description": "Scope will be global"
}, },
"settingsMatrixAutoReloadCurrent" : { "settingsDefaultScopeLevel1" : {
"message": "Current", "message": "Domain",
"description": "" "description": "Scope will be base domain"
}, },
"settingsMatrixAutoReloadAll" : { "settingsDefaultScopeLevel2" : {
"message": "All", "message": "Site",
"description": "" "description": "Scope will be full hostname of site"
}, },
"settingsMatrixAutoReloadInfo" : { "settingsCollapseBlocked" : {
"message": "Whenever you make changes in the matrix which can affect the display and/or behavior of one or more pages, <i>uMatrix</i> will reload affected pages automatically when you close the matrix.", "message": "Hide placeholder of blocked elements",
"description": "" "description": "A setting in the dashboard's Settings pane"
}, },
"settingsSubframeColor" : { "settingsCollapseBlacklisted" : {
"message": "Blocked frames:&ensp;Color", "message": "Hide placeholder of blacklisted elements",
"description": "English: Blocked frames:&ensp;Color" "description": "A setting in the dashboard's Settings pane: 'blacklisted' means 'for which there is a specific block rule', 'specific' means 'a rule for which the destination hostname is not `*`'"
}, },
"settingsSubframeOpacity" : { "settingsNoscriptTagsSpoofed" : {
"message": "Opacity", "message": "Spoof <code><noscript></code> tags when 1st-party scripts are blocked",
"description": "English: Opacity" "description": "This appears in the Settings pane in the dashboard"
}, },
"settingsIconBadgeEnabled":{ "settingsCloudStorageEnabled" : {
"message":"Show the number of distinct requests on the icon", "message": "Enable cloud storage support",
"description":"English: Show the number of distinct requests on the icon" "description": ""
}, },
"settingsCollapseBlocked" : { "settingsMatrixNoTooltips" : {
"message": "Collapse placeholder of blocked elements", "message": "Disable tooltips",
"description": "English: Collapse placeholder of blocked elements" "description": ""
}, },
"privacyPageTitle" : { "privacyPageTitle" : {
"message": "uMatrix &ndash; Privacy", "message": "nuTensor &ndash; Privacy",
"description": "" "description": ""
}, },
"privacyDeleteBlockedCookiesPrompt" : { "privacyDeleteBlockedCookiesPrompt" : {
"message": "Delete blocked cookies.", "message": "Delete blocked cookies",
"description": "" "description": ""
}, },
"privacyDeleteBlockedCookiesHelp" : { "privacyDeleteBlockedCookiesHelp" : {
"message": "<p>Blacklisted cookies are not prevented by <i>uMatrix</i> from entering your browser. However they are prevented from leaving your browser, which is what really matters. Not blocking cookies before they enter your browser gives you the opportunity to be informed that a site tried to use cookies, and furthermore to inspect their contents if you wish.</p><p>Once these blacklisted cookies have been accounted for by <i>uMatrix</i>, they can be removed from your browser if you wish so.</p><p><b>Important note:</b> Extensions can make web requests during the course of their normal operation. These requests can result in cookies being created in the browser. If the hostname from where a cookie originate is not whitelisted, the cookie will be removed from the browser by <i>uMatrix</i> if this option is checked. So be sure that the hostname(s) with which an extension communicate is whitelisted.</p>", "message": "<p>Blacklisted cookies are not prevented by <i>nuTensor</i> from entering your browser. However they are prevented from leaving your browser, which is what really matters. Not blocking cookies before they enter your browser gives you the opportunity to be informed that a site tried to use cookies, and furthermore to inspect their contents if you wish.</p><p>Once these blacklisted cookies have been accounted for by <i>nuTensor</i>, they can be removed from your browser if you wish so.</p><p><b>Important note:</b> Extensions can make web requests during the course of their normal operation. These requests can result in cookies being created in the browser. If the hostname from where a cookie originate is not whitelisted, the cookie will be removed from the browser by <i>nuTensor</i> if this option is checked. So be sure that the hostname(s) with which an extension communicate is whitelisted.</p>",
"description": "" "description": ""
}, },
"privacyDeleteNonBlockedSessionCookiesPrompt1" : { "privacyDeleteNonBlockedSessionCookiesPrompt1" : {
@ -333,7 +514,7 @@
"description": "First part of 'Delete non-blocked session cookies [n] minutes after the last time they have been used'" "description": "First part of 'Delete non-blocked session cookies [n] minutes after the last time they have been used'"
}, },
"privacyDeleteNonBlockedSessionCookiesPrompt2" : { "privacyDeleteNonBlockedSessionCookiesPrompt2" : {
"message": " minutes after the last time they have been used.", "message": " minutes after the last time they have been used",
"description": "Second part of 'Delete non-blocked session cookies [n] minutes after the last time they have been used'" "description": "Second part of 'Delete non-blocked session cookies [n] minutes after the last time they have been used'"
}, },
"privacyDeleteNonBlockedSessionCookiesHelp" : { "privacyDeleteNonBlockedSessionCookiesHelp" : {
@ -353,23 +534,23 @@
"description": "First part of 'Clear browser cache every [n] minutes'" "description": "First part of 'Clear browser cache every [n] minutes'"
}, },
"privacyClearCachePrompt2" : { "privacyClearCachePrompt2" : {
"message": "minutes.", "message": "minutes",
"description": "Second part of 'Clear browser cache every [n] minutes'" "description": "Second part of 'Clear browser cache every [n] minutes'"
}, },
"privacyClearCacheHelp" : { "privacyClearCacheHelp" : {
"message": "<p>Some web sites are really bent on tracking you, so much that they will use not-so-nice tricks to work around whatever measures you take in order to not be tracked.</p><p>A few of these tricks rely<sup style='font-size:smaller'>[1, 2]</sup> on the <a href='https://en.wikipedia.org/wiki/Web_cache'>browser cache</a>, which content is often long lasting since rarely will users take the time to regularly clear their browser cache.</p><p>There is little inconvenience to clear the browser cache regularly (likelihood is that you won't notice when it happens), and the benefit is to prevent these obnoxious trackers from invading your privacy.</p><p>Check this option to have <i>uMatrix</i> do it for you, at the interval you wish.</p><p style='font-size:smaller'>[1] <a href='https://grepular.com/Preventing_Web_Tracking_via_the_Browser_Cache'>&ldquo;Preventing Web Tracking via the Browser Cache&rdquo;</a><br>[2] <a href='http://lucb1e.com/rp/cookielesscookies/'>&ldquo;Cookieless cookies&rdquo;</a></p>", "message": "<p>Some web sites are really bent on tracking you, so much that they will use not-so-nice tricks to work around whatever measures you take in order to not be tracked.</p><p>A few of these tricks rely<sup>[1, 2]</sup> on the <a href='https://en.wikipedia.org/wiki/Web_cache'>browser cache</a>, which content is often long lasting since rarely will users take the time to regularly clear their browser cache.</p><p>There is little inconvenience to clear the browser cache regularly (likelihood is that you won't notice when it happens), and the benefit is to prevent these obnoxious trackers from invading your privacy.</p><p>Check this option to have <i>nuTensor</i> do it for you, at the interval you wish.</p><p>[1] <a href='https://grepular.com/Preventing_Web_Tracking_via_the_Browser_Cache'>&ldquo;Preventing Web Tracking via the Browser Cache&rdquo;</a>\n[2] <a href='http://lucb1e.com/rp/cookielesscookies/'>&ldquo;Cookieless cookies&rdquo;</a></p>",
"description": "" "description": ""
}, },
"privacyProcessRefererPrompt" : { "privacyProcessRefererPrompt" : {
"message": "Spoof <a href='https://en.wikipedia.org/wiki/HTTP_referer'>HTTP referrer</a> string of third-party requests.", "message": "Spoof <a href='https://en.wikipedia.org/wiki/HTTP_referer'>HTTP referrer</a> string of third-party requests",
"description": "" "description": ""
}, },
"privacyProcessRefererHelp" : { "privacyProcessRefererHelp" : {
"message": "<p>From Wikipedia:</p><blockquote>HTTP referer is an HTTP header field that identifies the address of the webpage that linked to the resource being requested. ... <b>Because referer information can violate privacy, some web browsers allow the user to disable the sending of referer information.</b></blockquote><p>If this setting is checked, <i>uMatrix</i> will spoof the HTTP referrer information if the domain name of the HTTP referrer is third-party to the domain name of net request.", "message": "From Wikipedia:<blockquote>HTTP referer is an HTTP header field that identifies the address of the webpage that linked to the resource being requested. ... <b>Because referer information can violate privacy, some web browsers allow the user to disable the sending of referer information.</b></blockquote>If this setting is checked, <i>nuTensor</i> will spoof the HTTP referrer information if the domain name of the HTTP referrer is third-party to the domain name of net request.",
"description": "" "description": ""
}, },
"privacyNoMixedContentPrompt" : { "privacyNoMixedContentPrompt" : {
"message": "Strict HTTPS: forbid mixed content.", "message": "Strict HTTPS: forbid mixed content",
"description": "" "description": ""
}, },
"privacyNoMixedContentHelp" : { "privacyNoMixedContentHelp" : {
@ -377,33 +558,13 @@
"description": "" "description": ""
}, },
"privacyProcessHyperlinkAuditingPrompt" : { "privacyProcessHyperlinkAuditingPrompt" : {
"message": "Block all <a href='http://www.whatwg.org/specs/web-apps/current-work/multipage/links.html#hyperlink-auditing'>hyperlink auditing</a> attempts.", "message": "Block all <a href='https://html.spec.whatwg.org/multipage/semantics.html#hyperlink-auditing'>hyperlink auditing</a> attempts",
"description": "" "description": ""
}, },
"privacyProcessHyperlinkAuditingHelp" : { "privacyProcessHyperlinkAuditingHelp" : {
"message": "<p>Hyperlink auditing is a mechanism which allow a party, <b>any party</b>, to be informed about which link a user clicked on a particular web page. It is essentially a tracking feature: it allows a web site, or any third-party to that web site, to be informed about which link you clicked on which one of its web pages. The sole purpose is to track your browsing activity.</p>", "message": "<p>Hyperlink auditing is a mechanism which allow a party, <b>any party</b>, to be informed about which link a user clicked on a particular web page. It is essentially a tracking feature: it allows a web site, or any third-party to that web site, to be informed about which link you clicked on which one of its web pages. The sole purpose is to track your browsing activity.</p>",
"description": "" "description": ""
}, },
"privacySpoofUserAgentPrompt1" : {
"message": "Spoof <a href='https://en.wikipedia.org/wiki/User_agent'>User-Agent</a> string by randomly picking a new one below every",
"description": "First part of UA-spoofing prompt"
},
"privacySpoofUserAgentPrompt2" : {
"message": "minutes.",
"description": "Second part"
},
"privacySpoofUserAgentHelp" : {
"message": "<a href='https://www.eff.org/deeplinks/2010/01/tracking-by-user-agent'>According to the <i>Electronic Frontier Foundation</i></a>: &ldquo;[...] your browser sends a &lsquo;User Agent&rsquo; header to the website saying precisely which operating system and web browser you are using. This information could help distinguish Internet users from one another because these versions differ, often considerably, from person to person. [...] <b>the User Agent string becomes a real privacy problem</b>.&rdquo;<p>This option allows you to address the privacy issue raised by the EFF.</p><p>You can supply your own list of user agent strings. One string per line. Blank lines and lines prefixed with &lsquo;#&rsquo; will be ignored.</p>",
"description": ""
},
"privacyBehindTheSceneHeader" : {
"message": "Behind-the-scene requests",
"description": ""
},
"privacyProcessBehindTheSceneHelp" : {
"message": "",
"description": ""
},
"userRulesPermanentHeader": { "userRulesPermanentHeader": {
@ -452,6 +613,10 @@
}, },
"assetsHostsSection" : {
"message": "Hosts files",
"description": "header to identify the hosts files section"
},
"hostsFilesPrompt" : { "hostsFilesPrompt" : {
"message": "All hostnames in a hosts file are loaded as blacklisted hostnames in the global scope.", "message": "All hostnames in a hosts file are loaded as blacklisted hostnames in the global scope.",
"description": "" "description": ""
@ -473,7 +638,7 @@
"description": "" "description": ""
}, },
"hostsFilesAutoUpdatePrompt":{ "hostsFilesAutoUpdatePrompt":{
"message":"Auto-update hosts files.", "message":"Auto-update assets",
"description":"" "description":""
}, },
"hostsFilesUpdateNow":{ "hostsFilesUpdateNow":{
@ -485,7 +650,7 @@
"description":"" "description":""
}, },
"hostsFilesExternalListsHint":{ "hostsFilesExternalListsHint":{
"message":"One URL per line. Lines prefixed with &lsquo;#&rsquo; will be ignored. Invalid URLs will be silently ignored.", "message":"Import external assets here: \nOne URL per line; invalid URLs will be silently ignored.",
"description":"" "description":""
}, },
"hostsFilesExternalListsParse":{ "hostsFilesExternalListsParse":{
@ -504,10 +669,34 @@
"message":"outdated", "message":"outdated",
"description":"" "description":""
}, },
"assetsRecipesSection" : {
"message": "Ruleset recipes",
"description": "header to identify the ruleset files section"
},
"assetsRecipesSummary" : {
"message": "Ruleset recipes are imported from the popup panel <em>on demand</em>, i.e. <b>only</b> through user interaction.",
"description": ""
},
"assetsImportLabel" : {
"message": "Import...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning" : {
"message": "Warning! Change these raw configuration settings at your own risk.",
"description": ""
},
"aboutChangelog" : { "aboutChangelog" : {
"message": "<a href='https://github.com/gorhill/uMatrix/releases'>Change log</a>", "message": "<a href='https://github.com/geekprojects/nuTensor/releases'>Change log</a>",
"description": "" "description": ""
}, },
"aboutStorageUsed" : { "aboutStorageUsed" : {
@ -515,11 +704,11 @@
"description": "" "description": ""
}, },
"aboutDoc" : { "aboutDoc" : {
"message": "<a href='https://github.com/gorhill/uMatrix/wiki'>Documentation</a>", "message": "<a href='https://github.com/geekprojects/nuTensor/wiki'>Documentation</a>",
"description": "" "description": ""
}, },
"aboutPermissions" : { "aboutPermissions" : {
"message": "<a href='https://github.com/gorhill/httpswitchboard/wiki/Permissions'>Permissions</a>", "message": "<a href='https://github.com/geekprojects/nuTensor/wiki/Permissions'>Permissions</a>",
"description": "" "description": ""
}, },
"aboutCode" : { "aboutCode" : {
@ -527,8 +716,8 @@
"description": "" "description": ""
}, },
"aboutIssues" : { "aboutIssues" : {
"message": "Bugs and issues", "message": "Issue tracker",
"description": "" "description": "Text for a link to official issue tracker"
}, },
"aboutContributors":{ "aboutContributors":{
"message":"Contributors", "message":"Contributors",
@ -551,7 +740,7 @@
"description": "" "description": ""
}, },
"aboutBackupButton" : { "aboutBackupButton" : {
"message": "Backup to file...", "message": "Back up to file...",
"description": "" "description": ""
}, },
"aboutBackupFilename" : { "aboutBackupFilename" : {
@ -563,7 +752,7 @@
"description": "" "description": ""
}, },
"aboutRestoreConfirm" : { "aboutRestoreConfirm" : {
"message": "All your settings will be overwritten using data backed up on {{time}}, and uMatrix will restart.\n\nOverwrite all existing settings using backed up data?", "message": "All your settings will be overwritten using data backed up on {{time}}, and nuTensor will restart.\n\nOverwrite all existing settings using backed up data?",
"description": "Message asking user to confirm restore" "description": "Message asking user to confirm restore"
}, },
"aboutRestoreError" : { "aboutRestoreError" : {
@ -583,43 +772,18 @@
"description": "Message asking user to confirm reset" "description": "Message asking user to confirm reset"
}, },
"loggerFilterInputPlaceholder" : {
"message": "filter expression(s)",
"description": "Appears in the input filed where filter expressions are entered"
},
"loggerMaxEntriesTip" : {
"message": "Maximum number of entries",
"description": "Appears as a tooltip when hovering the input field"
},
"loggerEntryUserAgentSpoofing" : {
"message": "spoofing user agent with: {{value}}",
"description": "An entry for when a new user agent string is selected"
},
"loggerEntryCookieDeleted" : {
"message": "cookie deleted: {{value}}",
"description": "An entry for when a cookie is deleted"
},
"loggerEntryDeleteCookieError" : {
"message": "failed to delete cookie: {{value}}",
"description": "An entry for when the browser cache is cleared"
},
"loggerEntryBrowserCacheCleared" : {
"message": "browser cache cleared",
"description": "An entry for when a cookie can't be deleted"
},
"loggerEntryAssetUpdated" : {
"message": "asset updated: {{value}}",
"description": "An entry for when an asset was updated"
},
"mainBlockedPrompt1": { "mainBlockedPrompt1": {
"message": "uMatrix has prevented the following page from loading:", "message": "nuTensor has prevented the following page from loading:",
"description": "English: uMatrix has prevented the following page from loading:" "description": "English: nuTensor has prevented the following page from loading:"
}, },
"mainBlockedPrompt2": { "mainBlockedPrompt2": {
"message": "Because of the following rule", "message": "Because of the following rule",
"description": "English: Because of the following rule" "description": "English: Because of the following rule"
}, },
"mainBlockedNoParamsPrompt": {
"message": "without parameters",
"description": "label to be used for the parameter-less URL: https://cloud.githubusercontent.com/assets/585534/9832014/bfb1b8f0-593b-11e5-8a27-fba472a5529a.png"
},
"mainBlockedBack" : { "mainBlockedBack" : {
"message": "Go back", "message": "Go back",
"description": "English: Go back" "description": "English: Go back"
@ -680,8 +844,42 @@
"description":"Appears in Firefox's add-on preferences" "description":"Appears in Firefox's add-on preferences"
}, },
"cloudPush": {
"message": "Export to cloud storage",
"description": "tooltip"
},
"cloudPull": {
"message": "Import from cloud storage",
"description": "tooltip"
},
"cloudNoData": {
"message": "...\n...",
"description": ""
},
"cloudDeviceNamePrompt": {
"message": "This device name:",
"description": "used as a prompt for the user to provide a custom device name"
},
"genericSubmit": {
"message": "Submit",
"description": "for generic 'submit' buttons"
},
"genericRevert": {
"message": "Revert",
"description": "for generic 'revert' buttons"
},
"errorCantConnectTo":{ "errorCantConnectTo":{
"message":"Network error: Unable to connect to {{url}}", "message":"Network error: Unable to connect to {{url}}",
"description":"" "description":""
},
"genericApplyChanges": {
"message": "Apply changes",
"description": "for generic 'Apply changes' buttons"
},
"genericCopyToClipboard":{
"message":"Copy to clipboard",
"description":"Label for buttons used to copy something to the clipboard"
} }
} }

@ -0,0 +1,866 @@
{
"extName": {
"message": "nuTensor",
"description": ""
},
"extShortDesc": {
"message": "Point & click to forbid/allow any class of requests made by your browser. Use it to block scripts, iframes, ads, facebook, etc.",
"description": "this will be used as short description in web stores: MUST BE 132 characters OR LESS"
},
"dashboardPageName": {
"message": "nuTensor — Panelo",
"description": ""
},
"loggerPageName": {
"message": "nuTensor — Logger",
"description": "Title for the logger window"
},
"settingsPageName": {
"message": "Agordoj",
"description": "a tab in dashboard"
},
"privacyPageName": {
"message": "Privateco",
"description": "a tab in dashboard"
},
"statsPageName": {
"message": "Statistics",
"description": "a tab in dashboard"
},
"userRulesPageName": {
"message": "Miaj reguloj",
"description": "a tab in dashboard"
},
"ubiquitousRulesPageName": {
"message": "Assets",
"description": "a tab in dashboard"
},
"rawSettingsPageName": {
"message": "More",
"description": "a tab in dashboard"
},
"aboutPageName": {
"message": "Pri",
"description": "a tab in dashboard"
},
"allPrettyName": {
"message": "all",
"description": "HAS TO FIT IN MATRIX HEADER!"
},
"cookiePrettyName": {
"message": "kuketo",
"description": "HAS TO FIT IN MATRIX HEADER!"
},
"cssPrettyName": {
"message": "css",
"description": "HAS TO FIT IN MATRIX HEADER!"
},
"imagePrettyName": {
"message": "bildo",
"description": "HAS TO FIT IN MATRIX HEADER!"
},
"mediaPrettyName": {
"message": "media",
"description": "HAS TO FIT IN MATRIX HEADER!"
},
"pluginPrettyName": {
"message": "kromaĵo",
"description": "HAS TO FIT IN MATRIX HEADER!"
},
"scriptPrettyName": {
"message": "skripto",
"description": "HAS TO FIT IN MATRIX HEADER!"
},
"fetchPrettyName": {
"message": "fetch",
"description": "HAS TO FIT IN MATRIX HEADER!"
},
"framePrettyName": {
"message": "kadro",
"description": "HAS TO FIT IN MATRIX HEADER!"
},
"otherPrettyName": {
"message": "alia",
"description": "HAS TO FIT IN MATRIX HEADER!"
},
"matrixNoNetTrafficPrompt": {
"message": "No net traffic seen for this tab so far.",
"description": ""
},
"matrixLocalScopeTip": {
"message": "Select a local scope to see/create rules which apply only in that scope",
"description": "Tool tip for the local scope button"
},
"matrixGlobalScopeTip": {
"message": "Select the global scope to see/create rules which apply everywhere",
"description": "Tool tip for the global scope button"
},
"matrixMtxButtonTip": {
"message": "Disable/enable matrix filtering for this scope",
"description": "Tool tip for matrix button"
},
"matrixPersistButtonTip": {
"message": "Save all temporary changes for this scope",
"description": "Tool tip for the persist button"
},
"matrixRevertButtonTip": {
"message": "Revert temporary changes for this scope",
"description": "Tool tip for the revert local permission button"
},
"matrixReloadButton": {
"message": "Reŝargi la paĝon.",
"description": "Tool tip for the reload button"
},
"matrix1stPartyLabel": {
"message": "1st-party",
"description": "1st-party"
},
"matrixBlacklistedHostnames": {
"message": "{{count}} blacklisted hostname(s)",
"description": "Appears in the metadata row of bottom-most group: **mind the limited width**"
},
"matrixSwitchNoMixedContent": {
"message": "Forbid mixed content",
"description": "A menu entry in the matrix popup"
},
"matrixSwitchNoWorker": {
"message": "Forbid web workers",
"description": "A menu entry in the matrix popup"
},
"matrixSwitchReferrerSpoof": {
"message": "Spoof <code>Referer</code> header",
"description": "A menu entry in the matrix popup"
},
"matrixSwitchNoscriptSpoof": {
"message": "Spoof <code><noscript></code> tags",
"description": "A menu entry in the matrix popup"
},
"matrixSwitchRevealCname": {
"message": "Reveal canonical names",
"description": "A menu entry in the matrix popup"
},
"matrixRevertAllEntry": {
"message": "Revert all temporary changes",
"description": "A menu entry in the matrix popup"
},
"matrixLoggerMenuEntry": {
"message": "Iri al protokolilo",
"description": "A menu entry in the matrix popup"
},
"matrixDashboardMenuEntry": {
"message": "Iri al panelo",
"description": "A menu entry in the matrix popup"
},
"matrixNoTabFound": {
"message": "No web page found",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "nuTensor &ndash; Statistics",
"description": ""
},
"statsPageGenericStats": {
"message": "Generic statistics",
"description": ""
},
"statsPageCookieHeadersFoiled": {
"message": "<a href='https://en.wikipedia.org/wiki/HTTP_cookie'>HTTP cookie</a> headers foiled: {{count}}",
"description": ""
},
"statsPageRefererHeadersFoiled": {
"message": "<a href='https://en.wikipedia.org/wiki/HTTP_referer'>HTTP referer</a> headers foiled: {{count}}",
"description": ""
},
"statsPageHyperlinkAuditingFoiled": {
"message": "<a href='https://html.spec.whatwg.org/multipage/semantics.html#hyperlink-auditing'>Hyperlink auditing</a> attempts foiled: {{count}}",
"description": ""
},
"statsPageCookiesRemoved": {
"message": "Lokaj kuketoj forigitaj: {{count}}",
"description": ""
},
"statsPageLocalStoragesCleared": {
"message": "<a href='http://diveintohtml5.info/storage.html'>Lokaj konservadoj</a> malplenigitaj: {{count}}",
"description": ""
},
"statsPageBrowserCacheCleared": {
"message": "Browser caches cleared: {{count}}",
"description": ""
},
"statsPageDetailedStats": {
"message": "Detailed statistics",
"description": ""
},
"statsPageDetailedAllPages": {
"message": "All",
"description": ""
},
"statsPageDetailedBehindTheScenePage": {
"message": "Behind the scene",
"description": ""
},
"statsPageOverview": {
"message": "Superrigardo",
"description": ""
},
"statsPageRequests": {
"message": "Petoj",
"description": "header for the stat type column"
},
"statsPageAllowed": {
"message": "Allowed",
"description": "header for the allowed requests column"
},
"statsPageBlocked": {
"message": "Blocked",
"description": "header for the blocked requests column"
},
"statsPageAll": {
"message": "All",
"description": ""
},
"statsPagePages": {
"message": "Paĝoj",
"description": ""
},
"statsPageCookies": {
"message": "Kuketoj",
"description": ""
},
"statsPageCSS": {
"message": "CSS",
"description": ""
},
"statsPageImages": {
"message": "Bildoj",
"description": ""
},
"statsPagePlugins": {
"message": "Kromaĵoj",
"description": ""
},
"statsPageScripts": {
"message": "Skriptoj",
"description": ""
},
"statsPageXHRs": {
"message": "XHR-oj",
"description": ""
},
"statsPageFrames": {
"message": "Kadroj",
"description": ""
},
"statsPageOthers": {
"message": "Aliaj",
"description": ""
},
"statsPageDetailed": {
"message": "Protokolilo",
"description": ""
},
"statsPageLogSizePrompt1": {
"message": "Remember the last",
"description": "First part of Remember the last [n] HTTP requests per page"
},
"statsPageLogSizePrompt2": {
"message": "HTTP requests <b>per page</b>",
"description": "Second part of Remember the last [n] HTTP requests per page"
},
"statsPageLogSizeHelp": {
"message": "<p>You can inspect details of the most recent raw HTTP requests which have been made by a web page (see below).</p><p>This is mostly useful to advanced users who want to investigate exactly what a web page has been doing. But logging these HTTP requests requires memory, and if you don't care about this technical information, then memory is being wasted.</p><p>Hence this field which lets you adjust the maximum number of the most recent HTTP requests which are to be logged for further inspection.</p><p>Enter &ldquo;<code>0</code>&rdquo; to turn off detailed logging (and consequently reduce the memory footprint of <i>nuTensor</i>).</p>",
"description": "To help user understand the purpose of the log size value"
},
"statsPageRefresh": {
"message": "Aktualigi",
"description": ""
},
"logAll": {
"message": "All",
"description": "Appears in the logger's tab selector"
},
"logBehindTheScene": {
"message": "Tabless",
"description": "Pretty name for behind-the-scene network requests"
},
"loggerCurrentTab": {
"message": "Current tab",
"description": "Appears in the logger's tab selector"
},
"loggerReloadTip": {
"message": "Reload the tab content",
"description": "Tooltip for the reload button in the logger page"
},
"loggerFilterInputPlaceholder": {
"message": "filter expression(s)",
"description": "Appears in the input filed where filter expressions are entered"
},
"loggerEntryCookieDeleted": {
"message": "kuketo forigita: {{value}}",
"description": "An entry for when a cookie is deleted"
},
"loggerEntryDeleteCookieError": {
"message": "failed to delete cookie: {{value}}",
"description": "An entry for when the browser cache is cleared"
},
"loggerEntryBrowserCacheCleared": {
"message": "browser cache cleared",
"description": "An entry for when a cookie can't be deleted"
},
"loggerEntryAssetUpdated": {
"message": "asset updated: {{value}}",
"description": "An entry for when an asset was updated"
},
"loggerRowFiltererButtonTip": {
"message": "Toggle logger filtering",
"description": "Tooltip for the row filterer button in the logger page"
},
"logFilterPrompt": {
"message": "filter logger content",
"description": "Placeholder string for logger output filtering input field"
},
"loggerPopupPanelTip": {
"message": "Toggle the popup panel",
"description": "Tooltip for the popup panel button in the logger page"
},
"loggerInfoTip": {
"message": "uBlock Origin wiki: The logger",
"description": "Tooltip for the top-right info label in the logger page"
},
"loggerClearTip": {
"message": "Clear logger",
"description": "Tooltip for the eraser in the logger page; used to blank the content of the logger"
},
"loggerPauseTip": {
"message": "Pause logger (discard all incoming data)",
"description": "Tooltip for the pause button in the logger page"
},
"loggerUnpauseTip": {
"message": "Unpause logger",
"description": "Tooltip for the play button in the logger page"
},
"loggerRowFiltererBuiltinTip": {
"message": "Logger filtering options",
"description": "Tooltip for the button to bring up logger output filtering options"
},
"loggerRowFiltererBuiltinNot": {
"message": "Not",
"description": "A keyword in the built-in row filtering expression"
},
"loggerRowFiltererBuiltinBlocked": {
"message": "blocked",
"description": "A keyword in the built-in row filtering expression"
},
"loggerRowFiltererBuiltinInfo": {
"message": "info",
"description": "A keyword in the built-in row filtering expression"
},
"loggerRowFiltererBuiltin1p": {
"message": "1st-party",
"description": "A keyword in the built-in row filtering expression"
},
"loggerRowFiltererBuiltin3p": {
"message": "3rd-party",
"description": "A keyword in the built-in row filtering expression"
},
"loggerEntryDetailsHeader": {
"message": "Details",
"description": "Small header to identify the 'Details' pane for a specific logger entry"
},
"loggerEntryDetailsContext": {
"message": "Context",
"description": "Label to identify a context field (typically a hostname)"
},
"loggerEntryDetailsPartyness": {
"message": "Partyness",
"description": "Label to identify a field providing partyness information"
},
"loggerEntryDetailsType": {
"message": "Type",
"description": "Label to identify the type of an entry"
},
"loggerEntryDetailsURL": {
"message": "URL",
"description": "Label to identify the URL of an entry"
},
"loggerEntryRuleHeader": {
"message": "Rule",
"description": "Small header to identify the 'Rule' pane for a specific logger entry"
},
"loggerSettingDiscardPrompt": {
"message": "Logger entries which do not fulfill all three conditions below will be automatically discarded:",
"description": "Logger setting: A sentence to describe the purpose of the settings below"
},
"loggerSettingPerEntryMaxAge": {
"message": "Preserve entries from the last {{input}} minutes",
"description": "A logger setting"
},
"loggerSettingPerTabMaxLoads": {
"message": "Preserve at most {{input}} page loads per tab",
"description": "A logger setting"
},
"loggerSettingPerTabMaxEntries": {
"message": "Preserve at most {{input}} entries per tab",
"description": "A logger setting"
},
"loggerSettingPerEntryLineCount": {
"message": "Use {{input}} lines per entry in vertically expanded mode",
"description": "A logger setting"
},
"loggerExportFormatList": {
"message": "List",
"description": "Label for radio-button to pick export format"
},
"loggerExportFormatTable": {
"message": "Table",
"description": "Label for radio-button to pick export format"
},
"loggerExportEncodePlain": {
"message": "Plain",
"description": "Label for radio-button to pick export text format"
},
"loggerExportEncodeMarkdown": {
"message": "Markdown",
"description": "Label for radio-button to pick export text format"
},
"settingsPageTitle": {
"message": "nuTensor &ndash; Agordoj",
"description": ""
},
"settingsMatrixDisplayHeader": {
"message": "Apero",
"description": "header for matrix settings used in Settings page"
},
"settingsMatrixDisplayTextSizePrompt": {
"message": "Tekstogrando:",
"description": ""
},
"settingsIconBadgeEnabled": {
"message": "Show the number of blocked resources on the icon",
"description": ""
},
"settingsMatrixDisplayColorBlind": {
"message": "Afabla por kolorblinduloj",
"description": ""
},
"settingsMatrixConvenienceHeader": {
"message": "Komforto",
"description": "English: Convenience"
},
"settingsDefaultScopeLevel": {
"message": "Default scope level:",
"description": "Label for default scope level selector in Settings pane"
},
"settingsDefaultScopeLevel0": {
"message": "Global",
"description": "Scope will be global"
},
"settingsDefaultScopeLevel1": {
"message": "Domain",
"description": "Scope will be base domain"
},
"settingsDefaultScopeLevel2": {
"message": "Site",
"description": "Scope will be full hostname of site"
},
"settingsCollapseBlocked": {
"message": "Hide placeholder of blocked elements",
"description": "A setting in the dashboard's Settings pane"
},
"settingsCollapseBlacklisted": {
"message": "Hide placeholder of blacklisted elements",
"description": "A setting in the dashboard's Settings pane: 'blacklisted' means 'for which there is a specific block rule', 'specific' means 'a rule for which the destination hostname is not `*`'"
},
"settingsNoscriptTagsSpoofed": {
"message": "Spoof <code><noscript></code> tags when 1st-party scripts are blocked",
"description": "This appears in the Settings pane in the dashboard"
},
"settingsCloudStorageEnabled": {
"message": "Ŝalti subtenon por nuba konservado",
"description": ""
},
"settingsMatrixNoTooltips": {
"message": "Disable tooltips",
"description": ""
},
"privacyPageTitle": {
"message": "nuTensor &ndash; Privateco",
"description": ""
},
"privacyDeleteBlockedCookiesPrompt": {
"message": "Delete blocked cookies",
"description": ""
},
"privacyDeleteBlockedCookiesHelp": {
"message": "<p>Blacklisted cookies are not prevented by <i>nuTensor</i> from entering your browser. However they are prevented from leaving your browser, which is what really matters. Not blocking cookies before they enter your browser gives you the opportunity to be informed that a site tried to use cookies, and furthermore to inspect their contents if you wish.</p><p>Once these blacklisted cookies have been accounted for by <i>nuTensor</i>, they can be removed from your browser if you wish so.</p><p><b>Important note:</b> Extensions can make web requests during the course of their normal operation. These requests can result in cookies being created in the browser. If the hostname from where a cookie originate is not whitelisted, the cookie will be removed from the browser by <i>nuTensor</i> if this option is checked. So be sure that the hostname(s) with which an extension communicate is whitelisted.</p>",
"description": ""
},
"privacyDeleteNonBlockedSessionCookiesPrompt1": {
"message": "Delete non-blocked session cookies ",
"description": "First part of 'Delete non-blocked session cookies [n] minutes after the last time they have been used'"
},
"privacyDeleteNonBlockedSessionCookiesPrompt2": {
"message": " minutes after the last time they have been used",
"description": "Second part of 'Delete non-blocked session cookies [n] minutes after the last time they have been used'"
},
"privacyDeleteNonBlockedSessionCookiesHelp": {
"message": "<p><a href='http://www.w3.org/2001/tag/2010/09/ClientSideStorage.html'>W3C</a>: &ldquo;A session cookie ... is erased when you end the browser session. The session cookie is stored in temporary memory and is not retained after the browser is closed.&rdquo;</p><p>Except that this <a href='https://code.google.com/p/chromium/issues/detail?id=128513'>might not be happening</a> in some browsers. Also, to some, having to close the browser in order for the session cookies to clear might not be early enough.</p>",
"description": ""
},
"privacyDeleteBlockedLocalStoragePrompt": {
"message": "Delete <a href='https://en.wikipedia.org/wiki/Web_storage'>local storage</a> content set by blocked hostnames",
"description": ""
},
"privacyDeleteBlockedLocalStorageHelp": {
"message": "TODO",
"description": ""
},
"privacyClearCachePrompt1": {
"message": "Clear browser cache every",
"description": "First part of 'Clear browser cache every [n] minutes'"
},
"privacyClearCachePrompt2": {
"message": "minutoj.",
"description": "Second part of 'Clear browser cache every [n] minutes'"
},
"privacyClearCacheHelp": {
"message": "<p>Some web sites are really bent on tracking you, so much that they will use not-so-nice tricks to work around whatever measures you take in order to not be tracked.</p><p>A few of these tricks rely<sup>[1, 2]</sup> on the <a href='https://en.wikipedia.org/wiki/Web_cache'>browser cache</a>, which content is often long lasting since rarely will users take the time to regularly clear their browser cache.</p><p>There is little inconvenience to clear the browser cache regularly (likelihood is that you won't notice when it happens), and the benefit is to prevent these obnoxious trackers from invading your privacy.</p><p>Check this option to have <i>nuTensor</i> do it for you, at the interval you wish.</p><p>[1] <a href='https://grepular.com/Preventing_Web_Tracking_via_the_Browser_Cache'>&ldquo;Preventing Web Tracking via the Browser Cache&rdquo;</a>\n[2] <a href='http://lucb1e.com/rp/cookielesscookies/'>&ldquo;Cookieless cookies&rdquo;</a></p>",
"description": ""
},
"privacyProcessRefererPrompt": {
"message": "Spoof <a href='https://en.wikipedia.org/wiki/HTTP_referer'>HTTP referrer</a> string of third-party requests",
"description": ""
},
"privacyProcessRefererHelp": {
"message": "From Wikipedia:<blockquote>HTTP referer is an HTTP header field that identifies the address of the webpage that linked to the resource being requested. ... <b>Because referer information can violate privacy, some web browsers allow the user to disable the sending of referer information.</b></blockquote>If this setting is checked, <i>nuTensor</i> will spoof the HTTP referrer information if the domain name of the HTTP referrer is third-party to the domain name of net request.",
"description": ""
},
"privacyNoMixedContentPrompt": {
"message": "Strict HTTPS: forbid mixed content",
"description": ""
},
"privacyNoMixedContentHelp": {
"message": "<p>From <a href='https://developer.mozilla.org/en-US/docs/Security/MixedContent'>Mozilla Developer Network</a>:</p><blockquote>If [a] HTTPS page includes content retrieved through regular, cleartext HTTP, then the connection is only partially encrypted: the unencrypted content is accessible to sniffers and can be modified by man-in-the-middle attackers, and therefore the connection is not safeguarded anymore. When a webpage exhibits this behavior, it is called a mixed content page.</blockquote>",
"description": ""
},
"privacyProcessHyperlinkAuditingPrompt": {
"message": "Block all <a href='https://html.spec.whatwg.org/multipage/semantics.html#hyperlink-auditing'>hyperlink auditing</a> attempts",
"description": ""
},
"privacyProcessHyperlinkAuditingHelp": {
"message": "<p>Hyperlink auditing is a mechanism which allow a party, <b>any party</b>, to be informed about which link a user clicked on a particular web page. It is essentially a tracking feature: it allows a web site, or any third-party to that web site, to be informed about which link you clicked on which one of its web pages. The sole purpose is to track your browsing activity.</p>",
"description": ""
},
"userRulesPermanentHeader": {
"message": "Daŭraj reguloj",
"description": ""
},
"userRulesTemporaryHeader": {
"message": "Nedaŭraj reguloj",
"description": ""
},
"userRulesRevert": {
"message": "Malfari",
"description": "Will remove all temporary rules"
},
"userRulesCommit": {
"message": "Konservi",
"description": "Will save all temporary rules"
},
"userRulesEdit": {
"message": "Redakti",
"description": "Will enable manual-edit mode (textarea)"
},
"userRulesEditSave": {
"message": "Konservi",
"description": "Will save manually-edited content and exit manual-edit mode"
},
"userRulesEditDicard": {
"message": "Ignori",
"description": "Will discard manually-edited content and exit manual-edit mode"
},
"userRulesImport": {
"message": "Importi el dosiero...",
"description": ""
},
"userRulesExport": {
"message": "Eksporti al dosiero...",
"description": ""
},
"userRulesFormatHint": {
"message": "See this page for rule syntax.",
"description": ""
},
"userRulesDefaultFileName": {
"message": "miaj-umatrix-reguloj.txt",
"description": "default file name to use"
},
"assetsHostsSection": {
"message": "Hosts files",
"description": "header to identify the hosts files section"
},
"hostsFilesPrompt": {
"message": "All hostnames in a hosts file are loaded as blacklisted hostnames in the global scope.",
"description": ""
},
"hostsFilesStats": {
"message": "{{blockedHostnameCount}} distinct blocked hostnames from:",
"description": ""
},
"hostsFilesPerFileStats": {
"message": "{{used}} used out of {{total}}",
"description": ""
},
"hostsFilesLastUpdate": {
"message": "Lasta ĝisdatigo: {{ago}}",
"description": "English: Last update: {{ago}}, where 'ago' will be replaced with something like '2 days ago'"
},
"hostsFilesApplyChanges": {
"message": "Apliki ŝanĝojn",
"description": ""
},
"hostsFilesAutoUpdatePrompt": {
"message": "Auto-update assets",
"description": ""
},
"hostsFilesUpdateNow": {
"message": "Ĝisdatigi nun",
"description": ""
},
"hostsFilesPurgeAll": {
"message": "Malplenigi ĉiujn kaŝmemorojn",
"description": ""
},
"hostsFilesExternalListsHint": {
"message": "Import external assets here: \nOne URL per line; invalid URLs will be silently ignored.",
"description": ""
},
"hostsFilesExternalListsParse": {
"message": "Analizi",
"description": ""
},
"hostsFilesExternalListPurge": {
"message": "malplenigi kaŝmemoron",
"description": ""
},
"hostsFilesExternalListNew": {
"message": "nova versio disponebla",
"description": ""
},
"hostsFilesExternalListObsolete": {
"message": "neĝisdata",
"description": ""
},
"assetsRecipesSection": {
"message": "Ruleset recipes",
"description": "header to identify the ruleset files section"
},
"assetsRecipesSummary": {
"message": "Ruleset recipes are imported from the popup panel <em>on demand</em>, i.e. <b>only</b> through user interaction.",
"description": ""
},
"assetsImportLabel": {
"message": "Import...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Warning! Change these raw configuration settings at your own risk.",
"description": ""
},
"aboutChangelog": {
"message": "<a href='https://github.com/geekprojects/nuTensor/releases'>Ŝanĝoprotokolo</a>",
"description": ""
},
"aboutStorageUsed": {
"message": "Storage used: {{storageUsed}} bytes",
"description": ""
},
"aboutDoc": {
"message": "<a href='https://github.com/geekprojects/nuTensor/wiki'>Documentation</a>",
"description": ""
},
"aboutPermissions": {
"message": "<a href='https://github.com/geekprojects/nuTensor/wiki/Permissions'>Permissions</a>",
"description": ""
},
"aboutCode": {
"message": "Fontkodo (GPLv3)",
"description": ""
},
"aboutIssues": {
"message": "Cimoj kaj problemoj",
"description": "Text for a link to official issue tracker"
},
"aboutContributors": {
"message": "Kontribuantoj",
"description": "English: Contributors"
},
"aboutCodeContributors": {
"message": "Kode:",
"description": ""
},
"aboutIssueContributors": {
"message": "Problemoj:",
"description": ""
},
"aboutTranslationContributors": {
"message": "Tradukoj:",
"description": ""
},
"aboutUserDataHeader": {
"message": "Viaj datumoj",
"description": ""
},
"aboutBackupButton": {
"message": "Savkopii al dosiero...",
"description": ""
},
"aboutBackupFilename": {
"message": "mia-umatrix-savkopio.txt",
"description": "default filename to use"
},
"aboutRestoreButton": {
"message": "Restore from file...",
"description": ""
},
"aboutRestoreConfirm": {
"message": "All your settings will be overwritten using data backed up on {{time}}, and nuTensor will restart.\n\nOverwrite all existing settings using backed up data?",
"description": "Message asking user to confirm restore"
},
"aboutRestoreError": {
"message": "The data could not be read or is invalid",
"description": ""
},
"aboutOr": {
"message": "... aŭ ...",
"description": "English: ... or ..."
},
"aboutResetButton": {
"message": "Reset to default settings",
"description": "English: Reset to default settings"
},
"aboutResetConfirm": {
"message": "Caution! this will remove all your custom settings. Are you sure you want to proceed?",
"description": "Message asking user to confirm reset"
},
"mainBlockedPrompt1": {
"message": "nuTensor has prevented the following page from loading:",
"description": "English: nuTensor has prevented the following page from loading:"
},
"mainBlockedPrompt2": {
"message": "Because of the following rule",
"description": "English: Because of the following rule"
},
"mainBlockedNoParamsPrompt": {
"message": "without parameters",
"description": "label to be used for the parameter-less URL: https://cloud.githubusercontent.com/assets/585534/9832014/bfb1b8f0-593b-11e5-8a27-fba472a5529a.png"
},
"mainBlockedBack": {
"message": "Reen",
"description": "English: Go back"
},
"mainBlockedClose": {
"message": "Fermi",
"description": "English: Close"
},
"commandRevertAll": {
"message": "Revert all temporary changes",
"description": ""
},
"commandWhitelistPageDomain": {
"message": "Temporarily whitelist page domain",
"description": ""
},
"commandWhitelistAll": {
"message": "Temporarily whitelist all",
"description": ""
},
"commandOpenDashboard": {
"message": "Malfermi la panelo",
"description": ""
},
"elapsedOneMinuteAgo": {
"message": "antaŭ 1 minuto",
"description": "English: a minute ago"
},
"elapsedManyMinutesAgo": {
"message": "antaŭ {{value}} minutoj",
"description": "English: {{value}} minutes ago"
},
"elapsedOneHourAgo": {
"message": "antaŭ 1 horo",
"description": "English: an hour ago"
},
"elapsedManyHoursAgo": {
"message": "antaŭ {{value}} horoj",
"description": "English: {{value}} hours ago"
},
"elapsedOneDayAgo": {
"message": "antaŭ 1 tago",
"description": "English: a day ago"
},
"elapsedManyDaysAgo": {
"message": "antaŭ {{value}} tagoj",
"description": "English: {{value}} days ago"
},
"showDashboardButton": {
"message": "Panelo",
"description": "Appears in Firefox's add-on preferences"
},
"showLoggerButton": {
"message": "Protokolilo",
"description": "Appears in Firefox's add-on preferences"
},
"cloudPush": {
"message": "Eksporti al nuba konservado",
"description": "tooltip"
},
"cloudPull": {
"message": "Importi el nuba konservado",
"description": "tooltip"
},
"cloudNoData": {
"message": "...\n...",
"description": ""
},
"cloudDeviceNamePrompt": {
"message": "Nomo de ĉi tiu aparato:",
"description": "used as a prompt for the user to provide a custom device name"
},
"genericSubmit": {
"message": "Sendi",
"description": "for generic 'submit' buttons"
},
"genericRevert": {
"message": "Malfari",
"description": "for generic 'revert' buttons"
},
"errorCantConnectTo": {
"message": "Reteraro: {{url}} ne konekteblas",
"description": ""
},
"genericApplyChanges": {
"message": "Apply changes",
"description": "for generic 'Apply changes' buttons"
},
"genericCopyToClipboard": {
"message": "Copy to clipboard",
"description": "Label for buttons used to copy something to the clipboard"
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save