From: Bill Erickson <berickxx@gmail.com> Date: Thu, 9 Dec 2021 16:20:37 +0000 (-0500) Subject: LP1954301 Extension differentiates tabs with same ID X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=77f7ccec430f9dd6ab49c3b46f5dd597e90da2d1;p=working%2FHatch.git LP1954301 Extension differentiates tabs with same ID Signed-off-by: Bill Erickson <berickxx@gmail.com> Signed-off-by: Michele Morgan <mmorgan@noblenet.org> --- diff --git a/extension/app/extension.js b/extension/app/extension.js index a46a2d3299..affb361860 100644 --- a/extension/app/extension.js +++ b/extension/app/extension.js @@ -69,6 +69,8 @@ function onDisconnected(port) { function onNativeMessage(message) { var tabId = message.clientid; + console.debug("Hatch responded to request on tab " + tabId); + if (tabId && browserPorts[tabId]) { message.from = 'extension'; browserPorts[tabId].postMessage(message); @@ -79,13 +81,36 @@ function onNativeMessage(message) { } + /** * Called when our content script opens connection to this extension. */ +var portCounter = 0; // Additional tab name differentiation chrome.runtime.onConnect.addListener(function(port) { - var tabId = port.sender.tab.id; + + // When a new tab connects, it has no custom name. Since a tab + // with the same tab number can connect multiple times -- sometimes + // in an unexpected order -- give each port a unique name. This + // name will persist for the life of the connected port object. + // + // The port name can normally be any string, but our Java backend + // currently expects a Long (numeric) value, so format the port name + // as the tab number, followed by up to 12 zeroes, followed by our + // auto-increment. This can accommodate more than trillion unique + // tab identifiers before the browser has to be restarted. + // + // TODO: teach the Java backend to treat "msgid" as a String + // instead of a Long so we can use tab names like: + // port.name = tabNumber + "-" + increment++; + if (port.name == "") { + let base = (port.sender.tab.id + "").padEnd(12, "0"); + port.name = Number(base) + portCounter++; + } + + var tabId = port.name; browserPorts[tabId] = port; + console.debug('new port connected with id ' + tabId); port.onMessage.addListener(function(msg) {