Bug 628902: Don't include nonstandard add-on types in AMO metadata ping. r=Unfocused, a=sdwilsh

This commit is contained in:
Dave Townsend 2011-02-15 15:18:07 -08:00
Родитель e637c01669
Коммит e0feabee39
2 изменённых файлов: 139 добавлений и 56 удалений

Просмотреть файл

@ -49,6 +49,8 @@ Components.utils.import("resource://gre/modules/AddonManager.jsm");
var EXPORTED_SYMBOLS = [ "AddonRepository" ];
const PREF_GETADDONS_CACHE_ENABLED = "extensions.getAddons.cache.enabled";
const PREF_GETADDONS_CACHE_TYPES = "extensions.getAddons.cache.types";
const PREF_GETADDONS_CACHE_ID_ENABLED = "extensions.%ID%.getAddons.cache.enabled"
const PREF_GETADDONS_BROWSEADDONS = "extensions.getAddons.browseAddons";
const PREF_GETADDONS_BYIDS = "extensions.getAddons.get.url";
const PREF_GETADDONS_BROWSERECOMMENDED = "extensions.getAddons.recommended.browseURL";
@ -59,6 +61,7 @@ const PREF_GETADDONS_GETSEARCHRESULTS = "extensions.getAddons.search.url";
const XMLURI_PARSE_ERROR = "http://www.mozilla.org/newlayout/xml/parsererror.xml";
const API_VERSION = "1.5";
const DEFAULT_CACHE_TYPES = "extension,theme,locale";
const KEY_PROFILEDIR = "ProfD";
const FILE_DATABASE = "addons.sqlite";
@ -133,6 +136,39 @@ function convertHTMLToPlainText(html) {
return html;
}
function getAddonsToCache(aIds, aCallback) {
try {
var types = Services.prefs.getCharPref(PREF_GETADDONS_CACHE_TYPES);
}
catch (e) { }
if (!types)
types = DEFAULT_CACHE_TYPES;
types = types.split(",");
AddonManager.getAddonsByIDs(aIds, function(aAddons) {
let enabledIds = [];
for (var i = 0; i < aIds.length; i++) {
var preference = PREF_GETADDONS_CACHE_ID_ENABLED.replace("%ID%", aIds[i]);
try {
if (!Services.prefs.getBoolPref(preference))
continue;
} catch(e) {
// If the preference doesn't exist caching is enabled by default
}
// The add-ons manager may not know about this ID yet if it is a pending
// install. In that case we'll just cache it regardless
if (aAddons[i] && (types.indexOf(aAddons[i].type) == -1))
continue;
enabledIds.push(aIds[i]);
}
aCallback(enabledIds);
});
}
function AddonSearchResult(aId) {
this.id = aId;
}
@ -545,8 +581,6 @@ var AddonRepository = {
* The optional callback to call once complete
*/
repopulateCache: function(aIds, aCallback) {
let self = this;
// Completely remove cache if caching is not enabled
if (!this.cacheEnabled) {
this._addons = null;
@ -555,36 +589,28 @@ var AddonRepository = {
return;
}
let enabledIds = aIds.filter(function(aId) {
let preference = "extensions." + aId + ".getAddons.cache.enabled";
let enabled = true;
try {
enabled = Services.prefs.getBoolPref(preference);
} catch(e) {
// If pref doesn't exist, default to enabled = true
let self = this;
getAddonsToCache(aIds, function(aAddons) {
// Completely remove cache if there are no add-ons to cache
if (aAddons.length == 0) {
this._addons = null;
this._pendingCallbacks = null;
AddonDatabase.delete(aCallback);
return;
}
return enabled;
});
// Completely remove cache if there are no add-ons to cache
if (enabledIds.length == 0) {
this._addons = null;
this._pendingCallbacks = null;
AddonDatabase.delete(aCallback);
return;
}
this.getAddonsByIDs(enabledIds, {
searchSucceeded: function(aAddons) {
self._addons = {};
aAddons.forEach(function(aAddon) { self._addons[aAddon.id] = aAddon; });
AddonDatabase.repopulate(aAddons, aCallback);
},
searchFailed: function() {
WARN("Search failed when repopulating cache");
if (aCallback)
aCallback();
}
self.getAddonsByIDs(aAddons, {
searchSucceeded: function(aAddons) {
self._addons = {};
aAddons.forEach(function(aAddon) { self._addons[aAddon.id] = aAddon; });
AddonDatabase.repopulate(aAddons, aCallback);
},
searchFailed: function() {
WARN("Search failed when repopulating cache");
if (aCallback)
aCallback();
}
});
});
},
@ -605,35 +631,26 @@ var AddonRepository = {
return;
}
let enabledIds = aIds.filter(function(aId) {
let preference = "extensions." + aId + ".getAddons.cache.enabled";
let enabled = true;
try {
enabled = Services.prefs.getBoolPref(preference);
} catch(e) {
// If pref doesn't exist, default to enabled = true
}
return enabled;
});
// If there are no add-ons to cache, act as if caching is disabled
if (enabledIds.length == 0) {
if (aCallback)
aCallback();
return;
}
let self = this;
this.getAddonsByIDs(enabledIds, {
searchSucceeded: function(aAddons) {
aAddons.forEach(function(aAddon) { self._addons[aAddon.id] = aAddon; });
AddonDatabase.insertAddons(aAddons, aCallback);
},
searchFailed: function() {
WARN("Search failed when adding add-ons to cache");
getAddonsToCache(aIds, function(aAddons) {
// If there are no add-ons to cache, act as if caching is disabled
if (aAddons.length == 0) {
if (aCallback)
aCallback();
return;
}
self.getAddonsByIDs(aAddons, {
searchSucceeded: function(aAddons) {
aAddons.forEach(function(aAddon) { self._addons[aAddon.id] = aAddon; });
AddonDatabase.insertAddons(aAddons, aCallback);
},
searchFailed: function() {
WARN("Search failed when adding add-ons to cache");
if (aCallback)
aCallback();
}
});
});
},

Просмотреть файл

@ -13,6 +13,7 @@ const PORT = 4444;
const BASE_URL = "http://localhost:" + PORT;
const PREF_GETADDONS_CACHE_ENABLED = "extensions.getAddons.cache.enabled";
const PREF_GETADDONS_CACHE_TYPES = "extensions.getAddons.cache.types";
const PREF_GETADDONS_BYIDS = "extensions.getAddons.get.url";
const PREF_EM_AUTOUPDATE_DEFAULT = "extensions.update.autoUpdateDefault";
const GETADDONS_RESULTS = BASE_URL + "/data/test_AddonRepository_cache.xml";
@ -285,6 +286,59 @@ const WITH_CACHE = [{
sourceURI: NetUtil.newURI(ADDON_FILES[2]).spec
}];
// Expected add-ons when using cache
const WITH_EXTENSION_CACHE = [{
id: ADDON_IDS[0],
type: "extension",
name: "XPI Add-on 1",
version: "1.1",
creator: {
name: "Repo Add-on 1 - Creator",
url: BASE_URL + "/repo/1/creator.html"
},
developers: [{ name: "XPI Add-on 1 - First Developer" },
{ name: "XPI Add-on 1 - Second Developer" }],
translators: [{ name: "XPI Add-on 1 - First Translator" },
{ name: "XPI Add-on 1 - Second Translator" }],
contributors: [{ name: "XPI Add-on 1 - First Contributor" },
{ name: "XPI Add-on 1 - Second Contributor" }],
description: "XPI Add-on 1 - Description",
fullDescription: "Repo Add-on 1 - Full Description & some extra",
developerComments: "Repo Add-on 1\nDeveloper Comments",
eula: "Repo Add-on 1 - EULA",
iconURL: BASE_URL + "/xpi/1/icon.png",
homepageURL: BASE_URL + "/xpi/1/homepage.html",
supportURL: BASE_URL + "/repo/1/support.html",
optionsURL: BASE_URL + "/xpi/1/options.html",
aboutURL: BASE_URL + "/xpi/1/about.html",
contributionURL: BASE_URL + "/repo/1/meetDevelopers.html",
contributionAmount: "$11.11",
averageRating: 1,
reviewCount: 1111,
reviewURL: BASE_URL + "/repo/1/review.html",
totalDownloads: 2221,
weeklyDownloads: 3331,
dailyUsers: 4441,
sourceURI: NetUtil.newURI(ADDON_FILES[0]).spec,
repositoryStatus: 4
}, {
id: ADDON_IDS[1],
type: "theme",
name: "XPI Add-on 2",
version: "1.2",
sourceURI: NetUtil.newURI(ADDON_FILES[1]).spec
}, {
id: ADDON_IDS[2],
type: "theme",
name: "XPI Add-on 3",
version: "1.3",
get iconURL () {
return get_subfile_uri(ADDON_IDS[2], "icon.png");
},
screenshots: [{ get url () { return get_subfile_uri(ADDON_IDS[2], "preview.png"); } }],
sourceURI: NetUtil.newURI(ADDON_FILES[2]).spec
}];
/*
* Trigger an AddonManager background update check
@ -663,7 +717,19 @@ function run_test_16() {
AddonManager.getAddonsByIDs(ADDON_IDS, function(aAddons) {
check_results(aAddons, WITH_CACHE);
end_test();
run_test_17();
});
}
// Tests that setting a list of types to cache works
function run_test_17() {
Services.prefs.setCharPref(PREF_GETADDONS_CACHE_TYPES, "foo,bar,extension,baz");
trigger_background_update(function() {
AddonManager.getAddonsByIDs(ADDON_IDS, function(aAddons) {
check_results(aAddons, WITH_EXTENSION_CACHE);
end_test();
});
});
}