| Index: iconAnimation.js |
| =================================================================== |
| new file mode 100644 |
| --- /dev/null |
| +++ b/iconAnimation.js |
| @@ -0,0 +1,134 @@ |
| +/* |
| + * This file is part of Adblock Plus <http://adblockplus.org/>, |
| + * Copyright (C) 2006-2013 Eyeo GmbH |
| + * |
| + * Adblock Plus is free software: you can redistribute it and/or modify |
| + * it under the terms of the GNU General Public License version 3 as |
| + * published by the Free Software Foundation. |
| + * |
| + * Adblock Plus is distributed in the hope that it will be useful, |
| + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| + * GNU General Public License for more details. |
| + * |
| + * You should have received a copy of the GNU General Public License |
| + * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
| + */ |
| + |
| +iconAnimation = { |
| + _icons: new TabMap(), |
| + _animatedTabs: new TabMap(), |
| + step: 0, |
| + |
| + update: function(severity) |
| + { |
| + if (severity == this._severity) |
| + return; |
| + |
| + if (!this._severity) |
| + this._start(); |
| + |
| + this._severity = severity; |
| + }, |
| + stop: function() |
| + { |
| + clearInterval(this._interval); |
| + |
| + delete this._interval; |
| + delete this._severity; |
| + |
| + this._animatedTabs.clear(); |
| + }, |
| + registerTab: function(tab, icon) |
| + { |
| + this._icons.set(tab, icon); |
| + |
| + if (this._animatedTabs.has(tab)) |
| + this._updateIcon(tab); |
| + }, |
| + _start: function() |
| + { |
| + this._interval = setInterval(function() |
| + { |
| + this._getVisibleTabs(function(tabs) |
| + { |
| + if (tabs.length == 0) |
| + return; |
| + |
| + for (var i = 0; i < tabs.length; i++) |
| + this._animatedTabs.set(tabs[i], null); |
| + |
| + var interval = setInterval(function() |
| + { |
| + this._step++; |
| + tabs.forEach(this._updateIcon.bind(this)); |
| + |
| + if (this._step < 10) |
| + return; |
| + |
| + clearInterval(interval); |
| + setTimeout(function() |
| + { |
| + interval = setInterval(function() |
| + { |
| + this._step--; |
| + tabs.forEach(this._updateIcon.bind(this)); |
| + |
| + if (this._step > 0) |
| + return; |
| + |
| + clearInterval(interval); |
| + this._animatedTabs.clear(); |
| + }.bind(this), 100); |
| + }.bind(this), 1000); |
| + }.bind(this), 100); |
| + }.bind(this)); |
| + }.bind(this), 15000); |
| + }, |
| + _getVisibleTabs: function(callback) |
| + { |
| + ext.windows.getAll(function(windows) |
| + { |
| + var tabs = []; |
| + var visibleWindows = windows.length; |
| + |
| + for (var i = 0; i < windows.length; i++) |
| + { |
| + if (!windows[i].visible) |
| + { |
| + if (--visibleWindows == 0) |
| + callback(tabs); |
| + |
| + continue; |
| + } |
| + |
| + windows[i].getActiveTab(function(tab) |
| + { |
| + tabs.push(tab); |
| + |
| + if (tabs.length == visibleWindows) |
| + callback(tabs); |
| + }); |
| + } |
| + }); |
| + }, |
| + _updateIcon: function(tab) |
| + { |
| + var path = this._icons.get(tab); |
| + |
| + if (!path) |
| + return; |
| + |
| + if (this._step > 0) |
| + { |
| + var suffix = "-notification-" + this._severity; |
| + |
| + if (this._step < 10) |
| + suffix += "-" + this._step; |
| + |
| + path = path.replace(/(?=\..+$)/, suffix); |
| + } |
| + |
| + tab.pageAction.setIcon(path); |
| + } |
| +}; |