LP1967532 Experimenting with port reconnection on failure user/berick/lp1967532-extension-load-race-condition
authorBill Erickson <berickxx@gmail.com>
Fri, 1 Apr 2022 16:37:06 +0000 (12:37 -0400)
committerBill Erickson <berickxx@gmail.com>
Fri, 1 Apr 2022 16:37:06 +0000 (12:37 -0400)
Signed-off-by: Bill Erickson <berickxx@gmail.com>
extension/app/content.js

index d19d4f9..b6215a2 100644 (file)
@@ -30,37 +30,53 @@ if (document.documentElement) {
     console.warn("No document.documentElement exist, Hatch cannot open");
 }
 
-/**
- * Open a port to our extension.
- */
-var port = chrome.runtime.connect();
+var port;
 
-/**
- * Relay all messages received from the extension back to the tab
- */
-port.onMessage.addListener(function(message) {
-    window.postMessage(message, location.origin);
-});
+function setup() {
+    console.debug("Content script setting up a new connection");
 
+    /**
+     * Open a port to our extension.
+     */
+    port = chrome.runtime.connect();
 
-/**
- * Receive messages from the browser tab and relay them to the
- * Hatch extension script.
- */
-window.addEventListener("message", function(event) {
+    port.onDisconnect.addListener(function(event) {
+        console.log('Extension port disconnected..', event);
+    });
+
+    /**
+     * Relay all messages received from the extension back to the tab
+     */
+    port.onMessage.addListener(function(message) {
+        window.postMessage(message, location.origin);
+    });
 
-    // We only accept messages from ourselves
-    if (event.source != window) return;
 
-    var message = event.data;
+    /**
+     * Receive messages from the browser tab and relay them to the
+     * Hatch extension script.
+     */
+    window.addEventListener("message", function(event) {
 
-    // Ignore broadcast messages.  We only care about messages
-    // received from our browser tab/page.
-    if (message.from != 'page') return;
+        // We only accept messages from ourselves
+        if (event.source != window) return;
 
-    // standard Hatch-bound message; relay to extension.
-    port.postMessage(message);
+        var message = event.data;
 
-}, false);
+        // Ignore broadcast messages.  We only care about messages
+        // received from our browser tab/page.
+        if (message.from != 'page') return;
+
+        // standard Hatch-bound message; relay to extension.
+        try {
+            port.postMessage(message);
+        } catch (e) {
+            console.error("Port communication failed.  Reconnecting", e);
+            setTimeout(setup);
+        }
+
+    }, false);
+}
 
+setup();