Index: lib/options.js |
diff --git a/lib/options.js b/lib/options.js |
index fa39d78374b04df576ddc85aedd5aea613fffe39..84adf19cc27921e40322c25e45135b3acadb3c66 100644 |
--- a/lib/options.js |
+++ b/lib/options.js |
@@ -38,7 +38,52 @@ function findOptionsTab(callback) |
// starting with Firefox 56 an extension can query for its own URLs: |
// https://bugzilla.mozilla.org/show_bug.cgi?id=1271354 |
let fullOptionsUrl = browser.extension.getURL(optionsUrl); |
- callback(tabs.find(element => element.url == fullOptionsUrl)); |
+ let optionsTab = tabs.find(tab => tab.url == fullOptionsUrl); |
+ |
+ if (optionsTab) |
+ callback(optionsTab); |
+ else |
+ { |
+ // It seems that the url property isn't always set for the tab with |
+ // Firefox 57 on Windows 10 until the tab has finished loading. Until |
+ // then the url is given as "about:blank", but the title is the URL |
+ // we expect (minus the protocol part). |
+ let {hostname, pathname} = new URL(fullOptionsUrl); |
+ let potentialOptionsTab = tabs.find( |
+ tab => tab.url == "about:blank" && |
+ tab.title == hostname + pathname && |
+ tab.status == "loading" |
+ ); |
+ |
+ if (potentialOptionsTab) |
+ { |
+ let onRemoved; |
+ let updateListener = (tabId, changeInfo, tab) => |
+ { |
+ if (tabId == potentialOptionsTab.id && |
+ changeInfo.status == "complete") |
+ { |
+ browser.tabs.onUpdated.removeListener(updateListener); |
+ browser.tabs.onRemoved.removeListener(onRemoved); |
+ if (tab.url == fullOptionsUrl) |
+ callback(tab); |
+ } |
+ }; |
+ browser.tabs.onUpdated.addListener(updateListener); |
+ onRemoved = removedTabId => |
+ { |
+ if (removedTabId == potentialOptionsTab.id) |
+ { |
+ browser.tabs.onUpdated.removeListener(updateListener); |
+ browser.tabs.onRemoved.removeListener(onRemoved); |
+ callback(); |
+ } |
+ }; |
+ browser.tabs.onRemoved.addListener(onRemoved); |
+ } |
+ else |
+ callback(); |
+ } |
}); |
} |