diff options
author | jahoti <jahoti@tilde.team> | 2021-07-21 00:00:00 +0000 |
---|---|---|
committer | jahoti <jahoti@tilde.team> | 2021-07-21 00:00:00 +0000 |
commit | efce4e9807889e9269534b19c8e0cbb4df527ecd (patch) | |
tree | 0a951d1b2b5c1470f7baf2be41585f5f08a09a9a | |
parent | efd6ae83e6e48008988a2a11ac1658ec71dc82d2 (diff) | |
parent | c483ae19e110ef5c1e539883a38fbc79b3dd4e4e (diff) | |
download | browser-extension-efce4e9807889e9269534b19c8e0cbb4df527ecd.tar.gz browser-extension-efce4e9807889e9269534b19c8e0cbb4df527ecd.zip |
Merge remote-tracking branch 'origin/koszko' into jahoti
-rw-r--r-- | background/page_actions_server.js | 27 | ||||
-rw-r--r-- | background/storage.js | 4 | ||||
-rw-r--r-- | background/storage_server.js | 12 | ||||
-rw-r--r-- | common/ajax.js | 39 | ||||
-rw-r--r-- | common/storage_client.js | 17 | ||||
-rw-r--r-- | common/stored_types.js | 3 | ||||
-rw-r--r-- | content/activity_info_server.js | 23 | ||||
-rw-r--r-- | content/main.js | 3 | ||||
-rw-r--r-- | content/repo_query.js | 80 | ||||
-rw-r--r-- | html/display-panel.html | 23 | ||||
-rw-r--r-- | html/display-panel.js | 35 | ||||
-rw-r--r-- | html/options.html | 18 | ||||
-rw-r--r-- | html/options_main.js | 33 |
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]); } |