aboutsummaryrefslogtreecommitdiff
path: root/content/main.js
blob: 12a94c9e9696161245ae1f1e932334492c70eea9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/**
* Myext main content script run in all frames
*
* Copyright (C) 2021 Wojtek Kosior
*
* Dual-licensed under:
*   - 0BSD license
*   - GPLv3 or (at your option) any later version
*/

var url_re = /^([^#]*)((#[^#]*)(#.*)?)?$/;
var match = url_re.exec(document.URL);
var base_url = match[1];
var first_target = match[3];
var second_target = match[4];

var block = true;
if (first_target !== undefined &&
    first_target === "#myext-allow") {
    block = false;
    console.log(["allowing", document.URL]);
    if (second_target !== undefined)
	window.location.href = base_url + second_target;
    else
	history.replaceState(null, "", base_url);
} else {
    console.log(["not allowing", document.URL]);
}

function handle_mutation(mutations, observer)
{
    if (document.readyState === 'complete') {
	console.log("complete");
	observer.disconnect();
	return;
    }
    for (let mutation of mutations) {
	for (let node of mutation.addedNodes) {
	    if (node.tagName === "SCRIPT")
		block_script(node);
	    else
		sanitize_attributes(node);
	}
    }
}

function block_script(node)
{
    console.log(node);

    /*
     * Disabling scripts this way allows them to still be relatively accessed
     * in case they contain some useful data.
     */
    if (node.hasAttribute("type"))
	node.setAttribute("blocked-type", node.getAttribute("type"));
    node.setAttribute("type", "application/json");
}

function sanitize_attributes(node)
{
    if (node.attributes === undefined)
	return;

    /* We have to do it in 2 loops, removing attribute modifies our iterator */
    let attr_names = [];
    for (let attr of node.attributes) {
	let attr_name = attr.localName;
	if (attr_name.startsWith("on"))
	    attr_names.push(attr_name);
    }

    for (let attr_name of attr_names) {
	node.removeAttribute(attr_name);
	console.log("sanitized", attr_name);
    }
}

async function run_module()
{
    let src = chrome.runtime.getURL("content/page_actions.mjs");
    let module = await import(src);
    module.default();
}

if (block) {
    var observer = new MutationObserver(handle_mutation);
    observer.observe(document.documentElement, {
	attributes: true,
	childList: true,
	subtree: true
    });
}

run_module();