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: Do not use 19x19 and 38x38 icons on any platform Created Feb. 3, 2019, 8:18 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,32 +46,70 @@
});
image.addEventListener("error", () =>
{
reject("Failed to load image " + url);
});
});
}
+function renderIcons()
+{
+ Promise.all([
+ loadImage("icons/abp-16.png"),
+ loadImage("icons/abp-16-whitelisted.png"),
+ loadImage("icons/abp-32.png"),
+ loadImage("icons/abp-32-whitelisted.png")
+ ])
+ .then(images =>
+ {
+ let imageMap = {
+ 16: [images[0], images[1]],
+ 32: [images[2], images[3]]
+ };
+
+ let canvas = document.createElement("canvas");
+ let context = canvas.getContext("2d");
+
+ for (let whitelisted = 0; whitelisted <= 1; whitelisted++)
+ {
+ let imageData = {};
+ let sizes = [16, 32];
+
+ for (let size of sizes)
+ {
+ canvas.width = size;
+ canvas.height = size;
+ context.globalAlpha = 1;
+ context.drawImage(imageMap[size][whitelisted], 0, 0);
+ imageData[size] = context.getImageData(0, 0, size, size);
+ }
+
+ icons[whitelisted] = 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");
}
else
{
page.browserAction.setIcon("/icons/abp-$size" +
- (whitelisted ? "-whitelisted" : "") + ".png");
+ (whitelisted ? "-whitelisted" : "") + ".png",
+ icons[whitelisted | 0]);
}
}
else
{
browser.browserAction.setIcon({
tabId: page.id,
imageData: frames["" + opacity + whitelisted]
});
@@ -232,8 +273,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