Index: ext/background.js |
=================================================================== |
--- a/ext/background.js |
+++ b/ext/background.js |
@@ -312,109 +312,100 @@ |
let BrowserAction = function(tabId) |
{ |
this._tabId = tabId; |
this._changes = null; |
}; |
BrowserAction.prototype = { |
_applyChanges() |
{ |
- if ("iconPath" in this._changes) |
+ return Promise.all(Object.keys(this._changes).map((change) => |
Sebastian Noack
2018/06/13 01:35:33
Nit: The parenthesis around the argument list is o
Jon Sonesen
2018/06/13 23:05:07
Oh yeah forgot about that, thanks
|
{ |
- // Firefox for Android displays the browser action not as an icon but |
- // as a menu item. There is no icon, but such an option may be added in |
- // the future. |
- // https://bugzilla.mozilla.org/show_bug.cgi?id=1331746 |
- if ("setIcon" in browser.browserAction) |
+ if (change == "iconPath") |
Sebastian Noack
2018/06/13 01:35:33
Unrelated, but since you are changing this code an
Jon Sonesen
2018/06/13 23:05:07
Acknowledged.
|
{ |
- let path = { |
- 16: this._changes.iconPath.replace("$size", "16"), |
- 19: this._changes.iconPath.replace("$size", "19"), |
- 20: this._changes.iconPath.replace("$size", "20"), |
- 32: this._changes.iconPath.replace("$size", "32"), |
- 38: this._changes.iconPath.replace("$size", "38"), |
- 40: this._changes.iconPath.replace("$size", "40") |
- }; |
- try |
+ // Firefox for Android displays the browser action not as an icon but |
+ // as a menu item. There is no icon, but such an option may be added in |
+ // the future. |
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=1331746 |
+ if ("setIcon" in browser.browserAction) |
{ |
- browser.browserAction.setIcon({tabId: this._tabId, path}); |
- } |
- catch (e) |
- { |
- // Edge throws if passed icon sizes different than 19,20,38,40px. |
- delete path[16]; |
- delete path[32]; |
- browser.browserAction.setIcon({tabId: this._tabId, path}); |
+ let path = { |
+ 16: this._changes.iconPath.replace("$size", "16"), |
+ 19: this._changes.iconPath.replace("$size", "19"), |
+ 20: this._changes.iconPath.replace("$size", "20"), |
+ 32: this._changes.iconPath.replace("$size", "32"), |
+ 38: this._changes.iconPath.replace("$size", "38"), |
+ 40: this._changes.iconPath.replace("$size", "40") |
+ }; |
+ try |
Jon Sonesen
2018/06/12 21:18:02
Now that this is in polyfill.js I suspect this not
|
+ { |
+ return browser.browserAction.setIcon({tabId: this._tabId, path}); |
+ } |
+ catch (e) |
+ { |
+ // Edge throws if passed icon sizes different than 19,20,38,40px. |
+ delete path[16]; |
+ delete path[32]; |
+ return browser.browserAction.setIcon({tabId: this._tabId, path}); |
+ } |
} |
} |
- } |
- if ("badgeText" in this._changes) |
- { |
- // There is no badge on Firefox for Android; the browser action is |
- // simply a menu item. |
- if ("setBadgeText" in browser.browserAction) |
+ if (change == "badgeText") |
{ |
- browser.browserAction.setBadgeText({ |
- tabId: this._tabId, |
- text: this._changes.badgeText |
- }); |
+ // There is no badge on Firefox for Android; the browser action is |
+ // simply a menu item. |
+ if ("setBadgeText" in browser.browserAction) |
+ { |
+ return browser.browserAction.setBadgeText({ |
+ tabId: this._tabId, |
+ text: this._changes.badgeText |
+ }); |
+ } |
} |
- } |
- |
- if ("badgeColor" in this._changes) |
- { |
- // There is no badge on Firefox for Android; the browser action is |
- // simply a menu item. |
- if ("setBadgeBackgroundColor" in browser.browserAction) |
- { |
- browser.browserAction.setBadgeBackgroundColor({ |
- tabId: this._tabId, |
- color: this._changes.badgeColor |
- }); |
- } |
- } |
- this._changes = null; |
- }, |
- _queueChanges() |
- { |
- browser.tabs.get(this._tabId, () => |
- { |
- // If the tab is prerendered, browser.tabs.get() sets |
- // browser.runtime.lastError and we have to delay our changes |
- // until the currently visible tab is replaced with the |
- // prerendered tab. Otherwise browser.browserAction.set* fails. |
- if (browser.runtime.lastError) |
+ if (change == "badgeColor") |
{ |
- let onReplaced = (addedTabId, removedTabId) => |
+ // There is no badge on Firefox for Android; the browser action is |
+ // simply a menu item. |
+ if ("setBadgeBackgroundColor" in browser.browserAction) |
{ |
- if (addedTabId == this._tabId) |
- { |
- browser.tabs.onReplaced.removeListener(onReplaced); |
- this._applyChanges(); |
- } |
- }; |
- browser.tabs.onReplaced.addListener(onReplaced); |
+ return browser.browserAction.setBadgeBackgroundColor({ |
+ tabId: this._tabId, |
+ color: this._changes.badgeColor |
+ }); |
+ } |
} |
- else |
- { |
- this._applyChanges(); |
- } |
- }); |
+ |
+ this._changes = null; |
Sebastian Noack
2018/06/13 01:35:33
It seems in case of failure (when we register the
Jon Sonesen
2018/06/13 23:05:07
Acknowledged.
|
+ })); |
}, |
_addChange(name, value) |
{ |
if (!this._changes) |
{ |
this._changes = {}; |
- this._queueChanges(); |
} |
this._changes[name] = value; |
+ this._applyChanges().catch(() => |
Sebastian Noack
2018/06/13 01:35:33
If this._changes is not null (and an onReplaced ha
Jon Sonesen
2018/06/13 23:06:40
Acknowledged.
|
+ { |
+ // If the tab is prerendered, browser.browserAction.set* fails |
+ // and we have to delay our changes until the currently visible tab |
+ // is replaced with the prerendered tab. |
+ let onReplaced = (addedTabId, removedTabId) => |
+ { |
+ if (addedTabId == this._tabId) |
+ { |
+ browser.tabs.onReplaced.removeListener(onReplaced); |
+ this._applyChanges(); |
+ } |
+ }; |
+ browser.tabs.onReplaced.addListener(onReplaced); |
+ }); |
}, |
setIcon(path) |
{ |
this._addChange("iconPath", path); |
}, |
setBadge(badge) |
{ |
if (!badge) |