Index: ext/background.js |
=================================================================== |
--- a/ext/background.js |
+++ b/ext/background.js |
@@ -699,11 +699,14 @@ |
ext.showOptions = callback => |
{ |
+ let info = require("info"); |
+ |
if ("openOptionsPage" in chrome.runtime && |
- // Firefox for Android does have a runtime.openOptionsPage but it |
- // doesn't do anything. |
+ // Some versions of Firefox for Android before version 57 do have a |
+ // runtime.openOptionsPage but it doesn't do anything. |
// https://bugzilla.mozilla.org/show_bug.cgi?id=1364945 |
- require("info").application != "fennec") |
+ (info.application != "fennec" || |
+ parseInt(info.applicationVersion, 10) >= 57)) |
{ |
if (!callback) |
{ |
@@ -729,57 +732,44 @@ |
}); |
} |
} |
- else |
+ else if ("windows" in chrome) |
{ |
// Edge does not yet support runtime.openOptionsPage (tested version 38) |
- // nor does Firefox for Android, |
// and so this workaround needs to stay for now. |
// We are not using extension.getURL to get the absolute path here |
// because of the Edge issue: |
// https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/10276332/ |
- let open = win => |
- { |
- let optionsUrl = "options.html"; |
- let queryInfo = {url: optionsUrl}; |
- |
- // extension pages can't be accessed in incognito windows. In order to |
- // correctly mimic the way in which Chrome opens extension options, |
- // we have to focus the options page in any other window. |
- if (win && !win.incognito) |
- queryInfo.windowId = win.id; |
+ let optionsUrl = "options.html"; |
+ let fullOptionsUrl = ext.getURL(optionsUrl); |
- chrome.tabs.query(queryInfo, tabs => |
+ chrome.tabs.query({}, tabs => |
+ { |
+ // We find a tab ourselves because Edge has a bug when quering tabs |
+ // with extension URL protocol: |
+ // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8094141/ |
+ // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8604703/ |
+ let tab = tabs.find(element => element.url == fullOptionsUrl); |
+ if (tab) |
{ |
- if (tabs && tabs.length > 0) |
- { |
- let tab = tabs[0]; |
- |
- if ("windows" in chrome) |
- chrome.windows.update(tab.windowId, {focused: true}); |
- |
- chrome.tabs.update(tab.id, {active: true}); |
+ chrome.windows.update(tab.windowId, {focused: true}); |
+ chrome.tabs.update(tab.id, {active: true}); |
- if (callback) |
- callback(new Page(tab)); |
- } |
- else |
- { |
- ext.pages.open(optionsUrl, callback); |
- } |
- }); |
- }; |
- |
- if ("windows" in chrome) |
- { |
- chrome.windows.getLastFocused(open); |
- } |
- else |
- { |
- // Firefox for Android does not support the windows API. Since there is |
- // effectively only one window on the mobile browser, there's no need |
- // to bring it into focus. |
- open(); |
- } |
+ if (callback) |
+ callback(new Page(tab)); |
+ } |
+ else |
+ { |
+ ext.pages.open(optionsUrl, callback); |
+ } |
+ }); |
+ } |
+ else |
+ { |
+ // Firefox for Android before version 57 does not support |
+ // runtime.openOptionsPage, nor does it support the windows API. Since |
+ // there is effectively only one window on the mobile browser, there's no |
+ // need to bring it into focus. |
+ ext.pages.open("options.html", callback); |
} |
}; |