diff --git a/toolkit/mozapps/extensions/AddonManager.jsm b/toolkit/mozapps/extensions/AddonManager.jsm index 6f81f3ae3830..95dfc8651865 100644 --- a/toolkit/mozapps/extensions/AddonManager.jsm +++ b/toolkit/mozapps/extensions/AddonManager.jsm @@ -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); diff --git a/toolkit/mozapps/extensions/content/selectAddons.js b/toolkit/mozapps/extensions/content/selectAddons.js index 508e0e080222..24e29dad0f08 100644 --- a/toolkit/mozapps/extensions/content/selectAddons.js +++ b/toolkit/mozapps/extensions/content/selectAddons.js @@ -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); + }); + }); }); }); }, diff --git a/toolkit/mozapps/extensions/content/update.js b/toolkit/mozapps/extensions/content/update.js index 0ae319507fe8..393548c53f5b 100644 --- a/toolkit/mozapps/extensions/content/update.js +++ b/toolkit/mozapps/extensions/content/update.js @@ -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); + }); + }); }); }, diff --git a/toolkit/mozapps/extensions/test/browser/Makefile.in b/toolkit/mozapps/extensions/test/browser/Makefile.in index 6c732b413316..e71d74741f8e 100644 --- a/toolkit/mozapps/extensions/test/browser/Makefile.in +++ b/toolkit/mozapps/extensions/test/browser/Makefile.in @@ -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 \ diff --git a/toolkit/mozapps/extensions/test/browser/addons/browser_bug557956_10/install.rdf b/toolkit/mozapps/extensions/test/browser/addons/browser_bug557956_10/install.rdf new file mode 100644 index 000000000000..95b6488dd4c6 --- /dev/null +++ b/toolkit/mozapps/extensions/test/browser/addons/browser_bug557956_10/install.rdf @@ -0,0 +1,23 @@ + + + + + + addon10@tests.mozilla.org + 1.0 + + + + toolkit@mozilla.org + 0 + 0 + + + + + Addon10 + true + + + diff --git a/toolkit/mozapps/extensions/test/browser/addons/browser_select_compatoverrides_1/install.rdf b/toolkit/mozapps/extensions/test/browser/addons/browser_select_compatoverrides_1/install.rdf new file mode 100644 index 000000000000..47a0e373ab7b --- /dev/null +++ b/toolkit/mozapps/extensions/test/browser/addons/browser_select_compatoverrides_1/install.rdf @@ -0,0 +1,23 @@ + + + + + + addon1@tests.mozilla.org + 1.0 + + + + toolkit@mozilla.org + 0 + 0.1 + + + + + Addon1 + true + + + diff --git a/toolkit/mozapps/extensions/test/browser/browser_bug557956.js b/toolkit/mozapps/extensions/test/browser/browser_bug557956.js index 4bc68982d2e2..e45ba75446fd 100644 --- a/toolkit/mozapps/extensions/test/browser/browser_bug557956.js +++ b/toolkit/mozapps/extensions/test/browser/browser_bug557956.js @@ -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); + }); + }); + }); + }); + }); +}); diff --git a/toolkit/mozapps/extensions/test/browser/browser_bug557956.xml b/toolkit/mozapps/extensions/test/browser/browser_bug557956.xml new file mode 100644 index 000000000000..6184e521467d --- /dev/null +++ b/toolkit/mozapps/extensions/test/browser/browser_bug557956.xml @@ -0,0 +1,20 @@ + + + + addon10@tests.mozilla.org + Addon10 + + + 1.0 + 2.0 + + + 0.1 + 999.0 + toolkit@mozilla.org + + + + + + diff --git a/toolkit/mozapps/extensions/test/browser/browser_select_compatoverrides.js b/toolkit/mozapps/extensions/test/browser/browser_select_compatoverrides.js new file mode 100644 index 000000000000..c9cd916f9b00 --- /dev/null +++ b/toolkit/mozapps/extensions/test/browser/browser_select_compatoverrides.js @@ -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(); + } +}); diff --git a/toolkit/mozapps/extensions/test/browser/browser_select_compatoverrides.xml b/toolkit/mozapps/extensions/test/browser/browser_select_compatoverrides.xml new file mode 100644 index 000000000000..76d00aa2c818 --- /dev/null +++ b/toolkit/mozapps/extensions/test/browser/browser_select_compatoverrides.xml @@ -0,0 +1,20 @@ + + + + addon1@tests.mozilla.org + Addon1 + + + 1.0 + 2.0 + + + 0.1 + 999.0 + toolkit@mozilla.org + + + + + +