xiMatrix

filter net requests according to source, destination and type  https://addons.mozilla.org/firefox/addon/ximatrix/
git clone https://git.ce9e.org/xiMatrix.git

commit
c4910e465a8e0f53829b43d2db353313850d9967
parent
9336849b9887cde4da2265119028f7069a0614ce
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2022-11-27 07:23
mv edit raw rules to settings page

Diffstat

M manifest.json 4 ++++
M src/bg.js 5 +----
M src/popup.css 11 +++++------
M src/popup.html 11 +----------
M src/popup.js 17 ++---------------
A src/settings.css 27 +++++++++++++++++++++++++++
A src/settings.html 15 +++++++++++++++
A src/settings.js 15 +++++++++++++++

8 files changed, 70 insertions, 35 deletions


diff --git a/manifest.json b/manifest.json

@@ -22,6 +22,10 @@
   22    22     "matches": ["<all_urls>"],
   23    23     "run_at": "document_start"
   24    24   }],
   -1    25   "options_ui": {
   -1    26     "page": "src/settings.html",
   -1    27     "open_in_tab": true
   -1    28   },
   25    29   "permissions": [
   26    30     "storage",
   27    31     "tabs",

diff --git a/src/bg.js b/src/bg.js

@@ -101,10 +101,6 @@ browser.runtime.onMessage.addListener((msg, sender) => {
  101   101         ).then(getRules).then(rules => {
  102   102             return restrictRules(rules, msg.data.context);
  103   103         });
  104    -1     } else if (msg.type === 'getAllRules') {
  105    -1         return getRules();
  106    -1     } else if (msg.type === 'setAllRules') {
  107    -1         return browser.storage.local.set({'rules': msg.data});
  108   104     } else if (msg.type === 'securitypolicyviolation') {
  109   105         return pushRequest(sender.tab.id, 'inline', msg.data);
  110   106     }
@@ -134,6 +130,7 @@ browser.webRequest.onBeforeRequest.addListener(details => {
  134   130     ]).then(([_, rules]) => {
  135   131         if (!shared.shouldAllow(rules, context, hostname, type)) {
  136   132             if (details.type === 'sub_frame') {
   -1   133                 // this can in turn be blocked by a local CSP
  137   134                 return {redirectUrl: 'data:,' + encodeURIComponent(details.url)};
  138   135             } else {
  139   136                 return {cancel: true};

diff --git a/src/popup.css b/src/popup.css

@@ -6,9 +6,14 @@
    6     6 	--text-dark: #fff;
    7     7 }
    8     8 
   -1     9 [name="settings"] {
   -1    10 	float: right;
   -1    11 }
   -1    12 
    9    13 table {
   10    14 	background: var(--red-light);
   11    15 	border-spacing: 0;
   -1    16 	margin-bottom: 0.2em;
   12    17 }
   13    18 th, td {
   14    19 	position: relative;
@@ -53,9 +58,3 @@ input ~ span {
   53    58 input:checked ~ span {
   54    59 	color: var(--text-dark);
   55    60 }
   56    -1 
   57    -1 textarea {
   58    -1 	display: block;
   59    -1 	width: 100%;
   60    -1 	resize: vertical;
   61    -1 }

diff --git a/src/popup.html b/src/popup.html

@@ -6,15 +6,7 @@
    6     6 </head>
    7     7 <body>
    8     8 	<table></table>
    9    -1 
   10    -1 	<details class="raw-rules">
   11    -1 		<summary>Edit raw rules</summary>
   12    -1 		<form>
   13    -1 			<textarea rows="10"></textarea>
   14    -1 			<button>Save</button>
   15    -1 		</form>
   16    -1 	</details>
   17    -1 
   -1     9 	<button type="button" name="settings">Edit rules</button>
   18    10 	<details>
   19    11 		<summary>Help</summary>
   20    12 		<p>In the table above, the columns represent different types of requests. The rows represent domains. Numbers show how many requests of a given type the current tab tries to make to the given domain. Red cells are blocked, green cells are allowed. Light green cells are allowed indirectly, e.g. because they represent a sub-domain of an allowed domain. Grey cells are disabled.</p>
@@ -25,7 +17,6 @@
   25    17 			<li><strong>sub-domains</strong>: If you allow a domain, all of its sub-domains are allowed along with it.</li>
   26    18 		</ul>
   27    19 	</details>
   28    -1 
   29    20 	<script src="shared.js"></script>
   30    21 	<script src="popup.js"></script>
   31    22 </body>

diff --git a/src/popup.js b/src/popup.js

@@ -5,7 +5,6 @@ var requests;
    5     5 var rules;
    6     6 
    7     7 var table = document.querySelector('table');
    8    -1 var rawRules = document.querySelector('.raw-rules');
    9     8 
   10     9 var sendMessage = function(type, data) {
   11    10     return browser.runtime.sendMessage({type: type, data: data});
@@ -150,20 +149,8 @@ var loadContext = function(c) {
  150   149 
  151   150 browser.webNavigation.onBeforeNavigate.addListener(window.close);
  152   151 
  153    -1 rawRules.addEventListener('toggle', () => {
  154    -1     if (rawRules.open) {
  155    -1         var textarea = rawRules.querySelector('textarea');
  156    -1         sendMessage('getAllRules').then(allRules => {
  157    -1             textarea.value = JSON.stringify(allRules, null, 2);
  158    -1         });
  159    -1     }
  160    -1 });
  161    -1 
  162    -1 rawRules.querySelector('form').addEventListener('submit', event => {
  163    -1     event.preventDefault();
  164    -1     var textarea = rawRules.querySelector('textarea');
  165    -1     var newRules = JSON.parse(textarea.value);
  166    -1     sendMessage('setAllRules', newRules).then(window.close);
   -1   152 document.querySelector('[name="settings"]').addEventListener('click', event => {
   -1   153     browser.runtime.openOptionsPage();
  167   154 });
  168   155 
  169   156 document.addEventListener('DOMContentLoaded', () => {

diff --git a/src/settings.css b/src/settings.css

@@ -0,0 +1,27 @@
   -1     1 * {
   -1     2 	box-sizing: border-box;
   -1     3 }
   -1     4 
   -1     5 html,
   -1     6 body {
   -1     7 	margin: 0;
   -1     8 	padding: 0;
   -1     9 }
   -1    10 
   -1    11 form {
   -1    12 	height: 100vh;
   -1    13 	display: grid;
   -1    14 	grid-template-rows: 1fr min-content;
   -1    15 	grid-gap: 0.5em;
   -1    16 	padding: 0.5em;
   -1    17 }
   -1    18 
   -1    19 textarea {
   -1    20 	width: 100%;
   -1    21 	resize: none;
   -1    22 }
   -1    23 
   -1    24 button {
   -1    25 	padding: 0.5em 2em;
   -1    26 	justify-self: end;
   -1    27 }

diff --git a/src/settings.html b/src/settings.html

@@ -0,0 +1,15 @@
   -1     1 <!DOCTYPE html>
   -1     2 <html>
   -1     3 <head>
   -1     4 	<meta charset="utf-8">
   -1     5 	<link rel="stylesheet" href="settings.css">
   -1     6 </head>
   -1     7 <body>
   -1     8 	<form>
   -1     9 		<textarea></textarea>
   -1    10 		<button>Save</button>
   -1    11 	</form>
   -1    12 	<script src="shared.js"></script>
   -1    13 	<script src="settings.js"></script>
   -1    14 </body>
   -1    15 </html>

diff --git a/src/settings.js b/src/settings.js

@@ -0,0 +1,15 @@
   -1     1 var form = document.querySelector('form');
   -1     2 var textarea = document.querySelector('textarea');
   -1     3 
   -1     4 browser.storage.local.get('rules').then(data => {
   -1     5 	var rules = data.rules || {};
   -1     6 	textarea.value = JSON.stringify(rules, null, 2)
   -1     7 });
   -1     8 
   -1     9 form.addEventListener('submit', event => {
   -1    10 	event.preventDefault();
   -1    11 	var rules = JSON.parse(textarea.value);
   -1    12 	browser.storage.local.set({'rules': rules}).then(() => {
   -1    13 		location.reload();
   -1    14 	});
   -1    15 });