Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: lib/icon.js

Issue 29995555: Issue 7253 - Pre-render icons for badge on Chromium (Closed) Base URL: https://hg.adblockplus.org/adblockpluschrome/
Patch Set: Rewrite renderIcons Created Feb. 3, 2019, 9:45 a.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ext/background.js ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/icon.js
===================================================================
--- a/lib/icon.js
+++ b/lib/icon.js
@@ -15,27 +15,30 @@
* along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
*/
/** @module icon */
"use strict";
const {filterNotifier} = require("../adblockpluscore/lib/filterNotifier");
+const info = require("info");
const frameOpacities = [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9,
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0];
const numberOfFrames = frameOpacities.length;
let stopRequested = false;
let canUpdateIcon = true;
let notRunning = Promise.resolve();
let whitelistedState = new ext.PageMap();
+let icons = [null, null];
+
function loadImage(url)
{
return new Promise((resolve, reject) =>
{
let image = new Image();
image.src = url;
image.addEventListener("load", () =>
{
@@ -43,37 +46,69 @@
});
image.addEventListener("error", () =>
{
reject("Failed to load image " + url);
});
});
}
+function renderIcons()
+{
+ let paths = [
+ "icons/abp-16.png", "icons/abp-16-whitelisted.png",
+ "icons/abp-32.png", "icons/abp-32-whitelisted.png"
+ ];
+
+ for (let path of paths)
+ {
+ loadImage(path).then(image =>
+ {
+ let [, size, whitelisted] = /\/abp-(16|32)(-whitelisted)?\./.exec(path);
Manish Jethani 2019/02/03 09:47:55 Note: size is a string, not a number, but that's f
+
+ let canvas = document.createElement("canvas");
+ let context = canvas.getContext("2d");
+ let imageData = icons[!!whitelisted | 0] || {};
Sebastian Noack 2019/02/03 10:07:54 Nit: Isn't coercing to boolean (through !!) redund
Manish Jethani 2019/02/03 10:37:55 `"-whitelisted" | 0` is 0. Because "-whitelisted"
+
+ canvas.width = size;
+ canvas.height = size;
+ context.globalAlpha = 1;
+ context.drawImage(image, 0, 0);
+ imageData[size] = context.getImageData(0, 0, size, size);
+
+ icons[!!whitelisted | 0] = imageData;
+ });
+ }
+}
+
function setIcon(page, notificationType, opacity, frames)
{
opacity = opacity || 0;
let whitelisted = !!whitelistedState.get(page);
if (!notificationType || !frames)
{
if (opacity > 0.5)
{
- page.browserAction.setIcon("/icons/abp-$size-notification-" +
- notificationType + ".png");
+ page.browserAction.setIconPath("/icons/abp-$size-notification-" +
+ notificationType + ".png");
+ }
+ else if (icons[whitelisted | 0])
+ {
+ page.browserAction.setIconImageData(icons[whitelisted | 0]);
}
else
{
- page.browserAction.setIcon("/icons/abp-$size" +
- (whitelisted ? "-whitelisted" : "") + ".png");
+ page.browserAction.setIconPath("/icons/abp-$size" +
+ (whitelisted ? "-whitelisted" : "") + ".png");
}
}
else
{
- browser.browserAction.setIcon({
+ browser.browserAction.setIconPath({
tabId: page.id,
imageData: frames["" + opacity + whitelisted]
});
}
}
filterNotifier.on("page.WhitelistingStateRevalidate", (page, filter) =>
{
@@ -224,8 +259,12 @@
return;
}
animateIcon(type, frames);
}, 10000);
});
});
};
+
+// Pre-render icons on Chromium (#7253).
+if (info.platform == "chromium")
+ renderIcons();
« no previous file with comments | « ext/background.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld