Bug 706777 - Automatically repopulate AddonRepository database on application upgrade. r=dtownsend

This commit is contained in:
Blair McBride 2011-12-07 23:48:33 +13:00
parent c31ccdc3d2
commit fb944f3b23
10 changed files with 324 additions and 20 deletions

View File

@ -1309,6 +1309,10 @@ var AddonManagerPrivate = {
AddonManagerInternal.updateAddonAppDisabledStates();
},
updateAddonRepositoryData: function AMP_updateAddonRepositoryData(aCallback) {
AddonManagerInternal.updateAddonRepositoryData(aCallback);
},
callInstallListeners: function AMP_callInstallListeners(aMethod) {
return AddonManagerInternal.callInstallListeners.apply(AddonManagerInternal,
arguments);

View File

@ -38,6 +38,7 @@
"use strict";
Components.utils.import("resource://gre/modules/AddonManager.jsm");
Components.utils.import("resource://gre/modules/AddonRepository.jsm");
Components.utils.import("resource://gre/modules/Services.jsm");
const Cc = Components.classes;
@ -124,17 +125,25 @@ var gChecking = {
self._progress.max = aAddons.length;
self._progress.mode = "determined";
aAddons.forEach(function(aAddon) {
// Ignore disabled themes
if (aAddon.type != "theme" || !aAddon.userDisabled) {
gAddons[aAddon.id] = {
addon: aAddon,
install: null,
wasActive: aAddon.isActive
}
}
// Ensure compatibility overrides are up to date before checking for
// individual addon updates.
let ids = [addon.id for each (addon in aAddons)];
AddonRepository.repopulateCache(ids, function() {
AddonManagerPrivate.updateAddonRepositoryData(function() {
aAddon.findUpdates(self, AddonManager.UPDATE_WHEN_NEW_APP_INSTALLED);
aAddons.forEach(function(aAddon) {
// Ignore disabled themes
if (aAddon.type != "theme" || !aAddon.userDisabled) {
gAddons[aAddon.id] = {
addon: aAddon,
install: null,
wasActive: aAddon.isActive
}
}
aAddon.findUpdates(self, AddonManager.UPDATE_WHEN_NEW_APP_INSTALLED);
});
});
});
});
},

View File

@ -45,6 +45,7 @@ const PREF_XPINSTALL_ENABLED = "xpinstall.enabled";
Components.utils.import("resource://gre/modules/Services.jsm");
Components.utils.import("resource://gre/modules/AddonManager.jsm");
Components.utils.import("resource://gre/modules/AddonRepository.jsm");
var gUpdateWizard = {
// When synchronizing app compatibility info this contains all installed
@ -166,9 +167,17 @@ var gVersionInfoPage = {
gVersionInfoPage._totalCount = gUpdateWizard.addons.length;
gUpdateWizard.addons.forEach(function(aAddon) {
aAddon.findUpdates(gVersionInfoPage, AddonManager.UPDATE_WHEN_NEW_APP_INSTALLED);
}, this);
// Ensure compatibility overrides are up to date before checking for
// individual addon updates.
let ids = [addon.id for each (addon in gUpdateWizard.addons)];
AddonRepository.repopulateCache(ids, function() {
AddonManagerPrivate.updateAddonRepositoryData(function() {
gUpdateWizard.addons.forEach(function(aAddon) {
aAddon.findUpdates(gVersionInfoPage, AddonManager.UPDATE_WHEN_NEW_APP_INSTALLED);
}, this);
});
});
});
},

View File

@ -101,6 +101,7 @@ _TEST_FILES = \
browser_installssl.js \
browser_newaddon.js \
browser_select_selection.js \
browser_select_compatoverrides.js \
browser_select_confirm.js \
browser_select_update.js \
$(NULL)
@ -111,10 +112,12 @@ _TEST_RESOURCES = \
browser_bug557956.rdf \
browser_bug557956_8_2.xpi \
browser_bug557956_9_2.xpi \
browser_bug557956.xml \
browser_bug591465.xml \
browser_bug593535.xml \
browser_searching.xml \
browser_searching_empty.xml \
browser_select_compatoverrides.xml \
browser_updatessl.rdf \
browser_updatessl.rdf^headers^ \
browser_install.rdf \

View File

@ -0,0 +1,23 @@
<?xml version="1.0"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:em="http://www.mozilla.org/2004/em-rdf#">
<Description about="urn:mozilla:install-manifest">
<em:id>addon10@tests.mozilla.org</em:id>
<em:version>1.0</em:version>
<em:targetApplication>
<Description>
<em:id>toolkit@mozilla.org</em:id>
<em:minVersion>0</em:minVersion>
<em:maxVersion>0</em:maxVersion>
</Description>
</em:targetApplication>
<!-- Front End MetaData -->
<em:name>Addon10</em:name>
<em:bootstrap>true</em:bootstrap>
</Description>
</RDF>

View File

@ -0,0 +1,23 @@
<?xml version="1.0"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:em="http://www.mozilla.org/2004/em-rdf#">
<Description about="urn:mozilla:install-manifest">
<em:id>addon1@tests.mozilla.org</em:id>
<em:version>1.0</em:version>
<em:targetApplication>
<Description>
<em:id>toolkit@mozilla.org</em:id>
<em:minVersion>0</em:minVersion>
<em:maxVersion>0.1</em:maxVersion>
</Description>
</em:targetApplication>
<!-- Front End MetaData -->
<em:name>Addon1</em:name>
<em:bootstrap>true</em:bootstrap>
</Description>
</RDF>

View File

