From 4205a27fc753e013f7262b129b6e8d0d9dfb9f0a Mon Sep 17 00:00:00 2001 From: "rob_strong@exchangecode.com" Date: Wed, 5 Sep 2007 00:33:15 -0700 Subject: [PATCH] Bug 394717 - NS_ERROR_ILLEGAL_VALUE calling nsIExtensionManager.update when profile updates. patch=ajvincent, r=rstrong --- .../extensions/public/nsIExtensionManager.idl | 6 +- .../extensions/src/nsExtensionManager.js.in | 6 +- .../extensions/test/unit/test_bug394717.js | 82 +++++++++++++++++++ 3 files changed, 89 insertions(+), 5 deletions(-) create mode 100644 toolkit/mozapps/extensions/test/unit/test_bug394717.js diff --git a/toolkit/mozapps/extensions/public/nsIExtensionManager.idl b/toolkit/mozapps/extensions/public/nsIExtensionManager.idl index 6de6b65130a..7085d869a38 100644 --- a/toolkit/mozapps/extensions/public/nsIExtensionManager.idl +++ b/toolkit/mozapps/extensions/public/nsIExtensionManager.idl @@ -301,9 +301,11 @@ interface nsIExtensionManager : nsISupports * installed version and synchronize the values. * @param listener * An nsIAddonUpdateCheckListener object which will be notified during - * the update check process. + * the update check process. If not null, the object's + * onUpdateStarted() and onUpdateEnded() methods will be called even + * if there are no items to update. * - * @throws NS_ERROR_ILLEGAL_VALUE if any item is invalid, or if itemCount == 0. + * @throws NS_ERROR_ILLEGAL_VALUE if any item is invalid. */ void update([array, size_is(itemCount)] in nsIUpdateItem items, in unsigned long itemCount, diff --git a/toolkit/mozapps/extensions/src/nsExtensionManager.js.in b/toolkit/mozapps/extensions/src/nsExtensionManager.js.in index 4c9bfc5a390..eba7114b68c 100644 --- a/toolkit/mozapps/extensions/src/nsExtensionManager.js.in +++ b/toolkit/mozapps/extensions/src/nsExtensionManager.js.in @@ -5103,9 +5103,6 @@ ExtensionManager.prototype = { * See nsIExtensionManager.idl */ update: function(items, itemCount, updateCheckType, listener) { - if (itemCount == 0) - throw Cr.NS_ERROR_ILLEGAL_VALUE; - for (i = 0; i < itemCount; ++i) { var currItem = items[i]; if (!currItem) @@ -5850,6 +5847,9 @@ ExtensionItemUpdater.prototype = { this._listener.onAddonUpdateStarted(e); (new RDFItemUpdater(this)).checkForUpdates(e, aUpdateCheckType); } + + if (this._listener && aItemCount == 0) + this._listener.onUpdateEnded(); }, ///////////////////////////////////////////////////////////////////////////// diff --git a/toolkit/mozapps/extensions/test/unit/test_bug394717.js b/toolkit/mozapps/extensions/test/unit/test_bug394717.js new file mode 100644 index 00000000000..43138f46ee5 --- /dev/null +++ b/toolkit/mozapps/extensions/test/unit/test_bug394717.js @@ -0,0 +1,82 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Alexander J. Vincent . + * + * Portions created by the Initial Developer are Copyright (C) 2007 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL + * + * ***** END LICENSE BLOCK ***** + */ + +const checkListener = { + _onUpdateStartedCalled: false, + _onUpdateEndedCalled: false, + + // nsIAddonUpdateCheckListener + onUpdateStarted: function onUpdateStarted() { + this._onUpdateStartedCalled = true; + }, + + // nsIAddonUpdateCheckListener + onUpdateEnded: function onUpdateEnded() { + this._onUpdateEndedCalled = true; + }, + + // nsIAddonUpdateCheckListener + onAddonUpdateStarted: function onAddonUpdateStarted(aAddon) { + do_throw("Unexpected call to onAddonUpdateStarted!"); + }, + + // nsIAddonUpdateCheckListener + onAddonUpdateEnded: function onAddonUpdateEnded(aAddon, aStatus) { + do_throw("Unexpected call to onAddonUpdateEnded!"); + } +} + +/** + * Run the test. + */ +function run_test() { + createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "5", "1.9"); + startupEM(); + const Ci = Components.interfaces; + gEM.update([], 0, Ci.nsIExtensionManager.UPDATE_SYNC_COMPATIBILITY, checkListener); + do_test_pending(); + do_timeout(5000, "run_test_pt2()"); +} + +function run_test_pt2() { + dump("Checking onUpdateStarted\n"); + do_check_true(checkListener._onUpdateStartedCalled); + dump("Checking onUpdateEnded\n"); + do_check_true(checkListener._onUpdateEndedCalled); + do_test_finished(); +}