aboutsummaryrefslogtreecommitdiff
path: root/background/page_actions_server.js
diff options
context:
space:
mode:
Diffstat (limited to 'background/page_actions_server.js')
-rw-r--r--background/page_actions_server.js264
1 files changed, 134 insertions, 130 deletions
diff --git a/background/page_actions_server.js b/background/page_actions_server.js
index dbf4db3..f9773f6 100644
--- a/background/page_actions_server.js
+++ b/background/page_actions_server.js
@@ -5,145 +5,149 @@
* Redistribution terms are gathered in the `copyright' file.
*/
-"use strict";
-
-(() => {
- const get_storage = window.get_storage;
- const TYPE_PREFIX = window.TYPE_PREFIX;
- const CONNECTION_TYPE = window.CONNECTION_TYPE;
- const browser = window.browser;
- const listen_for_connection = window.listen_for_connection;
- const sha256 = window.sha256;
- const get_query_best = window.get_query_best;
-
- var storage;
- var query_best;
- var handler;
-
- function send_scripts(url, port)
- {
- let [pattern, settings] = query_best(url);
- if (settings === undefined)
- return;
-
- let components = settings.components;
- let processed_bags = new Set();
-
- if (components !== undefined)
- send_scripts_rec([components], port, processed_bags);
- }
+/*
+ * IMPORTS_START
+ * IMPORT get_storage
+ * IMPORT TYPE_PREFIX
+ * IMPORT CONNECTION_TYPE
+ * IMPORT browser
+ * IMPORT listen_for_connection
+ * IMPORT sha256
+ * IMPORT get_query_best
+ * IMPORTS_END
+ */
- // TODO: parallelize script fetching
- async function send_scripts_rec(components, port, processed_bags)
- {
- for (let [prefix, name] of components) {
- if (prefix === TYPE_PREFIX.BAG) {
- if (processed_bags.has(name)) {
- console.log(`preventing recursive inclusion of bag ${name}`);
- continue;
- }
-
- var bag = storage.get(TYPE_PREFIX.BAG, name);
-
- if (bag === undefined) {
- console.log(`no bag in storage for key ${name}`);
- continue;
- }
-
- processed_bags.add(name);
- await send_scripts_rec(bag, port, processed_bags);
- processed_bags.delete(name);
- } else {
- let script_text = await get_script_text(name);
- if (script_text === undefined)
- continue;
-
- port.postMessage({inject : [script_text]});
+var storage;
+var query_best;
+var handler;
+
+function send_scripts(url, port)
+{
+ let [pattern, settings] = query_best(url);
+ if (settings === undefined)
+ return;
+
+ let components = settings.components;
+ let processed_bags = new Set();
+
+ if (components !== undefined)
+ send_scripts_rec([components], port, processed_bags);
+}
+
+// TODO: parallelize script fetching
+async function send_scripts_rec(components, port, processed_bags)
+{
+ for (let [prefix, name] of components) {
+ if (prefix === TYPE_PREFIX.BAG) {
+ if (processed_bags.has(name)) {
+ console.log(`preventing recursive inclusion of bag ${name}`);
+ continue;
}
- }
- }
- async function get_script_text(script_name)
- {
- try {
- let script_data = storage.get(TYPE_PREFIX.SCRIPT, script_name);
- if (script_data === undefined) {
- console.log(`missing data for ${script_name}`);
- return;
+ var bag = storage.get(TYPE_PREFIX.BAG, name);
+
+ if (bag === undefined) {
+ console.log(`no bag in storage for key ${name}`);
+ continue;
}
- let script_text = script_data.text;
- if (!script_text)
- script_text = await fetch_remote_script(script_data);
- return script_text;
- } catch (e) {
- console.log(e);
- }
- }
- function ajax_callback()
- {
- if (this.readyState == 4)
- this.resolve_callback(this);
- }
+ processed_bags.add(name);
+ await send_scripts_rec(bag, port, processed_bags);
+ processed_bags.delete(name);
+ } else {
+ let script_text = await get_script_text(name);
+ if (script_text === undefined)
+ continue;
- function initiate_ajax_request(resolve, method, url)
- {
- var xhttp = new XMLHttpRequest();
- xhttp.resolve_callback = resolve;
- xhttp.onreadystatechange = ajax_callback;
- xhttp.open(method, url, true);
- xhttp.send();
+ port.postMessage({inject : [script_text]});
+ }
}
-
- function make_ajax_request(method, url)
- {
- return new Promise((resolve, reject) =>
- initiate_ajax_request(resolve, method, url));
+}
+
+async function get_script_text(script_name)
+{
+ try {
+ let script_data = storage.get(TYPE_PREFIX.SCRIPT, script_name);
+ if (script_data === undefined) {
+ console.log(`missing data for ${script_name}`);
+ return;
+ }
+ let script_text = script_data.text;
+ if (!script_text)
+ script_text = await fetch_remote_script(script_data);
+ return script_text;
+ } catch (e) {
+ console.log(e);
}
-
- async function fetch_remote_script(script_data)
- {
- try {
- let xhttp = await make_ajax_request("GET", script_data.url);
- if (xhttp.status === 200) {
- let computed_hash = sha256(xhttp.responseText);
- if (computed_hash !== script_data.hash) {
- console.log(`Bad hash for ${script_data.url}\n got ${computed_hash} instead of ${script_data.hash}`);
- return;
- }
- return xhttp.responseText;
- } else {
- console.log("script not fetched: " + script_data.url);
+}
+
+function ajax_callback()
+{
+ if (this.readyState == 4)
+ this.resolve_callback(this);
+}
+
+function initiate_ajax_request(resolve, method, url)
+{
+ var xhttp = new XMLHttpRequest();
+ xhttp.resolve_callback = resolve;
+ xhttp.onreadystatechange = ajax_callback;
+ xhttp.open(method, url, true);
+ xhttp.send();
+}
+
+function make_ajax_request(method, url)
+{
+ return new Promise((resolve, reject) =>
+ initiate_ajax_request(resolve, method, url));
+}
+
+async function fetch_remote_script(script_data)
+{
+ try {
+ let xhttp = await make_ajax_request("GET", script_data.url);
+ if (xhttp.status === 200) {
+ let computed_hash = sha256(xhttp.responseText);
+ if (computed_hash !== script_data.hash) {
+ console.log(`Bad hash for ${script_data.url}\n got ${computed_hash} instead of ${script_data.hash}`);
return;
}
- } catch (e) {
- console.log(e);
+ return xhttp.responseText;
+ } else {
+ console.log("script not fetched: " + script_data.url);
+ return;
}
+ } catch (e) {
+ console.log(e);
}
-
- function handle_message(port, message, handler)
- {
- port.onMessage.removeListener(handler[0]);
- let url = message.url;
- console.log({url});
- send_scripts(url, port);
- }
-
- function new_connection(port)
- {
- console.log("new page actions connection!");
- let handler = [];
- handler.push(m => handle_message(port, m, handler));
- port.onMessage.addListener(handler[0]);
- }
-
- async function start()
- {
- storage = await get_storage();
- query_best = await get_query_best();
-
- listen_for_connection(CONNECTION_TYPE.PAGE_ACTIONS, new_connection);
- }
-
- window.start_page_actions_server = start;
-})();
+}
+
+function handle_message(port, message, handler)
+{
+ port.onMessage.removeListener(handler[0]);
+ let url = message.url;
+ console.log({url});
+ send_scripts(url, port);
+}
+
+function new_connection(port)
+{
+ console.log("new page actions connection!");
+ let handler = [];
+ handler.push(m => handle_message(port, m, handler));
+ port.onMessage.addListener(handler[0]);
+}
+
+async function start_page_actions_server()
+{
+ storage = await get_storage();
+ query_best = await get_query_best();
+
+ listen_for_connection(CONNECTION_TYPE.PAGE_ACTIONS, new_connection);
+}
+
+/*
+ * EXPORTS_START
+ * EXPORT start_page_actions_server
+ * EXPORTS_END
+ */