LP1954301 Extension differentiates tabs with same ID
authorBill Erickson <berickxx@gmail.com>
Thu, 9 Dec 2021 16:20:37 +0000 (11:20 -0500)
committerMichele Morgan <mmorgan@noblenet.org>
Fri, 10 Dec 2021 16:56:18 +0000 (11:56 -0500)
Signed-off-by: Bill Erickson <berickxx@gmail.com>
Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
extension/app/extension.js

index a46a2d3..affb361 100644 (file)
@@ -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) {