Project

General

Profile

« Previous | Next » 

Revision 2bd35bc4

Added by koszko almost 2 years ago

rename the extension to "Haketilo"

View differences:

README.txt
1
# Hachette - Make The Web Great Again! #
1
# Haketilo - Make The Web Great Again! #
2 2

  
3 3
This extension's goal is to allow replacing javascript served by websites
4 4
with scripts specified by user. Something like NoScript and Greasemonkey
......
9 9
and various forks of Firefox (version 60+).
10 10

  
11 11
This extension is still in an early stage. Also see
12
`https://hachettebugs.koszko.org/projects/hachette/wiki/' for documentation in
12
`https://hydrillabugs.koszko.org/projects/haketilo/wiki/' for documentation in
13 13
development.
14 14

  
15 15
## Installation ##
......
28 28

  
29 29
## Contributing ##
30 30
Get the code from: https://git.koszko.org/browser-extension/
31
Come to: https://hachettebugs.koszko.org/projects/hachette
31
Come to: https://hydrillabugs.koszko.org/projects/haketilo
32 32

  
33 33
Optionally, write to $(echo a29zemtvQGtvc3prby5vcmcK | base64 -d)
background/cookie_filter.js
1 1
/**
2
 * part of Hachette
3
 * Filtering request headers to remove hachette cookies that might have slipped
4
 * through.
2
 * This file is part of Haketilo.
3
 *
4
 * Function: Filtering request headers to remove haketilo cookies that might
5
 *     have slipped through.
5 6
 *
6 7
 * Copyright (C) 2021 Wojtek Kosior
7 8
 * Redistribution terms are gathered in the `copyright' file.
......
13 14
 * IMPORTS_END
14 15
 */
15 16

  
16
function is_valid_hachette_cookie(cookie)
17
function is_valid_haketilo_cookie(cookie)
17 18
{
18
    const match = /^hachette-(\w*)=(.*)$/.exec(cookie);
19
    const match = /^haketilo-(\w*)=(.*)$/.exec(cookie);
19 20
    if (!match)
20 21
	return false;
21 22

  
22 23
    return !extract_signed(match.slice(1, 3)).fail;
23 24
}
24 25

  
25
function remove_hachette_cookies(header)
26
function remove_haketilo_cookies(header)
26 27
{
27 28
    if (header.name !== "Cookie")
28 29
	return header;
29 30

  
30 31
    const cookies = header.value.split("; ");
31
    const value = cookies.filter(c => !is_valid_hachette_cookie(c)).join("; ");
32
    const value = cookies.filter(c => !is_valid_haketilo_cookie(c)).join("; ");
32 33

  
33 34
    return value ? {name: "Cookie", value} : null;
34 35
}
35 36

  
36 37
function filter_cookie_headers(headers)
37 38
{
38
    return headers.map(remove_hachette_cookies).filter(h => h);
39
    return headers.map(remove_haketilo_cookies).filter(h => h);
39 40
}
40 41

  
41 42
/*
background/main.js
1 1
/**
2
 * Hachette main background script
2
 * This file is part of Haketilo.
3
 *
4
 * Function: Main background script.
3 5
 *
4 6
 * Copyright (C) 2021 Wojtek Kosior
5 7
 * Redistribution terms are gathered in the `copyright' file.
background/page_actions_server.js
1 1
/**
2
 * Hachette serving of page actions to content scripts
2
 * This file is part of Haketilo.
3
 *
4
 * Function: Serving page actions to content scripts.
3 5
 *
4 6
 * Copyright (C) 2021 Wojtek Kosior
5 7
 * Redistribution terms are gathered in the `copyright' file.
background/policy_injector.js
1 1
/**
2
 * Hachette injecting policy to page using webRequest
2
 * This file is part of Haketilo.
3
 *
4
 * Function: Injecting policy to page by modifying HTTP headers.
3 5
 *
4 6
 * Copyright (C) 2021 Wojtek Kosior
5 7
 * Copyright (C) 2021 jahoti
......
19 21
{
20 22
    let csp_headers;
21 23
    let old_signature;
22
    let hachette_header;
24
    let haketilo_header;
23 25

  
24
    for (const header of headers.filter(h => h.name === "x-hachette")) {
25
	/* x-hachette header has format: <signature>_0_<data> */
26
    for (const header of headers.filter(h => h.name === "x-haketilo")) {
27
	/* x-haketilo header has format: <signature>_0_<data> */
26 28
	const match = /^([^_]+)_(0_.*)$/.exec(header.value);
27 29
	if (!match)
28 30
	    continue;
......
38 40
	csp_headers = old_data.csp_headers;
39 41
	old_signature = old_data.policy_sig;
40 42

  
41
	hachette_header = header;
43
	haketilo_header = header;
42 44
	break;
43 45
    }
44 46

  
......
53 55
	headers.push(...csp_headers || []);
54 56
    }
