| Index: lib/icon.js |
| =================================================================== |
| rename from iconAnimation.js |
| rename to lib/icon.js |
| --- a/iconAnimation.js |
| +++ b/lib/icon.js |
| @@ -15,93 +15,114 @@ |
| * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
| */ |
| -iconAnimation = { |
| - _icons: new ext.PageMap(), |
| - _animatedPages: new ext.PageMap(), |
| - _step: 0, |
| +const numberOfFrames = 10; |
| - update: function(type) |
| +let whitelistedState = new ext.PageMap(); |
| +let notificationType = null; |
| +let animationInterval = null; |
| +let animationStep = 0; |
| + |
| +function getIconPath(whitelisted) |
| +{ |
| + let filename = "icons/abp-$size"; |
| + |
| + // If the current page is whitelisted, pick an icon that indicates that |
| + // Adblock Plus is disabled, however not when the notification icon has |
| + // full opacity, or on Safari where icons are genrally grayscale-only. |
| + if (whitelisted && animationStep < numberOfFrames && require("info").platform != "safari") |
| + filename += "-whitelisted"; |
| + |
| + // If the icon is currently animating to indicate a pending notification, |
| + // pick the icon for the corresponing notification type and animation frame. |
| + if (notificationType && animationStep > 0) |
| { |
| - if (type == this._type) |
| - return; |
| + filename += "-notification-" + notificationType; |
| - if (!this._type) |
| - this._start(); |
| + if (animationStep < numberOfFrames) |
| + filename += "-" + animationStep; |
| + } |
| - this._type = type; |
| - }, |
| - stop: function() |
| + return filename + ".png"; |
| +} |
| + |
| +function setIcon(page) |
| +{ |
| + page.browserAction.setIcon(getIconPath(whitelistedState.get(page))); |
| +} |
| + |
| +function runAnimation() |
| +{ |
| + return setInterval(function() |
| { |
| - clearInterval(this._interval); |
| + ext.pages.query({active: true}, function(pages) |
| + { |
| + let fadeInInterval = setInterval(function() |
| + { |
| + animationStep++; |
| + pages.forEach(setIcon); |
| - delete this._interval; |
| - delete this._type; |
| - |
| - this._animatedPages.clear(); |
| - }, |
| - registerPage: function(page, icon) |
| - { |
| - this._icons.set(page, icon); |
| - |
| - if (this._animatedPages.has(page)) |
| - this._updateIcon(page); |
| - }, |
| - _start: function() |
| - { |
| - this._interval = setInterval(function() |
| - { |
| - ext.pages.query({active: true}, function(pages) |
| - { |
| - if (pages.length == 0) |
| + if (animationStep < numberOfFrames) |
| return; |
| - for (var i = 0; i < pages.length; i++) |
| - this._animatedPages.set(pages[i], null); |
| + setTimeout(function() |
| + { |
| + let fadeOutInterval = setInterval(function() |
| + { |
| + animationStep--; |
| + pages.forEach(setIcon); |
| - var interval = setInterval(function() |
| - { |
| - this._step++; |
| - pages.forEach(this._updateIcon.bind(this)); |
| + if (animationStep > 0) |
| + return; |
| - if (this._step < 10) |
| - return; |
| + clearInterval(fadeOutInterval); |
| + }, 100); |
| + },1000); |
| - clearInterval(interval); |
| - setTimeout(function() |
| - { |
| - interval = setInterval(function() |
| - { |
| - this._step--; |
| - pages.forEach(this._updateIcon.bind(this)); |
| + clearInterval(fadeInInterval); |
| + }, 100); |
| + }); |
| + }, 15000); |
| +} |
| - if (this._step > 0) |
| - return; |
| +/** |
| + * Set the browser action icon for the given page, indicating whether |
| + * adblocking is active there, and considering the icon animation. |
| + * |
| + * @param {Page} [page] The page to set the browser action icon for |
| + * @param {Boolean} [whitelisted] Whether the page has been whitelisted |
| + */ |
| +function updateIcon(page, whitelisted) |
| +{ |
| + page.browserAction.setIcon(getIconPath(whitelisted)); |
| + whitelistedState.set(page, whitelisted); |
| +} |
| +exports.updateIcon = updateIcon; |
| - clearInterval(interval); |
| - this._animatedPages.clear(); |
| - }.bind(this), 100); |
| - }.bind(this), 1000); |
| - }.bind(this), 100); |
| - }.bind(this)); |
| - }.bind(this), 15000); |
| - }, |
| - _updateIcon: function(page) |
| +/** |
| + * Starts to animate the browser action icon to indicate a pending notifcation. |
| + * |
| + * @param {string} [type] The notifaction type (i.e: "information" or "critical") |
| + */ |
| +function startIconAnimation(type) |
| +{ |
| + notificationType = type; |
| + |
| + if (animationInterval == null) |
| + animationInterval = runAnimation(); |
| +} |
| +exports.startIconAnimation = startIconAnimation; |
| + |
| +/** |
| + * Stops to animate the browser action icon. |
| + */ |
| +function stopIconAnimation() |
| +{ |
| + if (animationInterval != null) |
| { |
| - var path = this._icons.get(page); |
| + clearInterval(animationInterval); |
| + animationInterval = null; |
| + } |
| - if (!path) |
| - return; |
| - |
| - if (this._step > 0) |
| - { |
| - var suffix = "-notification-" + this._type; |
| - |
| - if (this._step < 10) |
| - suffix += "-" + this._step; |
| - |
| - path = path.replace(/(?=\..+$)/, suffix); |
| - } |
| - |
| - page.browserAction.setIcon(path); |
| - } |
| -}; |
| + notificationType = null; |
| +} |
| +exports.stopIconAnimation = stopIconAnimation; |