@ -7,6 +7,10 @@
const URI_EXTENSION_UPDATE_DIALOG = "chrome://mozapps/content/extensions/update.xul";
const PREF_GETADDONS_CACHE_ENABLED = "extensions.getAddons.cache.enabled";
const PREF_GETADDONS_BYIDS = "extensions.getAddons.get.url";
const PREF_MIN_PLATFORM_COMPAT = "extensions.minCompatiblePlatformVersion";
Services.prefs.setBoolPref(PREF_STRICT_COMPAT, true);
/**
@ -31,6 +35,10 @@ function test() {
run_next_test();
}
registerCleanupFunction(function() {
Services.prefs.clearUserPref(PREF_GETADDONS_CACHE_ENABLED);
});
function end_test() {
// Test generates a lot of available installs so just cancel them all
AddonManager.getAllInstalls(function(aInstalls) {
@ -56,7 +64,8 @@ function install_test_addons(aCallback) {
"browser_bug557956_6",
"browser_bug557956_7",
"browser_bug557956_8_1",
"browser_bug557956_9_1"].forEach(function(aName) {
"browser_bug557956_9_1",
"browser_bug557956_10"].forEach(function(aName) {
AddonManager.getInstallForURL(TESTROOT + "addons/" + aName + ".xpi", function(aInstall) {
installs.push(aInstall);
}, "application/x-xpinstall");
@ -91,7 +100,8 @@ function uninstall_test_addons(aCallback) {
"addon6@tests.mozilla.org",
"addon7@tests.mozilla.org",
"addon8@tests.mozilla.org",
"addon9@tests.mozilla.org"],
"addon9@tests.mozilla.org",
"addon10@tests.mozilla.org"],
function(aAddons) {
aAddons.forEach(function(aAddon) {
if (aAddon)
@ -172,7 +182,8 @@ add_test(function() {
var inactiveAddonIds = [
"addon2@tests.mozilla.org",
"addon4@tests.mozilla.org",
"addon5@tests.mozilla.org"
"addon5@tests.mozilla.org",
"addon10@tests.mozilla.org"
];
// Check that compatibility updates were applied.
@ -260,7 +271,8 @@ add_test(function() {
var inactiveAddonIds = [
"addon2@tests.mozilla.org",
"addon4@tests.mozilla.org",
"addon5@tests.mozilla.org"
"addon5@tests.mozilla.org",
"addon10@tests.mozilla.org"
];
Services.prefs.setBoolPref("xpinstall.enabled", false);
@ -343,7 +355,8 @@ add_test(function() {
"addon6@tests.mozilla.org",
"addon7@tests.mozilla.org",
"addon8@tests.mozilla.org",
"addon9@tests.mozilla.org"],
"addon9@tests.mozilla.org",
"addon10@tests.mozilla.org"],
function(aAddons) {
aAddons.forEach(function(aAddon) {
aAddon.userDisabled = true;
@ -359,7 +372,8 @@ add_test(function() {
"addon6@tests.mozilla.org",
"addon7@tests.mozilla.org",
"addon8@tests.mozilla.org",
"addon9@tests.mozilla.org"
"addon9@tests.mozilla.org",
"addon10@tests.mozilla.org"
];
open_compatibility_window(inactiveAddonIds, function(aWindow) {
@ -377,7 +391,8 @@ add_test(function() {
install_test_addons(function() {
AddonManager.getAddonsByIDs(["addon7@tests.mozilla.org",
"addon8@tests.mozilla.org",
"addon9@tests.mozilla.org"],
"addon9@tests.mozilla.org",
"addon10@tests.mozilla.org"],
function(aAddons) {
aAddons.forEach(function(aAddon) {
aAddon.uninstall();
@ -416,3 +431,63 @@ add_test(function() {
});
});
});
// Tests that compatibility overrides are retreived and affect addon
// compatibility.
add_test(function() {
Services.prefs.setBoolPref(PREF_STRICT_COMPAT, false);
Services.prefs.setCharPref(PREF_MIN_PLATFORM_COMPAT, "0");
is(AddonManager.strictCompatibility, false, "Strict compatibility should be disabled");
// Use a blank update URL
Services.prefs.setCharPref(PREF_UPDATEURL, TESTROOT + "missing.rdf");
install_test_addons(function() {
AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org",
"addon2@tests.mozilla.org",
"addon3@tests.mozilla.org",
"addon4@tests.mozilla.org",
"addon5@tests.mozilla.org",
"addon6@tests.mozilla.org",
"addon7@tests.mozilla.org",
"addon8@tests.mozilla.org",
"addon9@tests.mozilla.org",
"addon10@tests.mozilla.org"],
function(aAddons) {
aAddons.forEach(function(aAddon) {
if (aAddon.id == "addon10@tests.mozilla.org")
is(aAddon.isCompatible, true, "Addon10 should be compatible before compat overrides are refreshed");
else
aAddon.uninstall();
});
Services.prefs.setCharPref(PREF_GETADDONS_BYIDS, TESTROOT + "browser_bug557956.xml");
Services.prefs.setBoolPref(PREF_GETADDONS_CACHE_ENABLED, true);
open_compatibility_window([], function(aWindow) {
var doc = aWindow.document;
wait_for_page(aWindow, "mismatch", function(aWindow) {
var items = get_list_names(doc.getElementById("mismatch.incompatible"));
is(items.length, 1, "Should have seen 1 incompatible item");
is(items[0], "Addon10 1.0", "Should have seen addon10 as incompatible");
var button = doc.documentElement.getButton("next");
EventUtils.synthesizeMouse(button, 2, 2, { }, aWindow);
wait_for_page(aWindow, "noupdates", function(aWindow) {
var button = doc.documentElement.getButton("finish");
ok(!button.hidden, "Finish button should not be hidden");
ok(!button.disabled, "Finish button should not be disabled");
wait_for_window_close(aWindow, function() {
uninstall_test_addons(run_next_test);
});
EventUtils.synthesizeMouse(button, 2, 2, { }, aWindow);
});
});
});
});
});
});

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8" ?>
<searchresults total_results="1">
<addon_compatibility hosted="false">
<guid>addon10@tests.mozilla.org</guid>
<name>Addon10</name>
<version_ranges>
<version_range type="incompatible">
<min_version>1.0</min_version>
<max_version>2.0</max_version>
<compatible_applications>
<application>
<min_version>0.1</min_version>
<max_version>999.0</max_version>
<appID>toolkit@mozilla.org</appID>
</application>
</compatible_applications>
</version_range>
</version_ranges>
</addon_compatibility>
</searchresults>

View File

@ -0,0 +1,118 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/
*/
// Tests that compatibility overrides are refreshed when showing the addon
// selection UI.
const PREF_GETADDONS_CACHE_ENABLED = "extensions.getAddons.cache.enabled";
const PREF_GETADDONS_BYIDS = "extensions.getAddons.get.url";
const PREF_MIN_PLATFORM_COMPAT = "extensions.minCompatiblePlatformVersion";
var gTestAddon = null;
function waitForView(aView, aCallback) {
var view = gWin.document.getElementById(aView);
if (view.parentNode.selectedPanel == view) {
aCallback();
return;
}
view.addEventListener("ViewChanged", function() {
view.removeEventListener("ViewChanged", arguments.callee, false);
aCallback();
}, false);
}
function install_test_addon(aCallback) {
AddonManager.getInstallForURL(TESTROOT + "addons/browser_select_compatoverrides_1.xpi", function(aInstall) {
var listener = {
onInstallEnded: function() {
AddonManager.getAddonByID("addon1@tests.mozilla.org", function(addon) {
gTestAddon = addon;
aCallback();
});
}
};
aInstall.addListener(listener);
aInstall.install();
}, "application/x-xpinstall");
}
registerCleanupFunction(function() {
if (gWin)
gWin.close();
if (gTestAddon)
gTestAddon.uninstall();
Services.prefs.clearUserPref(PREF_GETADDONS_CACHE_ENABLED);
Services.prefs.clearUserPref(PREF_GETADDONS_BYIDS);
Services.prefs.clearUserPref(PREF_MIN_PLATFORM_COMPAT);
});
function end_test() {
finish();
}
function test() {
waitForExplicitFinish();
Services.prefs.setCharPref(PREF_UPDATEURL, TESTROOT + "missing.rdf");
Services.prefs.setBoolPref(PREF_STRICT_COMPAT, false);
Services.prefs.setCharPref(PREF_MIN_PLATFORM_COMPAT, "0");
install_test_addon(run_next_test);
}
add_test(function() {
gWin = Services.ww.openWindow(null,
"chrome://mozapps/content/extensions/selectAddons.xul",
"",
"chrome,centerscreen,dialog,titlebar",
null);
waitForFocus(function() {
waitForView("select", run_next_test);
}, gWin);
});
add_test(function() {
for (var row = gWin.document.getElementById("select-rows").firstChild; row; row = row.nextSibling) {
if (row.localName == "separator")
continue;
if (row.id.substr(-18) != "@tests.mozilla.org")
continue;
is(row.id, "addon1@tests.mozilla.org", "Should get expected addon");
isnot(row.action, "incompatible", "Addon should not be incompatible");
gWin.close();
gWin = null;
run_next_test();
}
});
add_test(function() {
Services.prefs.setCharPref(PREF_GETADDONS_BYIDS, TESTROOT + "browser_select_compatoverrides.xml");
Services.prefs.setBoolPref(PREF_GETADDONS_CACHE_ENABLED, true);
gWin = Services.ww.openWindow(null,
"chrome://mozapps/content/extensions/selectAddons.xul",
"",
"chrome,centerscreen,dialog,titlebar",
null);
waitForFocus(function() {
waitForView("select", run_next_test);
}, gWin);
});
add_test(function() {
for (var row = gWin.document.getElementById("select-rows").firstChild; row; row = row.nextSibling) {
if (row.localName == "separator")
continue;
if (row.id.substr(-18) != "@tests.mozilla.org")
continue;
is(row.id, "addon1@tests.mozilla.org", "Should get expected addon");
is(row.action, "incompatible", "Addon should be incompatible");
run_next_test();
}
});

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8" ?>
<searchresults total_results="1">
<addon_compatibility hosted="false">
<guid>addon1@tests.mozilla.org</guid>
<name>Addon1</name>
<version_ranges>
<version_range type="incompatible">
<min_version>1.0</min_version>
<max_version>2.0</max_version>
<compatible_applications>
<application>
<min_version>0.1</min_version>
<max_version>999.0</max_version>
<appID>toolkit@mozilla.org</appID>
</application>
</compatible_applications>
</version_range>
</version_ranges>
</addon_compatibility>
</searchresults>