From 58fe4c7d806359bed299f74ba56902ab396a6ed1 Mon Sep 17 00:00:00 2001 From: Wojtek Kosior Date: Tue, 14 Dec 2021 21:40:23 +0100 Subject: facilitate broadcasting messages to different execution contexts within the webextension --- common/broadcast.js | 113 +++++++++++++++++++++++++++++++++++++++++++++ common/connection_types.js | 4 +- 2 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 common/broadcast.js (limited to 'common') diff --git a/common/broadcast.js b/common/broadcast.js new file mode 100644 index 0000000..bc18103 --- /dev/null +++ b/common/broadcast.js @@ -0,0 +1,113 @@ +/** + * This file is part of Haketilo. + * + * Function: Broadcast messages to different execution contexts of the extension + * + * Copyright (C) 2021 Wojtek Kosior + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * As additional permission under GNU GPL version 3 section 7, you + * may distribute forms of that code without the copy of the GNU + * GPL normally required by section 4, provided you include this + * license notice and, in case of non-source distribution, a URL + * through which recipients can access the Corresponding Source. + * If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not + * obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * As a special exception to the GPL, any HTML file which merely + * makes function calls to this code, and for that purpose + * includes it by reference shall be deemed a separate work for + * copyright law purposes. If you modify this code, you may extend + * this exception to your version of the code, but you are not + * obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * I, Wojtek Kosior, thereby promise not to sue for violation of this file's + * license. Although I request that you do not make use this code in a + * proprietary program, I am not going to enforce this in court. + */ + +/* + * IMPORTS_START + * IMPORT CONNECTION_TYPE + * IMPORTS_END + */ + +function sender_connection() +{ + return { + port: browser.runtime.connect({name: CONNECTION_TYPE.BROADCAST_SEND}) + }; +} + +function out(sender_conn, channel_name, value) +{ + sender_conn.port.postMessage(["broadcast", channel_name, value]); +} + +function prepare(sender_conn, channel_name, value, timeout=5000) +{ + sender_conn.port.postMessage(["prepare", channel_name, value, timeout]); +} + +function discard(sender_conn) +{ + sender_conn.port.postMessage(["discard"]); +} + +function flush(sender_conn) +{ + sender_conn.port.postMessage(["flush"]); +} + +function listener_connection(cb) +{ + const conn = { + port: browser.runtime.connect({name: CONNECTION_TYPE.BROADCAST_LISTEN}) + }; + + conn.port.onMessage.addListener(cb); + + return conn; +} + +function subscribe(listener_conn, channel_name) +{ + listener_conn.port.postMessage(["subscribe", channel_name]); +} + +function unsubscribe(listener_conn, channel_name) +{ + listener_conn.port.postMessage(["unsubscribe", channel_name]); +} + +function close(conn) +{ + conn.port.disconnect(); +} + +const broadcast = { + sender_connection, out, prepare, discard, flush, + listener_connection, subscribe, unsubscribe, + close +}; + +/* + * EXPORTS_START + * EXPORT broadcast + * EXPORTS_END + */ diff --git a/common/connection_types.js b/common/connection_types.js index a571cb9..9747e5c 100644 --- a/common/connection_types.js +++ b/common/connection_types.js @@ -49,7 +49,9 @@ const CONNECTION_TYPE = { REMOTE_STORAGE : "0", PAGE_ACTIONS : "1", - ACTIVITY_INFO : "2" + ACTIVITY_INFO : "2", + BROADCAST_SEND: "3", + BROADCAST_LISTEN: "4" }; /* -- cgit v1.2.3