55 57

  
56
    if (!hachette_header) {
57
	hachette_header = {name: "x-hachette"};
58
	headers.push(hachette_header);
58
    if (!haketilo_header) {
59
	haketilo_header = {name: "x-haketilo"};
60
	headers.push(haketilo_header);
59 61
    }
60 62

  
61 63
    if (old_signature)
......
66 68
    const later_30sec = new Date(new Date().getTime() + 30000).toGMTString();
67 69
    headers.push({
68 70
	name: "Set-Cookie",
69
	value: `hachette-${signed_policy.join("=")}; Expires=${later_30sec};`
71
	value: `haketilo-${signed_policy.join("=")}; Expires=${later_30sec};`
70 72
    });
71 73

  
72 74
    /*
......
74 76
     * These are signed with a time of 0, as it's not clear there is a limit on
75 77
     * how long Firefox might retain headers in the cache.
76 78
     */
77
    let hachette_data = {csp_headers, policy_sig: signed_policy[0]};
78
    hachette_data = encodeURIComponent(JSON.stringify(hachette_data));
79
    hachette_header.value = sign_data(hachette_data, 0).join("_");
79
    let haketilo_data = {csp_headers, policy_sig: signed_policy[0]};
80
    haketilo_data = encodeURIComponent(JSON.stringify(haketilo_data));
81
    haketilo_header.value = sign_data(haketilo_data, 0).join("_");
80 82

  
81 83
    if (!policy.allow) {
82 84
	headers.push({
background/storage.js
1 1
/**
2
 * Hachette storage manager
2
 * This file is part of Haketilo.
3
 *
4
 * Function: Storage manager.
3 5
 *
4 6
 * Copyright (C) 2021 Wojtek Kosior
5 7
 * Redistribution terms are gathered in the `copyright' file.
background/storage_server.js
1 1
/**
2
 * Hachette storage through connection (server side)
2
 * This file is part of Haketilo.
3
 *
4
 * Function: Storage through messages (server side).
3 5
 *
4 6
 * Copyright (C) 2021 Wojtek Kosior
5 7
 * Redistribution terms are gathered in the `copyright' file.
background/stream_filter.js
1 1
/**
2
 * Hachette modifying a web page using the StreamFilter API
2
 * This file is part of Haketilo.
3
 *
4
 * Function: Modifying a web page using the StreamFilter API.
3 5
 *
4 6
 * Copyright (C) 2018 Giorgio Maone <giorgio@maone.net>
5 7
 * Copyright (C) 2021 Wojtek Kosior
......
173 175
	 */
174 176

  
175 177
	const dummy_script =
176
	      `<script data-hachette-deleteme="${properties.policy.nonce}" nonce="${properties.policy.nonce}">null</script>`;
178
	      `<script data-haketilo-deleteme="${properties.policy.nonce}" nonce="${properties.policy.nonce}">null</script>`;
177 179
	const doctype_decl = /^(\s*<!doctype[^<>"']*>)?/i.exec(decoded)[0];
178 180
	decoded = doctype_decl + dummy_script +
179 181
	    decoded.substring(doctype_decl.length);
common/ajax.js
1 1
/**
2
 * part of Hachette
3
 * Wrapping XMLHttpRequest into a Promise.
2
 * This file is part of Haketilo.
3
 *
4
 * Function: Wrapping XMLHttpRequest into a Promise.
4 5
 *
5 6
 * Copyright (C) 2021 Wojtek Kosior
6 7
 * Redistribution terms are gathered in the `copyright' file.
common/connection_types.js
1 1
/**
2
 * Hachette background scripts message connection types "enum"
2
 * This file is part of Haketilo.
3
 *
4
 * Function: Define an "enum" of message connection types.
3 5
 *
4 6
 * Copyright (C) 2021 Wojtek Kosior
5 7
 * Redistribution terms are gathered in the `copyright' file.
common/lock.js
1 1
/**
2
 * Hachette lock (aka binary semaphore aka mutex)
2
 * This file is part of Haketilo.
3
 *
4
 * Function: Implement a lock (aka binary semaphore aka mutex).
3 5
 *
4 6
 * Copyright (C) 2021 Wojtek Kosior
5 7
 * Redistribution terms are gathered in the `copyright' file.
common/message_server.js
1 1
/**
2
 * Hachette message server
2
 * This file is part of Haketilo.
3
 *
4
 * Function: Message server.
3 5
 *
4 6
 * Copyright (C) 2021 Wojtek Kosior
5 7
 * Redistribution terms are gathered in the `copyright' file.
common/misc.js
1 1
/**
2
 * Hachette miscellaneous operations refactored to a separate file
2
 * This file is part of Haketilo.
3
 *
4
 * Function: Miscellaneous operations refactored to a separate file.
3 5
 *
4 6
 * Copyright (C) 2021 Wojtek Kosior
5 7
 * Copyright (C) 2021 jahoti
common/observable.js
1 1
/**
2
 * part of Hachette
3
 * Facilitate listening to events
2
 * This file is part of Haketilo.
3
 *
4
 * Function: Facilitate listening to (internal, self-generated) events.
4 5
 *
5 6
 * Copyright (C) 2021 Wojtek Kosior
6 7
 * Redistribution terms are gathered in the `copyright' file.
common/once.js
1 1
/**
2
 * Hachette feature initialization promise
2
 * This file is part of Haketilo.
3
 *
4
 * Function: Wrap APIs that depend on some asynchronous initialization into
5
 *     promises.
3 6
 *
4 7
 * Copyright (C) 2021 Wojtek Kosior
5 8
 * Redistribution terms are gathered in the `copyright' file.
common/patterns.js
1 1
/**
2
 * Hachette operations on page url patterns
2
 * This file is part of Haketilo.
3
 *
4
 * Function: Operations on page URL patterns.
3 5
 *
4 6
 * Copyright (C) 2021 Wojtek Kosior
5 7
 * Redistribution terms are gathered in the `copyright' file.
common/sanitize_JSON.js
1 1
/**
2
 * part of Hachette
3
 * Powerful, full-blown format enforcer for externally-obtained JSON
2
 * This file is part of Haketilo.
3
 *
4
 * Function: Powerful, full-blown format enforcer for externally-obtained JSON.
4 5
 *
5 6
 * Copyright (C) 2021 Wojtek Kosior
6 7
 * Redistribution terms are gathered in the `copyright' file.
common/settings_query.js
1 1
/**
2
 * Hachette querying page settings with regard to wildcard records
2
 * This file is part of Haketilo.
3
 *
4
 * Function: Querying page settings.
3 5
 *
4 6
 * Copyright (C) 2021 Wojtek Kosior
5 7
 * Redistribution terms are gathered in the `copyright' file.
common/signing.js
1 1
/**
2
 * part of Hachette
3
 * Functions related to "signing" of data, refactored to a separate file.
2
 * This file is part of Haketilo.
3
 *
4
 * Functions: Operations related to "signing" of data.
4 5
 *
5 6
 * Copyright (C) 2021 Wojtek Kosior
6 7
 * Redistribution terms are gathered in the `copyright' file.
......
16 17

  
17 18
/*
18 19
 * In order to make certain data synchronously accessible in certain contexts,
19
 * hachette smuggles it in string form in places like cookies, URLs and headers.
20
 * Haketilo smuggles it in string form in places like cookies, URLs and headers.
20 21
 * When using the smuggled data, we first need to make sure it isn't spoofed.
21 22
 * For that, we use this pseudo-signing mechanism.
22 23
 *
common/storage_client.js
1 1
/**
2
 * Hachette storage through connection (client side)
2
 * This file is part of Haketilo.
3
 *
4
 * Function: Storage through messages (client side).
3 5
 *
4 6
 * Copyright (C) 2021 Wojtek Kosior
5 7
 * Redistribution terms are gathered in the `copyright' file.
common/storage_light.js
1 1
/**
2
 * part of Hachette
3
 * Storage manager, lighter than the previous one.
2
 * This file is part of Haketilo.
3
 *
4
 * Function: Storage manager, lighter than the previous one.
4 5
 *
5 6
 * Copyright (C) 2021 Wojtek Kosior
6 7
 * Redistribution terms are gathered in the `copyright' file.
common/storage_raw.js
1 1
/**
2
 * part of Hachette
3
 * Basic wrappers for storage API functions.
2
 * This file is part of Haketilo.
3
 *
4
 * Function: Basic wrappers for storage API functions.
4 5
 *
5 6
 * Copyright (C) 2021 Wojtek Kosior
6 7
 * Redistribution terms are gathered in the `copyright' file.
common/stored_types.js
1 1
/**
2
 * Hachette stored item types "enum"
2
 * This file is part of Haketilo.
3
 *
4
 * Function: Define an "enum" of stored item types.
3 5
 *
4 6
 * Copyright (C) 2021 Wojtek Kosior
5 7
 * Redistribution terms are gathered in the `copyright' file.
content/activity_info_server.js
1 1
/**
2
 * part of Hachette
3
 * Informing about activities performed by content script (script injection,
4
 * script blocking).
2
 * This file is part of Haketilo.
3
 *
4
 * Function: Informing the popup about what happens in the content script
5
 *     (script injection, script blocking, etc.).
5 6
 *
6 7
 * Copyright (C) 2021 Wojtek Kosior
7 8
 * Redistribution terms are gathered in the `copyright' file.
content/main.js
1 1
/**
2
 * Hachette main content script run in all frames
2
 * This file is part of Haketilo.
3
 *
4
 * Function: Main content script that runs in all frames.
3 5
 *
4 6
 * Copyright (C) 2021 Wojtek Kosior
5 7
 * Copyright (C) 2021 jahoti
......
33 35
    let policy = null;
34 36
    const extracted_signatures = [];
35 37

  
36
    for (const match of cookie.matchAll(/hachette-(\w*)=([^;]*)/g)) {
38
    for (const match of cookie.matchAll(/haketilo-(\w*)=([^;]*)/g)) {
37 39
	const new_result = extract_signed(...match.slice(1, 3));
38 40
	if (new_result.fail)
39 41
	    continue;
......
60 62
    const [base_url, payload, anchor] =
61 63
	  /^([^#]*)#?([^#]*)(#?.*)$/.exec(url).splice(1, 4);
62 64

  
63
    const match = /^hachette_([^_]+)_(.*)$/.exec(payload);
65
    const match = /^haketilo_([^_]+)_(.*)$/.exec(payload);
64 66
    if (!match)
65 67
	return [null, url];
66 68

  
......
83 85
    policy.nonce = gen_nonce();
84 86
    const [base_url, target] = /^([^#]*)(#?.*)$/.exec(policy.url).slice(1, 3);
85 87
    const encoded_policy = encodeURIComponent(JSON.stringify(policy));
86
    const payload = "hachette_" +
88
    const payload = "haketilo_" +
87 89
	  sign_data(encoded_policy, new Date().getTime()).join("_");
88 90
    const resulting_url = `${base_url}#${payload}${target}`;
89 91
    location.href = resulting_url;
......
187 189

  
188 190
function sanitize_script(script)
189 191
{
190
    script.hachette_blocked_type = script.getAttribute("type");
192
    script.haketilo_blocked_type = script.getAttribute("type");
191 193
    script.type = "text/plain";
192 194
}
193 195

  
......
197 199
 */
198 200
function desanitize_script(script)
199 201
{
200
    script.setAttribute("type", script.hachette_blocked_type);
202
    script.setAttribute("type", script.haketilo_blocked_type);
201 203

  
202
    if ([null, undefined].includes(script.hachette_blocked_type))
204
    if ([null, undefined].includes(script.haketilo_blocked_type))
203 205
	script.removeAttribute("type");
204 206

  
205
    delete script.hachette_blocked_type;
207
    delete script.haketilo_blocked_type;
206 208
}
207 209

  
208 210
const bad_url_reg = /^data:([^,;]*ml|unknown-content-type)/i;
......
235 237
 */
236 238
function prevent_script_execution(event)
237 239
{
238
    if (!event.target._hachette_payload)
240
    if (!event.target.haketilo_payload)
239 241
	event.preventDefault();
240 242
}
241 243

  
......
336 338
	let signatures;
337 339
	[policy, signatures] = extract_cookie_policy(document.cookie, min_time);
338 340
	for (const signature of signatures)
339
	    document.cookie = `hachette-${signature}=; Max-Age=-1;`;
341
	    document.cookie = `haketilo-${signature}=; Max-Age=-1;`;
340 342
    } else {
341 343
	const scheme = /^([^:]*)/.exec(document.URL)[1];
342 344
	const known_scheme = ["file", "ftp"].includes(scheme);
content/page_actions.js
1 1
/**
2
 * Hachette handling of page actions in content scripts
2
 * This file is part of Haketilo.
3
 *
4
 * Function: Handle page actions in a content script.
3 5
 *
4 6
 * Copyright (C) 2021 Wojtek Kosior
5 7
 * Redistribution terms are gathered in the `copyright' file.
......
60 62
    let script = document.createElement("script");
61 63
    script.textContent = script_text;
62 64
    script.setAttribute("nonce", nonce);
63
    script._hachette_payload = true;
65
    script.haketilo_payload = true;
64 66
    document.body.appendChild(script);
65 67

  
66 68
    report_script(script_text);
content/repo_query.js
1 1
/**
2
 * part of Hachette
3
 * Getting available content for site from remote repositories.
2
 * This file is part of Haketilo.
3
 *
4
 * Function: Getting available content for site from remote repositories.
4 5
 *
5 6
 * Copyright (C) 2021 Wojtek Kosior
6 7
 * Redistribution terms are gathered in the `copyright' file.
copyright
1 1
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
2
Upstream-Name: Hachette
2
Upstream-Name: Haketilo
3 3
Source: https://git.koszko.org/browser-extension/
4 4

  
5 5
Files: *
html/DOM_helpers.js
1 1
/**
2
 * Hachette operations on DOM elements
2
 * This file is part of Haketilo.
3
 *
4
 * Function: Operations on DOM elements.
3 5
 *
4 6
 * Copyright (C) 2021 Wojtek Kosior
5 7
 * Redistribution terms are gathered in the `copyright' file.
html/MOZILLA_scrollbar_fix.css
1 1
/**
2
 * Hachette
3
 * Hacky fix for vertical scrollbar width being included in child's width.
2
 * This file is part of Haketilo.
3
 *
4
 * Function: Hacky fix for vertical scrollbar width being included in child's
5
 *     width.
4 6
 *
5 7
 * Copyright (C) 2021 Wojtek Kosior
6 8
 * Redistribution terms are gathered in the `copyright' file.
html/back_button.css
1 1
/**
2
 * part of Hachette
3
 * Style for a "back" button with a CSS arrow image.
2
 * This file is part of Haketilo.
3
 *
4
 * Function: Style for a "back" button with a CSS arrow image.
4 5
 *
5 6
 * Copyright (C) 2021 Wojtek Kosior
6 7
 * Redistribution terms are gathered in the `copyright' file.
html/base.css
1 1
/**
2
 * Hachette base styles
2
 * This file is part of Haketilo.
3
 *
4
 * Function: Base styles.
3 5
 *
4 6
 * Copyright (C) 2021 Wojtek Kosior
5 7
 * Copyright (C) 2021 Nicholas Johnson
html/default_blocking_policy.js
1 1
/**
2
 * part of Hachette
3
 * Default policy dialog logic.
2
 * This file is part of Haketilo.
3
 *
4
 * Function: Logic for the dialog of default policy selection.
4 5
 *
5 6
 * Copyright (C) 2021 Wojtek Kosior
6 7
 * Redistribution terms are gathered in the `copyright' file.
html/display-panel.html
1 1
<!doctype html>
2 2
<!--
3
    This file is part of Haketilo.
4

  
5
    Function: Extension's popup page.
6

  
3 7
    Copyright (C) 2021 Wojtek Kosior
4 8
    Redistribution terms are gathered in the `copyright' file.
5 9
  -->
6 10
<html>
7 11
  <head>
8 12
    <meta charset="utf-8"/>
9
    <title>Hachette - page settings</title>
13
    <title>Haketilo - page settings</title>
10 14
    <link type="text/css" rel="stylesheet" href="reset.css" />
11 15
    <link type="text/css" rel="stylesheet" href="base.css" />
12 16
    <link type="text/css" rel="stylesheet" href="back_button.css" />
......
331 335

  
332 336
      <div class="footer padding_inline has_upper_thin_line">
333 337
	<button id="settings_but" type="button">
334
	  Open Hachette settings
338
	  Open Haketilo settings
335 339
	</button>
336 340
      </div>
337 341
    </div>
html/display-panel.js
1 1
/**
2
 * Hachette display panel logic
2
 * This file is part of Haketilo.
3
 *
4
 * Function: Popup logic.
3 5
 *
4 6
 * Copyright (C) 2021 Wojtek Kosior
5 7
 * Redistribution terms are gathered in the `copyright' file.
html/import_frame.js
1 1
/**
2
 * Hachette HTML import frame script
2
 * This file is part of Haketilo.
3
 *
4
 * Function: Logic for the settings import frame.
3 5
 *
4 6
 * Copyright (C) 2021 Wojtek Kosior
5 7
 * Redistribution terms are gathered in the `copyright' file.
html/options.html
1 1
<!doctype html>
2 2
<!--
3
    This file is part of Haketilo.
4

  
5
    Function: Extension's settings page.
6

  
3 7
    Copyright (C) 2021 Wojtek Kosior
4 8
    Redistribution terms are gathered in the `copyright' file.
5 9
  -->
6 10
<html>
7 11
  <head>
8 12
    <meta charset="utf-8"/>
9
    <title>Hachette options</title>
13
    <title>Haketilo options</title>
10 14
    <link type="text/css" rel="stylesheet" href="reset.css" />
11 15
    <link type="text/css" rel="stylesheet" href="base.css" />
12 16
    <link type="text/css" rel="stylesheet" href="table.css" />
html/options_main.js
1 1
/**
2
 * Hachette HTML options page main script
2
 * This file is part of Haketilo.
3
 *
4
 * Function: Settings page logic.
3 5
 *
4 6
 * Copyright (C) 2021 Wojtek Kosior
5 7
 * Redistribution terms are gathered in the `copyright' file.
icons/hachette.svg
1
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
<svg
3
   xmlns:dc="http://purl.org/dc/elements/1.1/"
4
   xmlns:cc="http://creativecommons.org/ns#"
5
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
6
   xmlns:svg="http://www.w3.org/2000/svg"
7
   xmlns="http://www.w3.org/2000/svg"
8
   width="128"
9
   height="128"
10
   viewBox="0 -0.6 33.866668 33.866666"
11
   version="1.1"
12
   id="svg8">
13
  <title
14
     id="title1418">Hatchet</title>
15
  <defs
16
     id="defs2">
17
    <filter
18
       style="color-interpolation-filters:sRGB"
19
       id="filter994"
20
       x="-0.78125864"
21
       width="2.5625174"
22
       y="-0.25392297"
23
       height="1.5078459">
24
      <feGaussianBlur
25
         stdDeviation="1.7304741"
26
         id="feGaussianBlur996" />
27
    </filter>
28
    <filter
29
       style="color-interpolation-filters:sRGB"
30
       id="filter1401"
31
       x="-0.43681362"
32
       width="1.8736273"
33
       y="-0.032828163"
34
       height="1.0656563">
35
      <feGaussianBlur
36
         stdDeviation="2.2606587"
37
         id="feGaussianBlur1403" />
38
    </filter>
39
  </defs>
40
  <metadata
41
     id="metadata5">
42
    <rdf:RDF>
43
      <cc:Work
44
         rdf:about="">
45
        <dc:format>image/svg+xml</dc:format>
46
        <dc:type
47
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
48
        <dc:title>Hatchet</dc:title>
49
        <dc:creator>
50
          <cc:Agent>
51
            <dc:title>David Lyons</dc:title>
52
          </cc:Agent>
53
        </dc:creator>
54
        <dc:publisher>
55
          <cc:Agent>
56
            <dc:title>dlyons</dc:title>
57
          </cc:Agent>
58
        </dc:publisher>
59
        <cc:license
60
           rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
61
        <dc:date>2017-05</dc:date>
62
        <dc:subject>
63
          <rdf:Bag>
64
            <rdf:li>hatchet</rdf:li>
65
            <rdf:li>ax</rdf:li>
66
            <rdf:li>wood</rdf:li>
67
          </rdf:Bag>
68
        </dc:subject>
69
        <dc:description>Hatchet</dc:description>
70
      </cc:Work>
71
      <cc:License
72
         rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
73
        <cc:permits
74
           rdf:resource="http://creativecommons.org/ns#Reproduction" />
75
        <cc:permits
76
           rdf:resource="http://creativecommons.org/ns#Distribution" />
77
        <cc:requires
78
           rdf:resource="http://creativecommons.org/ns#Notice" />
79
        <cc:requires
80
           rdf:resource="http://creativecommons.org/ns#Attribution" />
81
        <cc:permits
82
           rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
83
        <cc:requires
84
           rdf:resource="http://creativecommons.org/ns#ShareAlike" />
85
      </cc:License>
86
    </rdf:RDF>
87
  </metadata>
88
  <g
89
     transform="matrix(0.18053177,-0.14666587,0.14666587,0.18053177,-0.67884005,5.998568)"
90
     id="g4514">
91
    <path
92
       style="fill:#d38d5f;stroke-width:0.23824416"
93
       d="M 7.30405,153.7586 C 20.54927,112.215 15.59359,34.229537 16.31646,33.113187 c 0.87975,-1.35862 11.98736,-0.3859 11.70824,-0.21673 0.17326,45.22237 7.01132,84.510963 -0.71993,131.991763 l -9.29885,-5.88681 z"
94
       id="rect7" />
95
    <path
96
       style="stroke-width:0.27389684"
97
       d="m 63.328435,18.175599 c 0,0 -18.017818,8.640905 -27.631388,12.644707 -3.823279,1.592294 -7.11998,3.047871 -9.996289,4.376476 -11.35319,0.247708 -19.4479991,0.01005 -19.8799245,1.450041 l 0.01602,16.049149 c 0.1225108,1.704999 8.9933655,2.136989 19.9713905,3.333131 6.538886,4.233937 13.307605,8.532834 17.153475,10.714075 9.058079,5.13742 18.504813,7.823295 18.504813,7.823295 0,0 5.056977,-21.237215 4.911847,-31.707625 C 66.23324,32.388436 63.328435,18.175599 63.328435,18.175599 Z"
98
       id="rect9" />
99
    <path
100
       id="path35"
101
       d="m 63.328435,18.175599 c 0,0 2.905055,14.268926 3.050195,24.739336 0.14513,10.47041 -4.912098,31.651538 -4.912098,31.651538 -11.67798,-3.788669 -16.221256,-6.527691 -16.221256,-6.527691 0,0 7.434244,-7.591907 9.174294,-22.366997 1.1592,-16.80443 -4.045711,-21.40711 -4.045711,-21.40711 3.905919,-1.879065 11.01257,-5.216217 12.954576,-6.089076 z"
102
       style="opacity:0.45500004;fill:#ffffff;stroke-width:0.26458335" />
103
    <path
104
       style="opacity:0.45500004;fill:#ffffff;stroke-width:0.26458335"
105
       d="m 63.208938,17.51176 c 0,0 3.024552,14.932765 3.169692,25.403175 0.14513,10.47041 -4.912098,31.621519 -4.912098,31.621519 -1.568463,-0.523507 -1.541936,-0.491688 -1.541936,-0.491688 0,0 5.456154,-26.034461 5.211644,-30.225191 -0.0315,-4.2355 -1.218109,-20.314453 -3.453104,-24.783592 0,0 0.723943,-0.407792 1.645299,-0.860384 z"
106
       id="path1427" />
107
    <path
108
       style="fill:#784421;stroke:none;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
109
       d="m 7.30405,153.7586 10.40103,5.0627 c 0,0 9.14195,5.35641 9.55606,6.02467 0.41411,0.66827 -4.66818,-0.88342 -7.90926,-2.11367 -3.24108,-1.23026 -8.21159,-4.9245 -10.36004,-6.6929 -2.14844,-1.76841 -1.68779,-2.2808 -1.68779,-2.2808 z"
110
       id="path1407" />
111
    <path
112
       id="path999"
113
       d="M 7.30405,153.7586 C 17.372688,112.40594 21.015256,78.343761 17.898744,32.568697 l 3.350934,-0.138515 c 0.131707,45.014525 3.851339,79.911868 -2.025736,127.174438 z"
114
       style="opacity:0.3;fill:#2b1100;stroke-width:0.20724197" />
115
    <path
116
       style="opacity:1;fill:#1a1a1a;stroke:none;stroke-width:0.1832249"
117
       d="m 37.364038,35.560531 9.400174,-5.992052 c 4.831746,9.986754 3.508267,19.973509 -0.303231,29.960263 l -9.096943,-5.992051 z"
118
       id="rect4493" />
119
    <rect
120
       style="opacity:1;fill:#1a1a1a;stroke:none;stroke-width:0.37082145"
121
       id="rect4504"
122
       width="7.4658442"
123
       height="15.338916"
124
       x="23.754957"
125
       y="38.224262" />
126
  </g>
127
</svg>
icons/haketilo.svg
1
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
<svg
3
   xmlns:dc="http://purl.org/dc/elements/1.1/"
4
   xmlns:cc="http://creativecommons.org/ns#"
5
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
6
   xmlns:svg="http://www.w3.org/2000/svg"
7
   xmlns="http://www.w3.org/2000/svg"
8
   width="128"
9
   height="128"
10
   viewBox="0 -0.6 33.866668 33.866666"
11
   version="1.1"
12
   id="svg8">
13
  <title
14
     id="title1418">Hatchet</title>
15
  <defs
16
     id="defs2">
17
    <filter
18
       style="color-interpolation-filters:sRGB"
19
       id="filter994"
20
       x="-0.78125864"
21
       width="2.5625174"
22
       y="-0.25392297"
23
       height="1.5078459">
24
      <feGaussianBlur
25
         stdDeviation="1.7304741"
26
         id="feGaussianBlur996" />
27
    </filter>
28
    <filter
29
       style="color-interpolation-filters:sRGB"
30
       id="filter1401"
31
       x="-0.43681362"
32
       width="1.8736273"
33
       y="-0.032828163"
34
       height="1.0656563">
35
      <feGaussianBlur
36
         stdDeviation="2.2606587"
37
         id="feGaussianBlur1403" />
38
    </filter>
39
  </defs>
40
  <metadata
41
     id="metadata5">
42
    <rdf:RDF>
43
      <cc:Work
44
         rdf:about="">
45
        <dc:format>image/svg+xml</dc:format>
46
        <dc:type
47
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
48
        <dc:title>Hatchet</dc:title>
49
        <dc:creator>
50
          <cc:Agent>
51
            <dc:title>David Lyons</dc:title>
52
          </cc:Agent>
53
        </dc:creator>
54
        <dc:publisher>
55
          <cc:Agent>
56
            <dc:title>dlyons</dc:title>
57
          </cc:Agent>
58
        </dc:publisher>
59
        <cc:license
60
           rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
61
        <dc:date>2017-05</dc:date>
62
        <dc:subject>
63
          <rdf:Bag>
64
            <rdf:li>hatchet</rdf:li>
65
            <rdf:li>ax</rdf:li>
66
            <rdf:li>wood</rdf:li>
67
          </rdf:Bag>
68
        </dc:subject>
69
        <dc:description>Hatchet</dc:description>
70
      </cc:Work>
71
      <cc:License
72
         rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
73
        <cc:permits
74
           rdf:resource="http://creativecommons.org/ns#Reproduction" />
75
        <cc:permits
76
           rdf:resource="http://creativecommons.org/ns#Distribution" />
77
        <cc:requires
78
           rdf:resource="http://creativecommons.org/ns#Notice" />
79
        <cc:requires
80
           rdf:resource="http://creativecommons.org/ns#Attribution" />
81
        <cc:permits
82
           rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
83
        <cc:requires
84
           rdf:resource="http://creativecommons.org/ns#ShareAlike" />
85
      </cc:License>
86
    </rdf:RDF>
87
  </metadata>
88
  <g
89
     transform="matrix(0.18053177,-0.14666587,0.14666587,0.18053177,-0.67884005,5.998568)"
90
     id="g4514">
91
    <path
92
       style="fill:#d38d5f;stroke-width:0.23824416"
93
       d="M 7.30405,153.7586 C 20.54927,112.215 15.59359,34.229537 16.31646,33.113187 c 0.87975,-1.35862 11.98736,-0.3859 11.70824,-0.21673 0.17326,45.22237 7.01132,84.510963 -0.71993,131.991763 l -9.29885,-5.88681 z"
94
       id="rect7" />
95
    <path
96
       style="stroke-width:0.27389684"
97
       d="m 63.328435,18.175599 c 0,0 -18.017818,8.640905 -27.631388,12.644707 -3.823279,1.592294 -7.11998,3.047871 -9.996289,4.376476 -11.35319,0.247708 -19.4479991,0.01005 -19.8799245,1.450041 l 0.01602,16.049149 c 0.1225108,1.704999 8.9933655,2.136989 19.9713905,3.333131 6.538886,4.233937 13.307605,8.532834 17.153475,10.714075 9.058079,5.13742 18.504813,7.823295 18.504813,7.823295 0,0 5.056977,-21.237215 4.911847,-31.707625 C 66.23324,32.388436 63.328435,18.175599 63.328435,18.175599 Z"
98
       id="rect9" />
99
    <path
100
       id="path35"
101
       d="m 63.328435,18.175599 c 0,0 2.905055,14.268926 3.050195,24.739336 0.14513,10.47041 -4.912098,31.651538 -4.912098,31.651538 -11.67798,-3.788669 -16.221256,-6.527691 -16.221256,-6.527691 0,0 7.434244,-7.591907 9.174294,-22.366997 1.1592,-16.80443 -4.045711,-21.40711 -4.045711,-21.40711 3.905919,-1.879065 11.01257,-5.216217 12.954576,-6.089076 z"
102
       style="opacity:0.45500004;fill:#ffffff;stroke-width:0.26458335" />
103
    <path
104
       style="opacity:0.45500004;fill:#ffffff;stroke-width:0.26458335"
105
       d="m 63.208938,17.51176 c 0,0 3.024552,14.932765 3.169692,25.403175 0.14513,10.47041 -4.912098,31.621519 -4.912098,31.621519 -1.568463,-0.523507 -1.541936,-0.491688 -1.541936,-0.491688 0,0 5.456154,-26.034461 5.211644,-30.225191 -0.0315,-4.2355 -1.218109,-20.314453 -3.453104,-24.783592 0,0 0.723943,-0.407792 1.645299,-0.860384 z"
106
       id="path1427" />
107
    <path
108
       style="fill:#784421;stroke:none;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
109
       d="m 7.30405,153.7586 10.40103,5.0627 c 0,0 9.14195,5.35641 9.55606,6.02467 0.41411,0.66827 -4.66818,-0.88342 -7.90926,-2.11367 -3.24108,-1.23026 -8.21159,-4.9245 -10.36004,-6.6929 -2.14844,-1.76841 -1.68779,-2.2808 -1.68779,-2.2808 z"
110
       id="path1407" />
111
    <path
112
       id="path999"
113
       d="M 7.30405,153.7586 C 17.372688,112.40594 21.015256,78.343761 17.898744,32.568697 l 3.350934,-0.138515 c 0.131707,45.014525 3.851339,79.911868 -2.025736,127.174438 z"
114
       style="opacity:0.3;fill:#2b1100;stroke-width:0.20724197" />
115
    <path
116
       style="opacity:1;fill:#1a1a1a;stroke:none;stroke-width:0.1832249"
117
       d="m 37.364038,35.560531 9.400174,-5.992052 c 4.831746,9.986754 3.508267,19.973509 -0.303231,29.960263 l -9.096943,-5.992051 z"
118
       id="rect4493" />
119
    <rect
120
       style="opacity:1;fill:#1a1a1a;stroke:none;stroke-width:0.37082145"
121
       id="rect4504"
122
       width="7.4658442"
123
       height="15.338916"
124
       x="23.754957"
125
       y="38.224262" />
126
  </g>
127
</svg>
manifest.json
1
// This is the manifest file of Haketilo.
2
//
1 3
// Copyright (C) 2021 Wojtek Kosior
2 4
// Redistribution terms are gathered in the `copyright' file.
3 5
{
4 6
    "manifest_version": 2,
5
    "name": "Hachette",
6
    "short_name": "Hachette",
7
    "name": "Haketilo",
8
    "short_name": "Haketilo",
7 9
    "version": "0.0.1",
8 10
    "author": "various",
9 11
    "description": "Control your \"Web\" browsing.",_GECKO_APPLICATIONS_
10 12
    "icons":{
11
	"128": "icons/hachette128.png",
12
	"64": "icons/hachette64.png",
13
	"48": "icons/hachette48.png",
14
	"32": "icons/hachette32.png",
15
	"16": "icons/hachette16.png"
13
	"128": "icons/haketilo128.png",
14
	"64": "icons/haketilo64.png",
15
	"48": "icons/haketilo48.png",
16
	"32": "icons/haketilo32.png",
17
	"16": "icons/haketilo16.png"
16 18
    },
17 19
    "permissions": [
18 20
	"contextMenus",
......
29 31
    "browser_action": {
30 32
	"browser_style": true,
31 33
	"default_icon": {
32
	    "128": "icons/hachette128.png",
33
	    "64": "icons/hachette64.png",
34
	    "48": "icons/hachette48.png",
35
	    "32": "icons/hachette32.png",
36
	    "16": "icons/hachette16.png"
34
	    "128": "icons/haketilo128.png",
35
	    "64": "icons/haketilo64.png",
36
	    "48": "icons/haketilo48.png",
37
	    "32": "icons/haketilo32.png",
38
	    "16": "icons/haketilo16.png"
37 39
	},
38
	"default_title": "Hachette",
40
	"default_title": "Haketilo",
39 41
	"default_popup": "html/display-panel.html"
40 42
    },
41 43
    "options_ui": {
re-generate_icons.sh
4 4
# Redistribution terms are gathered in the `copyright' file.
5 5

  
6 6
for SIZE in 128 64 48 32 16; do
7
    inkscape -z -e icons/hachette$SIZE.png -w $SIZE -h $SIZE icons/hachette.svg
7
    inkscape -z -e icons/haketilo$SIZE.png -w $SIZE -h $SIZE icons/haketilo.svg
8 8
done

Also available in: Unified diff