Revision b7e2870f
Added by koszko about 2 years ago
| html/display-panel.js | ||
|---|---|---|
| 8 | 8 |
/* |
| 9 | 9 |
* IMPORTS_START |
| 10 | 10 |
* IMPORT browser |
| 11 |
* IMPORT is_chrome |
|
| 12 |
* IMPORT is_mozilla |
|
| 13 |
* IMPORT CONNECTION_TYPE |
|
| 14 |
* IMPORT url_item |
|
| 15 |
* IMPORT is_privileged_url |
|
| 16 |
* IMPORT TYPE_PREFIX |
|
| 17 |
* IMPORT nice_name |
|
| 18 |
* IMPORT open_in_settings |
|
| 19 |
* IMPORT for_each_possible_pattern |
|
| 11 | 20 |
* IMPORTS_END |
| 12 | 21 |
*/ |
| 13 | 22 |
|
| 14 |
document.getElementById("settings_but")
|
|
| 23 |
function by_id(id) |
|
| 24 |
{
|
|
| 25 |
return document.getElementById(id); |
|
| 26 |
} |
|
| 27 |
|
|
| 28 |
const tab_query = {currentWindow: true, active: true};
|
|
| 29 |
|
|
| 30 |
async function get_current_tab() |
|
| 31 |
{
|
|
| 32 |
/* Fix for fact that Chrome does not use promises here */ |
|
| 33 |
const promise = is_chrome ? |
|
| 34 |
new Promise((resolve, reject) => |
|
| 35 |
browser.tabs.query(tab_query, tab => resolve(tab))) : |
|
| 36 |
browser.tabs.query(tab_query); |
|
| 37 |
|
|
| 38 |
try {
|
|
| 39 |
return (await promise)[0]; |
|
| 40 |
} catch(e) {
|
|
| 41 |
console.log(e); |
|
| 42 |
} |
|
| 43 |
} |
|
| 44 |
|
|
| 45 |
const page_url_heading = by_id("page_url_heading");
|
|
| 46 |
const show_privileged_notice_chbx = by_id("show_privileged_notice_chbx");
|
|
| 47 |
const show_page_state_chbx = by_id("show_page_state_chbx");
|
|
| 48 |
|
|
| 49 |
async function show_page_activity_info() |
|
| 50 |
{
|
|
| 51 |
const tab = await get_current_tab(); |
|
| 52 |
|
|
| 53 |
if (tab === undefined) {
|
|
| 54 |
page_url_heading.textContent = "unknown page"; |
|
| 55 |
return; |
|
| 56 |
} |
|
| 57 |
|
|
| 58 |
const url = url_item(tab.url); |
|
| 59 |
page_url_heading.textContent = url; |
|
| 60 |
if (is_privileged_url(url)) {
|
|
| 61 |
show_privileged_notice_chbx.checked = true; |
|
| 62 |
return; |
|
| 63 |
} |
|
| 64 |
|
|
| 65 |
populate_possible_patterns_list(url); |
|
| 66 |
show_page_state_chbx.checked = true; |
|
| 67 |
|
|
| 68 |
try_to_connect(tab.id); |
|
| 69 |
} |
|
| 70 |
|
|
| 71 |
function populate_possible_patterns_list(url) |
|
| 72 |
{
|
|
| 73 |
for_each_possible_pattern(url, add_pattern_to_list); |
|
| 74 |
|
|
| 75 |
const port = browser.runtime.connect({name: CONNECTION_TYPE.PAGE_INFO});
|
|
| 76 |
port.onMessage.addListener(handle_page_info); |
|
| 77 |
port.postMessage(["subscribe", url]); |
|
| 78 |
} |
|
| 79 |
|
|
| 80 |
const possible_patterns_ul = by_id("possible_patterns");
|
|
| 81 |
const pattern_li_template = by_id("pattern_li_template");
|
|
| 82 |
pattern_li_template.removeAttribute("id");
|
|
| 83 |
const known_patterns = new Map(); |
|
| 84 |
|
|
| 85 |
function add_pattern_to_list(pattern) |
|
| 86 |
{
|
|
| 87 |
const li = pattern_li_template.cloneNode(true); |
|
| 88 |
li.id = `pattern_li_${known_patterns.size}`;
|
|
| 89 |
known_patterns.set(pattern, li.id); |
|
| 90 |
|
|
| 91 |
const span = li.firstElementChild; |
|
| 92 |
span.textContent = pattern; |
|
| 93 |
|
|
| 94 |
const button = span.nextElementSibling; |
|
| 95 |
const settings_opener = () => open_in_settings(TYPE_PREFIX.PAGE, pattern); |
|
| 96 |
button.addEventListener("click", settings_opener);
|
|
| 97 |
|
|
| 98 |
possible_patterns_ul.appendChild(li) |
|
| 99 |
|
|
| 100 |
return li.id; |
|
| 101 |
} |
|
| 102 |
|
|
| 103 |
function ensure_pattern_exists(pattern) |
|
| 104 |
{
|
|
| 105 |
let id = known_patterns.get(pattern); |
|
| 106 |
/* |
|
| 107 |
* As long as pattern computation works well, we should never get into this |
|
| 108 |
* conditional block. This is just a safety measure. To be removed as part |
|
| 109 |
* of a bigger rework when we start taking iframes into account. |
|
| 110 |
*/ |
|
| 111 |
if (id === undefined) {
|
|
| 112 |
console.log(`unknown pattern: ${pattern}`);
|
|
| 113 |
id = add_pattern_to_list(pattern); |
|
| 114 |
} |
|
| 115 |
|
|
| 116 |
return id; |
|
| 117 |
} |
|
| 118 |
|
|
| 119 |
function set_pattern_li_button_text(li_id, text) |
|
| 120 |
{
|
|
| 121 |
by_id(li_id).firstElementChild.nextElementSibling.textContent = text; |
|
| 122 |
} |
|
| 123 |
|
|
| 124 |
function handle_page_info(message) |
|
| 125 |
{
|
|
| 126 |
const [type, data] = message; |
|
| 127 |
|
|
| 128 |
if (type === "change") {
|
|
| 129 |
const li_id = ensure_pattern_exists(data.item); |
|
| 130 |
if (data.old_val === undefined) |
|
| 131 |
set_pattern_li_button_text(li_id, "Edit in settings"); |
|
| 132 |
if (data.new_val === undefined) |
|
| 133 |
set_pattern_li_button_text(li_id, "Add setting"); |
|
| 134 |
} |
|
| 135 |
|
|
| 136 |
if (type === "new_url") {
|
|
| 137 |
for (const li_id of known_patterns.values()) |
|
| 138 |
set_pattern_li_button_text(li_id, "Add setting"); |
|
| 139 |
for (const [pattern, settings] of data) {
|
|
| 140 |
set_pattern_li_button_text(ensure_pattern_exists(pattern), |
|
| 141 |
"Edit in settings") |
|
| 142 |
} |
|
| 143 |
} |
|
| 144 |
} |
|
| 145 |
|
|
| 146 |
const connected_chbx = by_id("connected_chbx");
|
|
| 147 |
|
|
| 148 |
function try_to_connect(tab_id) |
|
| 149 |
{
|
|
| 150 |
/* This won't connect to iframes. We'll add support for them later */ |
|
| 151 |
const connect_info = {name: CONNECTION_TYPE.ACTIVITY_INFO, frameId: 0};
|
|
| 152 |
const port = browser.tabs.connect(tab_id, connect_info); |
|
| 153 |
|
|
| 154 |
port.onDisconnect.addListener(port => handle_disconnect(tab_id)); |
|
| 155 |
port.onMessage.addListener(handle_activity_report); |
|
| 156 |
|
|
| 157 |
if (is_mozilla) |
|
| 158 |
setTimeout(() => monitor_connecting(port, tab_id), 1000); |
|
| 159 |
} |
|
| 160 |
|
|
| 161 |
const loading_chbx = by_id("loading_chbx");
|
|
| 162 |
|
|
| 163 |
function handle_disconnect(tab_id) |
|
| 164 |
{
|
|
| 165 |
if (is_chrome && !browser.runtime.lastError) |
|
| 166 |
return; |
|
| 167 |
|
|
| 168 |
/* return if there was no connection initialization failure */ |
|
| 169 |
if (connected_chbx.checked) |
|
| 170 |
return; |
|
| 171 |
|
|
| 172 |
loading_chbx.checked = !loading_chbx.checked; |
|
| 173 |
setTimeout(() => try_to_connect(tab_id), 1000); |
|
| 174 |
} |
|
| 175 |
|
|
| 176 |
function monitor_connecting(port, tab_id) |
|
| 177 |
{
|
|
| 178 |
if (connected_chbx.checked) |
|
| 179 |
return; |
|
| 180 |
|
|
| 181 |
port.disconnect(); |
|
| 182 |
loading_chbx.checked = !loading_chbx.checked; |
|
| 183 |
try_to_connect(tab_id); |
|
| 184 |
} |
|
| 185 |
|
|
| 186 |
const pattern_span = by_id("pattern");
|
|
| 187 |
const view_pattern_but = by_id("view_pattern");
|
|
| 188 |
const blocked_span = by_id("blocked");
|
|
| 189 |
const payload_span = by_id("payload");
|
|
| 190 |
const view_payload_but = by_id("view_payload");
|
|
| 191 |
const container_for_injected = by_id("container_for_injected");
|
|
| 192 |
|
|
| 193 |
function handle_activity_report(message) |
|
| 194 |
{
|
|
| 195 |
connected_chbx.checked = true; |
|
| 196 |
|
|
| 197 |
const [type, data] = message; |
|
| 198 |
|
|
| 199 |
if (type === "settings") {
|
|
| 200 |
let [pattern, settings] = data; |
|
| 201 |
|
|
| 202 |
settings = settings || {};
|
|
| 203 |
blocked_span.textContent = settings.allow ? "no" : "yes"; |
|
| 204 |
|
|
| 205 |
if (pattern) {
|
|
| 206 |
pattern_span.textContent = pattern; |
|
| 207 |
const settings_opener = |
|
| 208 |
() => open_in_settings(TYPE_PREFIX.PAGE, pattern); |
|
| 209 |
view_pattern_but.classList.remove("hide");
|
|
| 210 |
view_pattern_but.addEventListener("click", settings_opener);
|
|
| 211 |
} else {
|
|
| 212 |
pattern_span.textContent = "none"; |
|
| 213 |
} |
|
| 214 |
|
|
| 215 |
const components = settings.components; |
|
| 216 |
if (components) {
|
|
| 217 |
payload_span.textContent = nice_name(...components); |
|
| 218 |
const settings_opener = () => open_in_settings(...components); |
|
| 219 |
view_payload_but.classList.remove("hide");
|
|
| 220 |
view_payload_but.addEventListener("click", settings_opener);
|
|
| 221 |
} else {
|
|
| 222 |
payload_span.textContent = "none"; |
|
| 223 |
} |
|
| 224 |
} |
|
| 225 |
if (type === "script") {
|
|
| 226 |
const h4 = document.createElement("h4");
|
|
| 227 |
const pre = document.createElement("pre");
|
|
| 228 |
h4.textContent = "script"; |
|
| 229 |
pre.textContent = data; |
|
| 230 |
|
|
| 231 |
container_for_injected.appendChild(h4); |
|
| 232 |
container_for_injected.appendChild(pre); |
|
| 233 |
} |
|
| 234 |
} |
|
| 235 |
|
|
| 236 |
by_id("settings_but")
|
|
| 15 | 237 |
.addEventListener("click", (e) => browser.runtime.openOptionsPage());
|
| 238 |
|
|
| 239 |
show_page_activity_info(); |
|
Also available in: Unified diff
show some settings of the current page in the popup