Index: chrome/ext/background.js |
=================================================================== |
--- a/chrome/ext/background.js |
+++ b/chrome/ext/background.js |
@@ -108,62 +108,118 @@ |
ext.pages.onLoading._dispatch(new Page(tab)); |
}); |
+ function forgetTab(tabId) |
+ { |
+ ext._removeFromAllPageMaps(tabId); |
+ delete framesOfTabs[tabId]; |
+ } |
+ |
chrome.webNavigation.onBeforeNavigate.addListener(function(details) |
{ |
if (details.frameId == 0) |
- ext._removeFromAllPageMaps(details.tabId); |
+ forgetTab(details.tabId); |
}); |
- chrome.tabs.onRemoved.addListener(function(tabId) |
+ chrome.tabs.onReplaced.addListener(function(addedTabId, removedTabId) |
{ |
- ext._removeFromAllPageMaps(tabId); |
- delete framesOfTabs[tabId]; |
+ forgetTab(removedTabId); |
}); |
+ chrome.tabs.onRemoved.addListener(forgetTab); |
+ |
/* Browser actions */ |
var BrowserAction = function(tabId) |
{ |
this._tabId = tabId; |
+ this._changes = null; |
}; |
BrowserAction.prototype = { |
+ _applyChanges: function() |
+ { |
+ if ("iconPath" in this._changes) |
+ { |
+ chrome.browserAction.setIcon({ |
+ tabId: this._tabId, |
+ path: { |
+ 19: this._changes.iconPath.replace("$size", "19"), |
+ 38: this._changes.iconPath.replace("$size", "38") |
+ } |
+ }); |
+ } |
+ |
+ if ("badgeText" in this._changes) |
+ { |
+ chrome.browserAction.setBadgeText({ |
+ tabId: this._tabId, |
+ text: this._changes.badgeText |
+ }); |
+ } |
+ |
+ if ("badgeColor" in this._changes) |
+ { |
+ chrome.browserAction.setBadgeBackgroundColor({ |
+ tabId: this._tabId, |
+ color: this._changes.badgeColor |
+ }); |
+ } |
+ |
+ this._changes = null; |
+ }, |
+ _queueChanges: function() |
+ { |
+ chrome.tabs.get(this._tabId, function() |
+ { |
+ // If the tab is prerendered, chrome.tabs.get() sets |
+ // chrome.runtime.lastError and we have to delay our changes |
+ // until the currently visible tab is replaced with the |
+ // prerendered tab. Otherwise chrome.browserAction.set* fails. |
+ if (chrome.runtime.lastError) |
+ { |
+ var onReplaced = function(addedTabId, removedTabId) |
+ { |
+ if (addedTabId == this._tabId) |
+ { |
+ chrome.tabs.onReplaced.removeListener(onReplaced); |
+ this._applyChanges(); |
kzar
2015/02/09 16:38:40
Woudln't `this` in this context be onReplaced inst
Sebastian Noack
2015/02/09 17:03:24
Mind the .bind() below. ;)
kzar
2015/02/09 17:05:25
Whoops OK, missed that!
|
+ } |
+ }.bind(this); |
+ chrome.tabs.onReplaced.addListener(onReplaced); |
+ } |
+ else |
+ { |
+ this._applyChanges(); |
kzar
2015/02/09 16:38:40
Nit: Don't really need the braces for the else cla
Sebastian Noack
2015/02/09 17:03:24
Some time ago Wladimir told me to add braces for t
kzar
2015/02/09 17:05:25
Fair enough
|
+ } |
+ }.bind(this)); |
+ }, |
+ _addChange: function(name, value) |
+ { |
+ if (!this._changes) |
+ { |
+ this._changes = {}; |
+ this._queueChanges(); |
+ } |
+ |
+ this._changes[name] = value; |
+ }, |
setIcon: function(path) |
{ |
- var paths = {}; |
- for (var i = 1; i <= 2; i++) |
- { |
- var size = i * 19; |
- paths[size] = path.replace("$size", size); |
- } |
- |
- chrome.browserAction.setIcon({tabId: this._tabId, path: paths}); |
+ this._addChange("iconPath", path); |
}, |
setBadge: function(badge) |
{ |
if (!badge) |
{ |
- chrome.browserAction.setBadgeText({ |
- tabId: this._tabId, |
- text: "" |
- }); |
- return; |
+ this._addChange("badgeText", ""); |
} |
+ else |
+ { |
+ if ("number" in badge) |
+ this._addChange("badgeText", badge.number.toString()); |
- if ("color" in badge) |
- { |
- chrome.browserAction.setBadgeBackgroundColor({ |
- tabId: this._tabId, |
- color: badge.color |
- }); |
- } |
- |
- if ("number" in badge) |
- { |
- chrome.browserAction.setBadgeText({ |
- tabId: this._tabId, |
- text: badge.number.toString() |
- }); |
+ if ("color" in badge) |
+ this._addChange("badgeColor", badge.color); |
} |
} |
}; |