manifoldjs-chrome
Version:
ManifoldJS Chrome OS Platform
93 lines (74 loc) • 2.86 kB
JavaScript
var url = require('url'),
Q = require('q');
var lib = require('manifoldjs-lib');
var utils = lib.utils;
function convertFromBase(manifestInfo, callback) {
if (!manifestInfo || !manifestInfo.content) {
return Q.reject(new Error('Manifest content is empty or not initialized.')).nodeify(callback);
}
var originalManifest = manifestInfo.content;
if (!originalManifest.start_url) {
return Q.reject(new Error('Start URL is required.')).nodeify(callback);
}
var manifest = {
'manifest_version': 2,
'name': originalManifest.name || originalManifest.short_name || utils.sanitizeName(url.parse(originalManifest.start_url).hostname),
'version': '0.0.1',
'app': {
'launch': {
'web_url': originalManifest.start_url
}
}
};
// map icons
if (originalManifest.icons && originalManifest.icons.length) {
var icons = {};
for (var i = 0; i < originalManifest.icons.length; i++) {
var icon = originalManifest.icons[i];
var iconDimensions = icon.sizes.split('x');
if (iconDimensions[0] === iconDimensions[1]) {
icons[iconDimensions[0]] = url.parse(icon.src).path;
}
}
manifest.icons = icons;
}
// map permissions
// NOTE: Chrome manifest does not support assigning different permissions based on URL.
// Mapping calculates union of all permissions found for the 'Chrome' platform and grants
// the same set of permissions for all URLs.
if (originalManifest.mjs_api_access && originalManifest.mjs_api_access.length) {
var permissionSet = {};
originalManifest.mjs_api_access.forEach(function(rule) {
if (rule.platform && rule.platform.split(';')
.map(function (item) { return item.trim(); })
.indexOf('chrome') >= 0) {
if (!manifest.app.urls) {
manifest.app.urls = [];
}
// add app URL unless it matches start_url
var url = rule.match.trim().replace(/\*$/, '');
if (url !== originalManifest.start_url) {
manifest.app.urls.push(url);
}
// use permissionSet object to calculate union of the permissions in all rules
rule.access.split(';').forEach(function (p) {
permissionSet[p.trim()] = undefined;
});
}
});
// create permissions array
var permissions = Object.keys(permissionSet);
if (permissions.length) {
manifest.permissions = permissions;
}
}
var convertedManifestInfo = {
'content': manifest,
'format': lib.constants.CHROME_MANIFEST_FORMAT
};
return Q.resolve(convertedManifestInfo).nodeify(callback);
}
module.exports = {
convertFromBase: convertFromBase
};
;