gecko-dev/dom/manifest/ManifestIcons.jsm
Kris Maglione e930b89c34 Bug 1514594: Part 3 - Change ChromeUtils.import API.
***
Bug 1514594: Part 3a - Change ChromeUtils.import to return an exports object; not pollute global. r=mccr8

This changes the behavior of ChromeUtils.import() to return an exports object,
rather than a module global, in all cases except when `null` is passed as a
second argument, and changes the default behavior not to pollute the global
scope with the module's exports. Thus, the following code written for the old
model:

  ChromeUtils.import("resource://gre/modules/Services.jsm");

is approximately the same as the following, in the new model:

  var {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");

Since the two behaviors are mutually incompatible, this patch will land with a
scripted rewrite to update all existing callers to use the new model rather
than the old.
***
Bug 1514594: Part 3b - Mass rewrite all JS code to use the new ChromeUtils.import API. rs=Gijs

This was done using the followng script:

https://bitbucket.org/kmaglione/m-c-rewrites/src/tip/processors/cu-import-exports.jsm
***
Bug 1514594: Part 3c - Update ESLint plugin for ChromeUtils.import API changes. r=Standard8

Differential Revision: https://phabricator.services.mozilla.com/D16747
***
Bug 1514594: Part 3d - Remove/fix hundreds of duplicate imports from sync tests. r=Gijs

Differential Revision: https://phabricator.services.mozilla.com/D16748
***
Bug 1514594: Part 3e - Remove no-op ChromeUtils.import() calls. r=Gijs

Differential Revision: https://phabricator.services.mozilla.com/D16749
***
Bug 1514594: Part 3f.1 - Cleanup various test corner cases after mass rewrite. r=Gijs
***
Bug 1514594: Part 3f.2 - Cleanup various non-test corner cases after mass rewrite. r=Gijs

Differential Revision: https://phabricator.services.mozilla.com/D16750

--HG--
extra : rebase_source : 359574ee3064c90f33bf36c2ebe3159a24cc8895
extra : histedit_source : b93c8f42808b1599f9122d7842d2c0b3e656a594%2C64a3a4e3359dc889e2ab2b49461bab9e27fc10a7
2019-01-17 10:18:31 -08:00

80 lines
2.5 KiB
JavaScript

"use strict";
const {PromiseMessage} = ChromeUtils.import("resource://gre/modules/PromiseMessage.jsm");
var ManifestIcons = {
async browserFetchIcon(aBrowser, manifest, iconSize) {
const msgKey = "DOM:WebManifest:fetchIcon";
const mm = aBrowser.messageManager;
const {data: {success, result}} =
await PromiseMessage.send(mm, msgKey, {manifest, iconSize});
if (!success) {
throw result;
}
return result;
},
async contentFetchIcon(aWindow, manifest, iconSize) {
return getIcon(aWindow, toIconArray(manifest.icons), iconSize);
},
};
function parseIconSize(size) {
if (size === "any" || size === "") {
// We want icons without size specified to sorted
// as the largest available icons
return Number.MAX_SAFE_INTEGER;
}
// 100x100 will parse as 100
return parseInt(size, 10);
}
// Create an array of icons sorted by their size
function toIconArray(icons) {
const iconBySize = [];
icons.forEach(icon => {
const sizes = ("sizes" in icon) ? icon.sizes : "";
sizes.split(" ").forEach(size => {
iconBySize.push({src: icon.src, size: parseIconSize(size)});
});
});
return iconBySize.sort((a, b) => a.size - b.size);
}
async function getIcon(aWindow, icons, expectedSize) {
if (!icons.length) {
throw new Error("Could not find valid icon");
}
// We start trying the smallest icon that is larger than the requested
// size and go up to the largest icon if they fail, if all those fail
// go back down to the smallest
let index = icons.findIndex(icon => icon.size >= expectedSize);
if (index === -1) {
index = icons.length - 1;
}
return fetchIcon(aWindow, icons[index].src).catch(err => {
// Remove all icons with the failed source, the same source
// may have been used for multiple sizes
icons = icons.filter(x => x.src !== icons[index].src);
return getIcon(aWindow, icons, expectedSize);
});
}
async function fetchIcon(aWindow, src) {
const iconURL = new aWindow.URL(src, aWindow.location);
const request = new aWindow.Request(iconURL, {mode: "cors"});
request.overrideContentPolicyType(Ci.nsIContentPolicy.TYPE_IMAGE);
return aWindow.fetch(request)
.then(response => response.blob())
.then(blob => new Promise((resolve, reject) => {
var reader = new FileReader();
reader.onloadend = () => resolve(reader.result);
reader.onerror = reject;
reader.readAsDataURL(blob);
}));
}
var EXPORTED_SYMBOLS = ["ManifestIcons"]; // jshint ignore:line