aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjahoti <jahoti@tilde.team>2021-07-21 00:00:00 +0000
committerjahoti <jahoti@tilde.team>2021-07-21 00:00:00 +0000
commitefce4e9807889e9269534b19c8e0cbb4df527ecd (patch)
tree0a951d1b2b5c1470f7baf2be41585f5f08a09a9a
parentefd6ae83e6e48008988a2a11ac1658ec71dc82d2 (diff)
parentc483ae19e110ef5c1e539883a38fbc79b3dd4e4e (diff)
downloadbrowser-extension-efce4e9807889e9269534b19c8e0cbb4df527ecd.tar.gz
browser-extension-efce4e9807889e9269534b19c8e0cbb4df527ecd.zip
Merge remote-tracking branch 'origin/koszko' into jahoti
-rw-r--r--background/page_actions_server.js27
-rw-r--r--background/storage.js4
-rw-r--r--background/storage_server.js12
-rw-r--r--common/ajax.js39
-rw-r--r--common/storage_client.js17
-rw-r--r--common/stored_types.js3
-rw-r--r--content/activity_info_server.js23
-rw-r--r--content/main.js3
-rw-r--r--content/repo_query.js80
-rw-r--r--html/display-panel.html23
-rw-r--r--html/display-panel.js35
-rw-r--r--html/options.html18
-rw-r--r--html/options_main.js33
13 files changed, 255 insertions, 62 deletions
diff --git a/background/page_actions_server.js b/background/page_actions_server.js
index c6800a0..a7a44c1 100644
--- a/background/page_actions_server.js
+++ b/background/page_actions_server.js
@@ -14,6 +14,7 @@
* IMPORT listen_for_connection
* IMPORT sha256
* IMPORT get_query_best
+ * IMPORT make_ajax_request
* IMPORTS_END
*/
@@ -23,9 +24,10 @@ var handler;
function send_actions(url, port)
{
- let [pattern, settings] = query_best(url);
+ const [pattern, settings] = query_best(url);
+ const repos = storage.get_all(TYPE_PREFIX.REPO);
- port.postMessage(["settings", [pattern, settings]]);
+ port.postMessage(["settings", [pattern, settings, repos]]);
if (settings === undefined)
return;
@@ -85,27 +87,6 @@ async function get_script_text(script_name)
}
}
-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 {
diff --git a/background/storage.js b/background/storage.js
index 7229a2d..682f933 100644
--- a/background/storage.js
+++ b/background/storage.js
@@ -101,10 +101,6 @@ async function list(prefix)
return {map, prefix, name, listeners : new Set(), lock : make_lock()};
}
-var pages;
-var bags;
-var scripts;
-
var list_by_prefix = {};
async function init()
diff --git a/background/storage_server.js b/background/storage_server.js
index 554aff2..2252eb5 100644
--- a/background/storage_server.js
+++ b/background/storage_server.js
@@ -9,7 +9,7 @@
* IMPORTS_START
* IMPORT listen_for_connection
* IMPORT get_storage
- * IMPORT TYPE_PREFIX
+ * IMPORT list_prefixes
* IMPORT CONNECTION_TYPE
* IMPORTS_END
*/
@@ -38,11 +38,11 @@ function new_connection(port)
{
console.log("new remote storage connection!");
- port.postMessage({
- [TYPE_PREFIX.SCRIPT] : storage.get_all(TYPE_PREFIX.SCRIPT),
- [TYPE_PREFIX.BAG] : storage.get_all(TYPE_PREFIX.BAG),
- [TYPE_PREFIX.PAGE] : storage.get_all(TYPE_PREFIX.PAGE)
- });
+ const message = {};
+ for (const prefix of list_prefixes)
+ message[prefix] = storage.get_all(prefix);
+
+ port.postMessage(message);
let handle_change = change => port.postMessage(change);
diff --git a/common/ajax.js b/common/ajax.js
new file mode 100644
index 0000000..8082bbe
--- /dev/null
+++ b/common/ajax.js
@@ -0,0 +1,39 @@
+/**
+ * part of Hachette
+ * Wrapping XMLHttpRequest into a Promise.
+ *
+ * Copyright (C) 2021 Wojtek Kosior
+ * Redistribution terms are gathered in the `copyright' file.
+ */
+
+function ajax_callback()
+{
+ if (this.readyState == 4)
+ this.resolve_callback(this);
+}
+
+function initiate_ajax_request(resolve, reject, method, url)
+{
+ const xhttp = new XMLHttpRequest();
+ xhttp.resolve_callback = resolve;
+ xhttp.onreadystatechange = ajax_callback;
+ xhttp.open(method, url, true);
+ try {
+ xhttp.send();
+ } catch(e) {
+ console.log(e);
+ setTimeout(reject, 0);
+ }
+}
+
+function make_ajax_request(method, url)
+{
+ return new Promise((resolve, reject) =>
+ initiate_ajax_request(resolve, reject, method, url));
+}
+
+/*
+ * EXPORTS_START
+ * EXPORT make_ajax_request
+ * EXPORTS_END
+ */
diff --git a/common/storage_client.js b/common/storage_client.js
index 4849a65..2b2f495 100644
--- a/common/storage_client.js
+++ b/common/storage_client.js
@@ -8,7 +8,6 @@
/*
* IMPORTS_START
* IMPORT CONNECTION_TYPE
- * IMPORT TYPE_PREFIX
* IMPORT list_prefixes
* IMPORT make_once
* IMPORT browser
@@ -47,20 +46,10 @@ function handle_message(message)
setTimeout(resolve, 0, message.result);
}
-function list(name, prefix)
-{
- return {prefix, name, listeners : new Set()};
-}
-
-var scripts = list("scripts", TYPE_PREFIX.SCRIPT);
-var bags = list("bags", TYPE_PREFIX.BAG);
-var pages = list("pages", TYPE_PREFIX.PAGE);
+const list_by_prefix = {};
-const list_by_prefix = {
- [TYPE_PREFIX.SCRIPT] : scripts,
- [TYPE_PREFIX.BAG] : bags,
- [TYPE_PREFIX.PAGE] : pages
-};
+for (const prefix of list_prefixes)
+ list_by_prefix[prefix] = {prefix, listeners : new Set()};
var resolve_init;
diff --git a/common/stored_types.js b/common/stored_types.js
index a6f1f2f..304842b 100644
--- a/common/stored_types.js
+++ b/common/stored_types.js
@@ -14,6 +14,7 @@
*/
const TYPE_PREFIX = {
+ REPO: "r",
PAGE : "p",
BAG : "b",
SCRIPT : "s",
@@ -21,12 +22,14 @@ const TYPE_PREFIX = {
};
const TYPE_NAME = {
+ [TYPE_PREFIX.REPO] : "repo",
[TYPE_PREFIX.PAGE] : "page",
[TYPE_PREFIX.BAG] : "bag",
[TYPE_PREFIX.SCRIPT] : "script"
}
const list_prefixes = [
+ TYPE_PREFIX.REPO,
TYPE_PREFIX.PAGE,
TYPE_PREFIX.BAG,
TYPE_PREFIX.SCRIPT
diff --git a/content/activity_info_server.js b/content/activity_info_server.js
index 8435377..a1384e9 100644
--- a/content/activity_info_server.js
+++ b/content/activity_info_server.js
@@ -11,6 +11,8 @@
* IMPORTS_START
* IMPORT listen_for_connection
* IMPORT CONNECTION_TYPE
+ * IMPORT set_repo_query_repos
+ * IMPORT set_repo_query_callback
* IMPORTS_END
*/
@@ -33,9 +35,22 @@ function report_script(script_data)
function report_settings(settings)
{
+ const [pattern, settings_data, repos] = settings;
+ set_repo_query_repos(repos);
+
report_activity("settings", settings);
}
+function report_repo_query_result(result)
+{
+ report_activity("repo_query_result", result);
+}
+
+function trigger_repo_query()
+{
+ set_repo_query_callback(report_repo_query_result);
+}
+
function new_connection(port)
{
console.log("new activity info connection!");
@@ -44,6 +59,14 @@ function new_connection(port)
for (const activity of activities)
port.postMessage(activity);
+
+ /*
+ * So far the only thing we expect to receive is repo query order. Once more
+ * possibilities arrive, we will need to complicate this listener.
+ */
+ port.onMessage.addListener(trigger_repo_query);
+
+ port.onDisconnect.addListener(() => ports.delete(port));
}
function start_activity_info_server()
diff --git a/content/main.js b/content/main.js
index 9ed557c..8ba751b 100644
--- a/content/main.js
+++ b/content/main.js
@@ -19,6 +19,7 @@
* IMPORT is_chrome
* IMPORT is_mozilla
* IMPORT start_activity_info_server
+ * IMPORT set_repo_query_url
* IMPORTS_END
*/
@@ -128,4 +129,6 @@ if (!is_privileged_url(document.URL)) {
}
start_activity_info_server();
+
+ set_repo_query_url(document.URL);
}
diff --git a/content/repo_query.js b/content/repo_query.js
new file mode 100644
index 0000000..b8c8ed9
--- /dev/null
+++ b/content/repo_query.js
@@ -0,0 +1,80 @@
+/**
+ * part of Hachette
+ * Getting available content for site from remote repositories.
+ *
+ * Copyright (C) 2021 Wojtek Kosior
+ * Redistribution terms are gathered in the `copyright' file.
+ */
+
+/*
+ * IMPORTS_START
+ * IMPORT make_ajax_request
+ * IMPORTS_END
+ */
+
+var query_started = false;
+
+var url = undefined;
+var repos = undefined;
+var callback = undefined;
+
+async function query(repo)
+{
+ const [repo_url, data] = repo;
+
+ let response = "Query failed";
+ const query_url = `${repo_url}/query?n=${encodeURIComponent(url)}`;
+
+ try {
+ let xhttp = await make_ajax_request("GET", query_url);
+ if (xhttp.status === 200)
+ response = xhttp.responseText;
+ console.log(xhttp);
+ } catch (e) {
+ console.log(e);
+ }
+
+ callback([repo_url, response]);
+}
+
+function start_query()
+{
+ if (query_started || !url || !repos || !callback)
+ return;
+
+ query_started = true;
+
+ console.log(`about to query ${url} from ${repos}`);
+
+ for (const repo of repos)
+ query(repo);
+}
+
+function set_repo_query_url(_url)
+{
+ url = _url;
+
+ start_query();
+}
+
+function set_repo_query_repos(_repos)
+{
+ repos = _repos;
+
+ start_query();
+}
+
+function set_repo_query_callback(_callback)
+{
+ callback = _callback;
+
+ start_query();
+}
+
+/*
+ * EXPORTS_START
+ * EXPORT set_repo_query_url
+ * EXPORT set_repo_query_repos
+ * EXPORT set_repo_query_callback
+ * EXPORTS_END
+ */
diff --git a/html/display-panel.html b/html/display-panel.html
index 9b6d619..d8d7f5d 100644
--- a/html/display-panel.html
+++ b/html/display-panel.html
@@ -21,6 +21,14 @@
display: none;
}
+ .show_hide_next2:not(:checked)+* {
+ display: none;
+ }
+
+ .show_hide_next2:checked+*+* {
+ display: none;
+ }
+
.hide {
display: none;
}
@@ -34,10 +42,6 @@
#container_for_injected>#none_injected:not(:last-child) {
display: none;
}
-
- input#connected_chbx:checked+div+h3 {
- display: none;
- }
</style>
</head>
<body>
@@ -65,12 +69,19 @@
</label>
<ul id="possible_patterns"></ul>
- <input id="connected_chbx" type="checkbox" class="show_next"></input>
+ <input id="connected_chbx" type="checkbox" class="show_hide_next2"></input>
<div>
<h3>
Matched pattern: <span id="pattern">...</span>
<button id="view_pattern" class="hide">
- View in settings
+ View in settings
+ </button>
+ <input id="query_started_chbx" type="checkbox" class="show_hide_next2"></input>
+ <div id="container_for_repo_responses">
+ <h3>Queried from repositories</h3>
+ </div>
+ <button id="query_pattern">
+ Search for matching patterns
</button>
</h3>
<h3>
diff --git a/html/display-panel.js b/html/display-panel.js
index 650c234..1693182 100644
--- a/html/display-panel.js
+++ b/html/display-panel.js
@@ -144,6 +144,7 @@ function handle_page_info(message)
}
const connected_chbx = by_id("connected_chbx");
+const query_pattern_but = by_id("query_pattern");
function try_to_connect(tab_id)
{
@@ -151,21 +152,35 @@ function try_to_connect(tab_id)
const connect_info = {name: CONNECTION_TYPE.ACTIVITY_INFO, frameId: 0};
const port = browser.tabs.connect(tab_id, connect_info);
- port.onDisconnect.addListener(port => handle_disconnect(tab_id));
+ const button_cb = (e) => start_querying_repos(port);
+
+ port.onDisconnect.addListener(port => handle_disconnect(tab_id, button_cb));
port.onMessage.addListener(handle_activity_report);
+ query_pattern_but.addEventListener("click", button_cb);
+
if (is_mozilla)
setTimeout(() => monitor_connecting(port, tab_id), 1000);
}
+const query_started_chbx = by_id("query_started_chbx");
+
+function start_querying_repos(port)
+{
+ port.postMessage("dummy (trigger repo querying)");
+ query_started_chbx.checked = true;
+}
+
const loading_chbx = by_id("loading_chbx");
-function handle_disconnect(tab_id)
+function handle_disconnect(tab_id, button_cb)
{
+ query_pattern_but.removeEventListener("click", button_cb);
+
if (is_chrome && !browser.runtime.lastError)
return;
- /* return if there was no connection initialization failure */
+ /* return if error was not during connection initialization */
if (connected_chbx.checked)
return;
@@ -189,6 +204,7 @@ const blocked_span = by_id("blocked");
const payload_span = by_id("payload");
const view_payload_but = by_id("view_payload");
const container_for_injected = by_id("container_for_injected");
+const container_for_repo_responses = by_id("container_for_repo_responses");
function handle_activity_report(message)
{
@@ -197,7 +213,7 @@ function handle_activity_report(message)
const [type, data] = message;
if (type === "settings") {
- let [pattern, settings] = data;
+ let [pattern, settings, repos] = data;
settings = settings || {};
blocked_span.textContent = settings.allow ? "no" : "yes";
@@ -231,6 +247,17 @@ function handle_activity_report(message)
container_for_injected.appendChild(h4);
container_for_injected.appendChild(pre);
}
+ if (type === "repo_query_result") {
+ const [repo_url, response_text] = data;
+
+ const h4 = document.createElement("h4");
+ const pre = document.createElement("pre");
+ h4.textContent = repo_url;
+ pre.textContent = response_text;
+
+ container_for_repo_responses.appendChild(h4);
+ container_for_repo_responses.appendChild(pre);
+ }
}
by_id("settings_but")
diff --git a/html/options.html b/html/options.html
index bfb9e52..a10b919 100644
--- a/html/options.html
+++ b/html/options.html
@@ -33,12 +33,14 @@
}
/* tabbed view */
+ #show_repos:not(:checked) ~ #repos,
#show_pages:not(:checked) ~ #pages,
#show_bags:not(:checked) ~ #bags,
#show_scripts:not(:checked) ~ #scripts {
display: none;
}
+ #show_repos:checked ~ #repos_lbl,
#show_pages:checked ~ #pages_lbl,
#show_bags:checked ~ #bags_lbl,
#show_scripts:checked ~ #scripts_lbl {
@@ -124,9 +126,12 @@
</div>
<!-- Mind the show_*s ids below - their format is assumed in js code -->
+ <input type="radio" name="tabs" id="show_repos"></input>
<input type="radio" name="tabs" id="show_pages" checked></input>
<input type="radio" name="tabs" id="show_bags"></input>
<input type="radio" name="tabs" id="show_scripts"></input>
+ <label for="show_repos" id="repos_lbl"
+ class="tab_head"> Repos </label>
<label for="show_pages" id="pages_lbl"
class="tab_head"> Pages </label>
<label for="show_bags" id="bags_lbl"
@@ -134,6 +139,19 @@
<label for="show_scripts" id="scripts_lbl"
class="tab_head"> Scripts </label>
+ <div id="repos">
+ <ul id="repos_ul">
+ <li id="work_repo_li" class="hide">
+ <label for="repo_url_field">URL: </label>
+ <input id="repo_url_field"></input>
+ <br/>
+ <button id="save_repo_but" type="button"> Save </button>
+ <button id="discard_repo_but" type="button"> Cancel </button>
+ </li>
+ </ul>
+ <button id="add_repo_but" type="button"> Add repository </button>
+ </div>
+
<div id="pages">
<ul id="pages_ul">
<li id="work_page_li" class="hide">
diff --git a/html/options_main.js b/html/options_main.js
index e1e6cbe..026b9ba 100644
--- a/html/options_main.js
+++ b/html/options_main.js
@@ -38,7 +38,7 @@ function item_li_id(prefix, item)
return `li_${prefix}_${item}`;
}
-/* Insert into list of bags/pages/scripts */
+/* Insert into list of bags/pages/scripts/repos */
function add_li(prefix, item, at_the_end=false)
{
let ul = ul_by_prefix[prefix];
@@ -58,6 +58,8 @@ function add_li(prefix, item, at_the_end=false)
let export_button = remove_button.nextElementSibling;
export_button.addEventListener("click",
() => export_item(prefix, item));
+ if (prefix === TYPE_PREFIX.REPO)
+ export_button.remove();
if (!at_the_end) {
for (let element of ul.ul.children) {
@@ -89,7 +91,7 @@ function radio_li_id(prefix, item)
function add_chbx_li(prefix, name)
{
- if (prefix === TYPE_PREFIX.PAGE)
+ if (![TYPE_PREFIX.BAG, TYPE_PREFIX.SCRIPT].includes(prefix))
return;
let li = chbx_component_li_template.cloneNode(true);
@@ -109,7 +111,7 @@ var radio_component_none_li = by_id("radio_component_none_li");
function add_radio_li(prefix, name)
{
- if (prefix === TYPE_PREFIX.PAGE)
+ if (![TYPE_PREFIX.BAG, TYPE_PREFIX.SCRIPT].includes(prefix))
return;
let li = radio_component_li_template.cloneNode(true);
@@ -125,6 +127,18 @@ function add_radio_li(prefix, name)
radio_components_ul.insertBefore(li, radio_component_none_li);
}
+/* Used to reset edited repo. */
+function reset_work_repo_li(ul, item, _)
+{
+ ul.work_name_input.value = maybe_string(item);
+}
+
+/* Used to get repo data for saving */
+function work_repo_li_data(ul)
+{
+ return [ul.work_name_input.value, {}];
+}
+
const page_payload_span = by_id("page_payload");
function set_page_components(components)
@@ -461,6 +475,15 @@ const UL_STATE = {
};
const ul_by_prefix = {
+ [TYPE_PREFIX.REPO] : {
+ ul : by_id("repos_ul"),
+ work_li : by_id("work_repo_li"),
+ work_name_input : by_id("repo_url_field"),
+ reset_work_li : reset_work_repo_li,
+ get_work_li_data : work_repo_li_data,
+ state : UL_STATE.IDLE,
+ edited_item : undefined,
+ },
[TYPE_PREFIX.PAGE] : {
ul : by_id("pages_ul"),
work_li : by_id("work_page_li"),
@@ -727,7 +750,7 @@ async function main()
discard_but.addEventListener("click", () => cancel_work(prefix));
save_but.addEventListener("click", () => save_work(prefix));
- if (prefix === TYPE_PREFIX.SCRIPT)
+ if ([TYPE_PREFIX.REPO, TYPE_PREFIX.SCRIPT].includes(prefix))
continue;
let ul = ul_by_prefix[prefix];
@@ -772,7 +795,7 @@ function handle_change(change)
let uls_creators = [[ul.ul, item_li_id]];
- if (change.prefix !== TYPE_PREFIX.PAGE) {
+ if ([TYPE_PREFIX.BAG, TYPE_PREFIX.SCRIPT].includes(change.prefix)) {
uls_creators.push([chbx_components_ul, chbx_li_id]);
uls_creators.push([radio_components_ul, radio_li_id]);
}