Backout new add-ons manager due to Ts regression on OSX 10.5
authorDave Townsend <dtownsend@oxymoronical.com>
Sat, 01 May 2010 11:04:44 -0700
changeset 41684 8a7a28c65fbd68f75f7dddc50d5d96840d26d9e8
parent 41683 7bdefbba3e0f0c7a50a111ac2f47ee4616883738
child 41685 1240ddeed985c7a9fdd52b0e9def0e6e9ba1e2a4
push idunknown
push userunknown
push dateunknown
milestone1.9.3a5pre
Backout new add-ons manager due to Ts regression on OSX 10.5
browser/app/profile/firefox.js
browser/base/content/browser.js
browser/base/content/pageinfo/pageInfo.css
browser/base/content/pageinfo/pageInfo.xml
browser/base/content/pageinfo/permissions.js
browser/base/content/test/browser_pluginnotification.js
browser/base/jar.mn
browser/components/preferences/main.js
browser/components/preferences/permissions.js
browser/fuel/src/fuelApplication.js
browser/fuel/test/Makefile.in
browser/fuel/test/browser_Extensions.js
browser/installer/package-manifest.in
browser/installer/removed-files.in
build/automation.py.in
config/autoconf.mk.in
configure.in
docshell/base/nsAboutRedirector.cpp
docshell/build/nsDocShellModule.cpp
modules/libpref/src/Makefile.in
modules/libpref/src/init/all.js
netwerk/confvars.sh
toolkit/components/exthelper/extApplication.js
toolkit/components/exthelper/extIApplication.idl
toolkit/components/startup/public/nsIAppStartup.idl
toolkit/components/startup/src/nsAppStartup.cpp
toolkit/components/startup/src/nsAppStartup.h
toolkit/content/aboutSupport.js
toolkit/library/libxul-config.mk
toolkit/library/nsStaticXULComponents.cpp
toolkit/locales/en-US/chrome/mozapps/extensions/extensions.dtd
toolkit/locales/en-US/chrome/mozapps/extensions/extensions.properties
toolkit/mozapps/extensions/AddonLogging.jsm
toolkit/mozapps/extensions/AddonManager.jsm
toolkit/mozapps/extensions/AddonUpdateChecker.jsm
toolkit/mozapps/extensions/LightweightThemeManager.jsm
toolkit/mozapps/extensions/Makefile.in
toolkit/mozapps/extensions/PluginProvider.jsm
toolkit/mozapps/extensions/XPIProvider.jsm
toolkit/mozapps/extensions/addonManager.js
toolkit/mozapps/extensions/amContentHandler.js
toolkit/mozapps/extensions/amIInstallTrigger.idl
toolkit/mozapps/extensions/amIWebInstallListener.idl
toolkit/mozapps/extensions/amIWebInstaller.idl
toolkit/mozapps/extensions/amInstallTrigger.cpp
toolkit/mozapps/extensions/amInstallTrigger.h
toolkit/mozapps/extensions/amWebInstallListener.js
toolkit/mozapps/extensions/content/about.js
toolkit/mozapps/extensions/content/extensions.css
toolkit/mozapps/extensions/content/extensions.js
toolkit/mozapps/extensions/content/extensions.xml
toolkit/mozapps/extensions/content/extensions.xul
toolkit/mozapps/extensions/jar.mn
toolkit/mozapps/extensions/nsAddonRepository.js
toolkit/mozapps/extensions/nsBlocklistService.js
toolkit/mozapps/extensions/nsExtensionManager.js
toolkit/mozapps/extensions/nsIAddonRepository.idl
toolkit/mozapps/extensions/nsIExtensionManager.idl
toolkit/mozapps/extensions/test/Makefile.in
toolkit/mozapps/extensions/test/addons/test_bootstrap1_1/bootstrap.js
toolkit/mozapps/extensions/test/addons/test_bootstrap1_1/install.rdf
toolkit/mozapps/extensions/test/addons/test_bootstrap1_2/bootstrap.js
toolkit/mozapps/extensions/test/addons/test_bootstrap1_2/install.rdf
toolkit/mozapps/extensions/test/addons/test_bug257155/install.rdf
toolkit/mozapps/extensions/test/addons/test_bug371495/install.rdf
toolkit/mozapps/extensions/test/addons/test_bug378216_1/install.rdf
toolkit/mozapps/extensions/test/addons/test_bug378216_10/install.rdf
toolkit/mozapps/extensions/test/addons/test_bug378216_11/install.rdf
toolkit/mozapps/extensions/test/addons/test_bug378216_12/install.rdf
toolkit/mozapps/extensions/test/addons/test_bug378216_13/install.rdf
toolkit/mozapps/extensions/test/addons/test_bug378216_2/install.rdf
toolkit/mozapps/extensions/test/addons/test_bug378216_3/install.rdf
toolkit/mozapps/extensions/test/addons/test_bug378216_4/install.rdf
toolkit/mozapps/extensions/test/addons/test_bug378216_5/install.rdf
toolkit/mozapps/extensions/test/addons/test_bug378216_6/install.rdf
toolkit/mozapps/extensions/test/addons/test_bug378216_7/install.rdf
toolkit/mozapps/extensions/test/addons/test_bug378216_8/install.rdf
toolkit/mozapps/extensions/test/addons/test_bug378216_9/install.rdf
toolkit/mozapps/extensions/test/addons/test_bug392180/install.rdf
toolkit/mozapps/extensions/test/addons/test_bug396129_a_1/install.rdf
toolkit/mozapps/extensions/test/addons/test_bug396129_a_2/install.rdf
toolkit/mozapps/extensions/test/addons/test_bug396129_b_1/install.rdf
toolkit/mozapps/extensions/test/addons/test_bug396129_b_2/install.rdf
toolkit/mozapps/extensions/test/addons/test_bug396129_c_1/install.rdf
toolkit/mozapps/extensions/test/addons/test_bug396129_c_2/install.rdf
toolkit/mozapps/extensions/test/addons/test_bug396129_d_1/install.rdf
toolkit/mozapps/extensions/test/addons/test_bug396129_d_2/install.rdf
toolkit/mozapps/extensions/test/addons/test_bug428341_1/README
toolkit/mozapps/extensions/test/addons/test_bug428341_2/install.rdf
toolkit/mozapps/extensions/test/addons/test_bug428341_3/install.rdf
toolkit/mozapps/extensions/test/addons/test_bug428341_4/install.rdf
toolkit/mozapps/extensions/test/addons/test_bug428341_5/install.rdf
toolkit/mozapps/extensions/test/addons/test_bug428341_6/install.rdf
toolkit/mozapps/extensions/test/addons/test_bug428341_7/install.rdf
toolkit/mozapps/extensions/test/addons/test_bug428341_8/install.rdf
toolkit/mozapps/extensions/test/addons/test_bug428341_9/install.rdf
toolkit/mozapps/extensions/test/addons/test_bug436207/install.js
toolkit/mozapps/extensions/test/addons/test_install1/install.rdf
toolkit/mozapps/extensions/test/addons/test_install2_1/install.rdf
toolkit/mozapps/extensions/test/addons/test_install2_2/install.rdf
toolkit/mozapps/extensions/test/addons/test_install3/install.rdf
toolkit/mozapps/extensions/test/addons/test_locale/install.rdf
toolkit/mozapps/extensions/test/addons/test_theme/install.rdf
toolkit/mozapps/extensions/test/addons/test_update/install.rdf
toolkit/mozapps/extensions/test/addons/test_update8/install.rdf
toolkit/mozapps/extensions/test/browser/Makefile.in
toolkit/mozapps/extensions/test/browser/browser_bug510909.js
toolkit/mozapps/extensions/test/browser/browser_installssl.js
toolkit/mozapps/extensions/test/browser/browser_installssl.xpi
toolkit/mozapps/extensions/test/browser/browser_updatessl.js
toolkit/mozapps/extensions/test/browser/browser_updatessl.rdf
toolkit/mozapps/extensions/test/browser/head.js
toolkit/mozapps/extensions/test/browser/redirect.sjs
toolkit/mozapps/extensions/test/bug435743.rdf
toolkit/mozapps/extensions/test/bug435743.sjs
toolkit/mozapps/extensions/test/bug435743.xpi
toolkit/mozapps/extensions/test/test_bug435743_1.xul
toolkit/mozapps/extensions/test/test_bug435743_2.xul
toolkit/mozapps/extensions/test/unit/data/bug455906_block.xml
toolkit/mozapps/extensions/test/unit/data/bug455906_empty.xml
toolkit/mozapps/extensions/test/unit/data/bug455906_start.xml
toolkit/mozapps/extensions/test/unit/data/bug455906_warn.xml
toolkit/mozapps/extensions/test/unit/data/cert8.db
toolkit/mozapps/extensions/test/unit/data/key3.db
toolkit/mozapps/extensions/test/unit/data/secmod.db
toolkit/mozapps/extensions/test/unit/data/signed-no-cn.xpi
toolkit/mozapps/extensions/test/unit/data/signed-no-o.xpi
toolkit/mozapps/extensions/test/unit/data/signed-tampered.xpi
toolkit/mozapps/extensions/test/unit/data/signed-untrusted.xpi
toolkit/mozapps/extensions/test/unit/data/signed.xpi
toolkit/mozapps/extensions/test/unit/data/test_bug299716.rdf
toolkit/mozapps/extensions/test/unit/data/test_bug299716_2.rdf
toolkit/mozapps/extensions/test/unit/data/test_bug324121.rdf
toolkit/mozapps/extensions/test/unit/data/test_bug378216.rdf
toolkit/mozapps/extensions/test/unit/data/test_bug393285.xml
toolkit/mozapps/extensions/test/unit/data/test_bug394300.rdf
toolkit/mozapps/extensions/test/unit/data/test_bug396129.rdf
toolkit/mozapps/extensions/test/unit/data/test_bug404024.xml
toolkit/mozapps/extensions/test/unit/data/test_bug417606.xml
toolkit/mozapps/extensions/test/unit/data/test_bug424107_1.rdf
toolkit/mozapps/extensions/test/unit/data/test_bug424107_2.rdf
toolkit/mozapps/extensions/test/unit/data/test_bug424262.xml
toolkit/mozapps/extensions/test/unit/data/test_bug449027_app.xml
toolkit/mozapps/extensions/test/unit/data/test_bug449027_toolkit.xml
toolkit/mozapps/extensions/test/unit/data/test_bug468528.xml
toolkit/mozapps/extensions/test/unit/data/test_bug470377/install_1.rdf
toolkit/mozapps/extensions/test/unit/data/test_bug470377/install_2.rdf
toolkit/mozapps/extensions/test/unit/data/test_bug470377/install_3.rdf
toolkit/mozapps/extensions/test/unit/data/test_bug470377/install_4.rdf
toolkit/mozapps/extensions/test/unit/data/test_bug470377/install_5.rdf
toolkit/mozapps/extensions/test/unit/data/test_bug470377/update_1.rdf
toolkit/mozapps/extensions/test/unit/data/test_bug470377/update_2.rdf
toolkit/mozapps/extensions/test/unit/data/test_bug470377/update_3.rdf
toolkit/mozapps/extensions/test/unit/data/test_bug470377/update_4.rdf
toolkit/mozapps/extensions/test/unit/data/test_bug470377/update_5.rdf
toolkit/mozapps/extensions/test/unit/data/test_bug486195/install.rdf
toolkit/mozapps/extensions/test/unit/data/test_bug514327_1.xml
toolkit/mozapps/extensions/test/unit/data/test_bug514327_2.xml
toolkit/mozapps/extensions/test/unit/data/test_bug514327_3_empty.xml
toolkit/mozapps/extensions/test/unit/data/test_bug514327_3_outdated_1.xml
toolkit/mozapps/extensions/test/unit/data/test_bug514327_3_outdated_2.xml
toolkit/mozapps/extensions/test/unit/data/test_bug526598_1.xpi
toolkit/mozapps/extensions/test/unit/data/test_bug526598_2.xpi
toolkit/mozapps/extensions/test/unit/data/test_bug541420.xpi
toolkit/mozapps/extensions/test/unit/data/unsigned.xpi
toolkit/mozapps/extensions/test/unit/test_LightweightThemeManager.js
toolkit/mozapps/extensions/test/unit/test_bug257155.js
toolkit/mozapps/extensions/test/unit/test_bug299716.js
toolkit/mozapps/extensions/test/unit/test_bug299716_2.js
toolkit/mozapps/extensions/test/unit/test_bug324121.js
toolkit/mozapps/extensions/test/unit/test_bug335238.js
toolkit/mozapps/extensions/test/unit/test_bug371495.js
toolkit/mozapps/extensions/test/unit/test_bug378216.js
toolkit/mozapps/extensions/test/unit/test_bug384052.js
toolkit/mozapps/extensions/test/unit/test_bug386153.js
toolkit/mozapps/extensions/test/unit/test_bug391899.js
toolkit/mozapps/extensions/test/unit/test_bug392180.js
toolkit/mozapps/extensions/test/unit/test_bug393285.js
toolkit/mozapps/extensions/test/unit/test_bug394300.js
toolkit/mozapps/extensions/test/unit/test_bug394717.js
toolkit/mozapps/extensions/test/unit/test_bug396129.js
toolkit/mozapps/extensions/test/unit/test_bug397778.js
toolkit/mozapps/extensions/test/unit/test_bug404024.js
toolkit/mozapps/extensions/test/unit/test_bug406118.js
toolkit/mozapps/extensions/test/unit/test_bug417606.js
toolkit/mozapps/extensions/test/unit/test_bug424107.js
toolkit/mozapps/extensions/test/unit/test_bug424262.js
toolkit/mozapps/extensions/test/unit/test_bug425657.js
toolkit/mozapps/extensions/test/unit/test_bug428341.js
toolkit/mozapps/extensions/test/unit/test_bug430120.js
toolkit/mozapps/extensions/test/unit/test_bug436207.js
toolkit/mozapps/extensions/test/unit/test_bug449027.js
toolkit/mozapps/extensions/test/unit/test_bug455906.js
toolkit/mozapps/extensions/test/unit/test_bug465190.js
toolkit/mozapps/extensions/test/unit/test_bug468528.js
toolkit/mozapps/extensions/test/unit/test_bug470377_1.js
toolkit/mozapps/extensions/test/unit/test_bug470377_2.js
toolkit/mozapps/extensions/test/unit/test_bug470377_3.js
toolkit/mozapps/extensions/test/unit/test_bug470377_4.js
toolkit/mozapps/extensions/test/unit/test_bug474988.js
toolkit/mozapps/extensions/test/unit/test_bug486195.js
toolkit/mozapps/extensions/test/unit/test_bug509194.js
toolkit/mozapps/extensions/test/unit/test_bug514327_1.js
toolkit/mozapps/extensions/test/unit/test_bug514327_2.js
toolkit/mozapps/extensions/test/unit/test_bug514327_3.js
toolkit/mozapps/extensions/test/unit/test_bug521905.js
toolkit/mozapps/extensions/test/unit/test_bug526598.js
toolkit/mozapps/extensions/test/unit/test_bug541420.js
toolkit/mozapps/extensions/test/xpcshell/data/bug455906_block.xml
toolkit/mozapps/extensions/test/xpcshell/data/bug455906_empty.xml
toolkit/mozapps/extensions/test/xpcshell/data/bug455906_start.xml
toolkit/mozapps/extensions/test/xpcshell/data/bug455906_warn.xml
toolkit/mozapps/extensions/test/xpcshell/data/test_bug299716.rdf
toolkit/mozapps/extensions/test/xpcshell/data/test_bug299716_2.rdf
toolkit/mozapps/extensions/test/xpcshell/data/test_bug324121.rdf
toolkit/mozapps/extensions/test/xpcshell/data/test_bug393285.xml
toolkit/mozapps/extensions/test/xpcshell/data/test_bug394300.rdf
toolkit/mozapps/extensions/test/xpcshell/data/test_bug404024.xml
toolkit/mozapps/extensions/test/xpcshell/data/test_bug417606.xml
toolkit/mozapps/extensions/test/xpcshell/data/test_bug424262.xml
toolkit/mozapps/extensions/test/xpcshell/data/test_bug449027_app.xml
toolkit/mozapps/extensions/test/xpcshell/data/test_bug449027_toolkit.xml
toolkit/mozapps/extensions/test/xpcshell/data/test_bug468528.xml
toolkit/mozapps/extensions/test/xpcshell/data/test_bug470377/install_1.rdf
toolkit/mozapps/extensions/test/xpcshell/data/test_bug470377/install_2.rdf
toolkit/mozapps/extensions/test/xpcshell/data/test_bug470377/install_3.rdf
toolkit/mozapps/extensions/test/xpcshell/data/test_bug470377/install_4.rdf
toolkit/mozapps/extensions/test/xpcshell/data/test_bug470377/install_5.rdf
toolkit/mozapps/extensions/test/xpcshell/data/test_bug470377/update_1.rdf
toolkit/mozapps/extensions/test/xpcshell/data/test_bug470377/update_2.rdf
toolkit/mozapps/extensions/test/xpcshell/data/test_bug470377/update_3.rdf
toolkit/mozapps/extensions/test/xpcshell/data/test_bug470377/update_4.rdf
toolkit/mozapps/extensions/test/xpcshell/data/test_bug470377/update_5.rdf
toolkit/mozapps/extensions/test/xpcshell/data/test_bug514327_1.xml
toolkit/mozapps/extensions/test/xpcshell/data/test_bug514327_2.xml
toolkit/mozapps/extensions/test/xpcshell/data/test_bug514327_3_empty.xml
toolkit/mozapps/extensions/test/xpcshell/data/test_bug514327_3_outdated_1.xml
toolkit/mozapps/extensions/test/xpcshell/data/test_bug514327_3_outdated_2.xml
toolkit/mozapps/extensions/test/xpcshell/data/test_bug526598_1.xpi
toolkit/mozapps/extensions/test/xpcshell/data/test_bug526598_2.xpi
toolkit/mozapps/extensions/test/xpcshell/data/test_bug541420.xpi
toolkit/mozapps/extensions/test/xpcshell/data/test_install.rdf
toolkit/mozapps/extensions/test/xpcshell/data/test_migrate.rdf
toolkit/mozapps/extensions/test/xpcshell/data/test_update.rdf
toolkit/mozapps/extensions/test/xpcshell/data/test_updatecheck.rdf
toolkit/mozapps/extensions/test/xpcshell/head_addons.js
toolkit/mozapps/extensions/test/xpcshell/test_LightweightThemeManager.js
toolkit/mozapps/extensions/test/xpcshell/test_bootstrap.js
toolkit/mozapps/extensions/test/xpcshell/test_bug299716.js
toolkit/mozapps/extensions/test/xpcshell/test_bug299716_2.js
toolkit/mozapps/extensions/test/xpcshell/test_bug324121.js
toolkit/mozapps/extensions/test/xpcshell/test_bug335238.js
toolkit/mozapps/extensions/test/xpcshell/test_bug371495.js
toolkit/mozapps/extensions/test/xpcshell/test_bug384052.js
toolkit/mozapps/extensions/test/xpcshell/test_bug393285.js
toolkit/mozapps/extensions/test/xpcshell/test_bug394300.js
toolkit/mozapps/extensions/test/xpcshell/test_bug397778.js
toolkit/mozapps/extensions/test/xpcshell/test_bug404024.js
toolkit/mozapps/extensions/test/xpcshell/test_bug406118.js
toolkit/mozapps/extensions/test/xpcshell/test_bug417606.js
toolkit/mozapps/extensions/test/xpcshell/test_bug424262.js
toolkit/mozapps/extensions/test/xpcshell/test_bug425657.js
toolkit/mozapps/extensions/test/xpcshell/test_bug430120.js
toolkit/mozapps/extensions/test/xpcshell/test_bug449027.js
toolkit/mozapps/extensions/test/xpcshell/test_bug455906.js
toolkit/mozapps/extensions/test/xpcshell/test_bug465190.js
toolkit/mozapps/extensions/test/xpcshell/test_bug468528.js
toolkit/mozapps/extensions/test/xpcshell/test_bug470377_1.js
toolkit/mozapps/extensions/test/xpcshell/test_bug470377_2.js
toolkit/mozapps/extensions/test/xpcshell/test_bug470377_3.js
toolkit/mozapps/extensions/test/xpcshell/test_bug470377_4.js
toolkit/mozapps/extensions/test/xpcshell/test_bug514327_1.js
toolkit/mozapps/extensions/test/xpcshell/test_bug514327_2.js
toolkit/mozapps/extensions/test/xpcshell/test_bug514327_3.js
toolkit/mozapps/extensions/test/xpcshell/test_bug521905.js
toolkit/mozapps/extensions/test/xpcshell/test_bug526598.js
toolkit/mozapps/extensions/test/xpcshell/test_bug541420.js
toolkit/mozapps/extensions/test/xpcshell/test_bug559800.js
toolkit/mozapps/extensions/test/xpcshell/test_checkcompatibility.js
toolkit/mozapps/extensions/test/xpcshell/test_disable.js
toolkit/mozapps/extensions/test/xpcshell/test_fuel.js
toolkit/mozapps/extensions/test/xpcshell/test_general.js
toolkit/mozapps/extensions/test/xpcshell/test_install.js
toolkit/mozapps/extensions/test/xpcshell/test_locale.js
toolkit/mozapps/extensions/test/xpcshell/test_manifest.js
toolkit/mozapps/extensions/test/xpcshell/test_migrate1.js
toolkit/mozapps/extensions/test/xpcshell/test_migrate2.js
toolkit/mozapps/extensions/test/xpcshell/test_permissions.js
toolkit/mozapps/extensions/test/xpcshell/test_plugins.js
toolkit/mozapps/extensions/test/xpcshell/test_registry.js
toolkit/mozapps/extensions/test/xpcshell/test_startup.js
toolkit/mozapps/extensions/test/xpcshell/test_theme.js
toolkit/mozapps/extensions/test/xpcshell/test_uninstall.js
toolkit/mozapps/extensions/test/xpcshell/test_update.js
toolkit/mozapps/extensions/test/xpcshell/test_updatecheck.js
toolkit/mozapps/extensions/test/xpcshell/test_upgrade.js
toolkit/mozapps/extensions/test/xpinstall/Makefile.in
toolkit/mozapps/extensions/test/xpinstall/authRedirect.sjs
toolkit/mozapps/extensions/test/xpinstall/browser_auth.js
toolkit/mozapps/extensions/test/xpinstall/browser_auth2.js
toolkit/mozapps/extensions/test/xpinstall/browser_auth3.js
toolkit/mozapps/extensions/test/xpinstall/browser_badhash.js
toolkit/mozapps/extensions/test/xpinstall/browser_badhashtype.js
toolkit/mozapps/extensions/test/xpinstall/browser_bug540558.js
toolkit/mozapps/extensions/test/xpinstall/browser_cookies.js
toolkit/mozapps/extensions/test/xpinstall/browser_cookies2.js
toolkit/mozapps/extensions/test/xpinstall/browser_cookies3.js
toolkit/mozapps/extensions/test/xpinstall/browser_cookies4.js
toolkit/mozapps/extensions/test/xpinstall/browser_corrupt.js
toolkit/mozapps/extensions/test/xpinstall/browser_empty.js
toolkit/mozapps/extensions/test/xpinstall/browser_enabled.js
toolkit/mozapps/extensions/test/xpinstall/browser_enabled2.js
toolkit/mozapps/extensions/test/xpinstall/browser_enabled3.js
toolkit/mozapps/extensions/test/xpinstall/browser_hash.js
toolkit/mozapps/extensions/test/xpinstall/browser_installchrome.js
toolkit/mozapps/extensions/test/xpinstall/browser_localfile.js
toolkit/mozapps/extensions/test/xpinstall/browser_localfile2.js
toolkit/mozapps/extensions/test/xpinstall/browser_navigateaway.js
toolkit/mozapps/extensions/test/xpinstall/browser_navigateaway2.js
toolkit/mozapps/extensions/test/xpinstall/browser_offline.js
toolkit/mozapps/extensions/test/xpinstall/browser_signed_multiple.js
toolkit/mozapps/extensions/test/xpinstall/browser_signed_naming.js
toolkit/mozapps/extensions/test/xpinstall/browser_signed_tampered.js
toolkit/mozapps/extensions/test/xpinstall/browser_signed_trigger.js
toolkit/mozapps/extensions/test/xpinstall/browser_signed_untrusted.js
toolkit/mozapps/extensions/test/xpinstall/browser_signed_url.js
toolkit/mozapps/extensions/test/xpinstall/browser_softwareupdate.js
toolkit/mozapps/extensions/test/xpinstall/browser_unsigned_trigger.js
toolkit/mozapps/extensions/test/xpinstall/browser_unsigned_url.js
toolkit/mozapps/extensions/test/xpinstall/browser_whitelist.js
toolkit/mozapps/extensions/test/xpinstall/browser_whitelist2.js
toolkit/mozapps/extensions/test/xpinstall/browser_whitelist3.js
toolkit/mozapps/extensions/test/xpinstall/browser_whitelist4.js
toolkit/mozapps/extensions/test/xpinstall/browser_whitelist5.js
toolkit/mozapps/extensions/test/xpinstall/browser_whitelist6.js
toolkit/mozapps/extensions/test/xpinstall/bug540558.html
toolkit/mozapps/extensions/test/xpinstall/cookieRedirect.sjs
toolkit/mozapps/extensions/test/xpinstall/corrupt.xpi
toolkit/mozapps/extensions/test/xpinstall/empty.xpi
toolkit/mozapps/extensions/test/xpinstall/enabled.html
toolkit/mozapps/extensions/test/xpinstall/head.js
toolkit/mozapps/extensions/test/xpinstall/installchrome.html
toolkit/mozapps/extensions/test/xpinstall/installtrigger.html
toolkit/mozapps/extensions/test/xpinstall/signed-no-cn.xpi
toolkit/mozapps/extensions/test/xpinstall/signed-no-o.xpi
toolkit/mozapps/extensions/test/xpinstall/signed-tampered.xpi
toolkit/mozapps/extensions/test/xpinstall/signed-untrusted.xpi
toolkit/mozapps/extensions/test/xpinstall/signed.xpi
toolkit/mozapps/extensions/test/xpinstall/signed2.xpi
toolkit/mozapps/extensions/test/xpinstall/startsoftwareupdate.html
toolkit/mozapps/extensions/test/xpinstall/unsigned.xpi
toolkit/mozapps/plugins/content/pluginInstallerService.js
toolkit/mozapps/plugins/tests/browser_bug435788.js
toolkit/mozapps/update/content/updates.js
toolkit/mozapps/update/nsUpdateService.js
toolkit/mozapps/xpinstall/content/xpinstallConfirm.js
toolkit/themes/gnomestripe/mozapps/extensions/category-discover.png
toolkit/themes/gnomestripe/mozapps/extensions/category-extensions.png
toolkit/themes/gnomestripe/mozapps/extensions/category-languages.png
toolkit/themes/gnomestripe/mozapps/extensions/category-plugins.png
toolkit/themes/gnomestripe/mozapps/extensions/category-search.png
toolkit/themes/gnomestripe/mozapps/extensions/category-searchengines.png
toolkit/themes/gnomestripe/mozapps/extensions/category-themes.png
toolkit/themes/gnomestripe/mozapps/extensions/extensionIcons.png
toolkit/themes/gnomestripe/mozapps/extensions/extensions.css
toolkit/themes/gnomestripe/mozapps/extensions/go-back.png
toolkit/themes/gnomestripe/mozapps/extensions/notifyBadges.png
toolkit/themes/gnomestripe/mozapps/extensions/rating-not-won.png
toolkit/themes/gnomestripe/mozapps/extensions/rating-unrated.png
toolkit/themes/gnomestripe/mozapps/extensions/rating-won.png
toolkit/themes/gnomestripe/mozapps/extensions/ratings.png
toolkit/themes/gnomestripe/mozapps/extensions/viewButtons.png
toolkit/themes/gnomestripe/mozapps/jar.mn
toolkit/themes/pinstripe/mozapps/extensions/category-discover.png
toolkit/themes/pinstripe/mozapps/extensions/category-extensions.png
toolkit/themes/pinstripe/mozapps/extensions/category-languages.png
toolkit/themes/pinstripe/mozapps/extensions/category-plugins.png
toolkit/themes/pinstripe/mozapps/extensions/category-search.png
toolkit/themes/pinstripe/mozapps/extensions/category-searchengines.png
toolkit/themes/pinstripe/mozapps/extensions/category-themes.png
toolkit/themes/pinstripe/mozapps/extensions/extensionIcons.png
toolkit/themes/pinstripe/mozapps/extensions/extensionItem.png
toolkit/themes/pinstripe/mozapps/extensions/extensions.css
toolkit/themes/pinstripe/mozapps/extensions/go-back.png
toolkit/themes/pinstripe/mozapps/extensions/itemDisabledFader.png
toolkit/themes/pinstripe/mozapps/extensions/itemEnabledFader.png
toolkit/themes/pinstripe/mozapps/extensions/notifyBadges.png
toolkit/themes/pinstripe/mozapps/extensions/question.png
toolkit/themes/pinstripe/mozapps/extensions/rating-not-won.png
toolkit/themes/pinstripe/mozapps/extensions/rating-unrated.png
toolkit/themes/pinstripe/mozapps/extensions/rating-won.png
toolkit/themes/pinstripe/mozapps/extensions/ratings.png
toolkit/themes/pinstripe/mozapps/extensions/viewButtons.png
toolkit/themes/pinstripe/mozapps/jar.mn
toolkit/themes/winstripe/mozapps/extensions/category-discover.png
toolkit/themes/winstripe/mozapps/extensions/category-extensions.png
toolkit/themes/winstripe/mozapps/extensions/category-languages.png
toolkit/themes/winstripe/mozapps/extensions/category-plugins.png
toolkit/themes/winstripe/mozapps/extensions/category-search.png
toolkit/themes/winstripe/mozapps/extensions/category-searchengines.png
toolkit/themes/winstripe/mozapps/extensions/category-themes.png
toolkit/themes/winstripe/mozapps/extensions/extensionIcons-aero.png
toolkit/themes/winstripe/mozapps/extensions/extensionIcons.png
toolkit/themes/winstripe/mozapps/extensions/extensions.css
toolkit/themes/winstripe/mozapps/extensions/go-back.png
toolkit/themes/winstripe/mozapps/extensions/itemDisabledFader.png
toolkit/themes/winstripe/mozapps/extensions/itemEnabledFader.png
toolkit/themes/winstripe/mozapps/extensions/notifyBadges-aero.png
toolkit/themes/winstripe/mozapps/extensions/notifyBadges.png
toolkit/themes/winstripe/mozapps/extensions/question-aero.png
toolkit/themes/winstripe/mozapps/extensions/question.png
toolkit/themes/winstripe/mozapps/extensions/rating-not-won.png
toolkit/themes/winstripe/mozapps/extensions/rating-unrated.png
toolkit/themes/winstripe/mozapps/extensions/rating-won.png
toolkit/themes/winstripe/mozapps/extensions/ratings-aero.png
toolkit/themes/winstripe/mozapps/extensions/ratings.png
toolkit/themes/winstripe/mozapps/extensions/viewButtons-aero.png
toolkit/themes/winstripe/mozapps/extensions/viewButtons.png
toolkit/themes/winstripe/mozapps/jar.mn
toolkit/toolkit-makefiles.sh
toolkit/toolkit-tiers.mk
toolkit/xre/nsAppRunner.cpp
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -47,22 +47,40 @@
 #define UNIX_BUT_NOT_MAC
 #endif
 #endif
 
 pref("general.startup.browser", true);
 
 pref("browser.chromeURL","chrome://browser/content/");
 pref("browser.hiddenWindowChromeURL", "chrome://browser/content/hiddenWindow.xul");
+pref("xpinstall.dialog.confirm", "chrome://mozapps/content/xpinstall/xpinstallConfirm.xul");
+pref("xpinstall.dialog.progress.skin", "chrome://mozapps/content/extensions/extensions.xul");
+pref("xpinstall.dialog.progress.chrome", "chrome://mozapps/content/extensions/extensions.xul");
+pref("xpinstall.dialog.progress.type.skin", "Extension:Manager");
+pref("xpinstall.dialog.progress.type.chrome", "Extension:Manager");
 
+// Developers can set this to |true| if they are constantly changing files in their 
+// extensions directory so that the extension system does not constantly think that
+// their extensions are being updated and thus reregistered every time the app is
+// started.
+pref("extensions.ignoreMTimeChanges", false);
 // Enables some extra Extension System Logging (can reduce performance)
 pref("extensions.logging.enabled", false);
+// Hides the install button in the add-ons mgr
+pref("extensions.hideInstallButton", true);
 
-// Preferences for AMO integration
-pref("extensions.webservice.discoverURL", "https://services.addons.mozilla.org/%LOCALE%/%APP%/discovery");
+// Preferences for the Get Add-ons pane
+pref("extensions.getAddons.showPane", true);
+pref("extensions.getAddons.browseAddons", "https://addons.mozilla.org/%LOCALE%/%APP%");
+pref("extensions.getAddons.maxResults", 5);
+pref("extensions.getAddons.recommended.browseURL", "https://addons.mozilla.org/%LOCALE%/%APP%/recommended");
+pref("extensions.getAddons.recommended.url", "https://services.addons.mozilla.org/%LOCALE%/%APP%/api/%API_VERSION%/list/featured/all/10/%OS%/%VERSION%");
+pref("extensions.getAddons.search.browseURL", "https://addons.mozilla.org/%LOCALE%/%APP%/search?q=%TERMS%");
+pref("extensions.getAddons.search.url", "https://services.addons.mozilla.org/%LOCALE%/%APP%/api/%API_VERSION%/search/%TERMS%/all/10/%OS%/%VERSION%");
 
 // Blocklist preferences
 pref("extensions.blocklist.enabled", true);
 pref("extensions.blocklist.interval", 86400);
 // Controls what level the blocklist switches from warning about items to forcibly
 // blocking them.
 pref("extensions.blocklist.level", 2);
 pref("extensions.blocklist.url", "https://addons.mozilla.org/blocklist/3/%APP_ID%/%APP_VERSION%/%PRODUCT%/%BUILD_ID%/%BUILD_TARGET%/%LOCALE%/%CHANNEL%/%OS_VERSION%/%DISTRIBUTION%/%DISTRIBUTION_VERSION%/");
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -592,34 +592,28 @@ const gXPInstallObserver = {
     }
     return null;
   },
 
   observe: function (aSubject, aTopic, aData)
   {
     var brandBundle = document.getElementById("bundle_brand");
     switch (aTopic) {
-    case "addon-install-blocked":
-      var installInfo = aSubject.QueryInterface(Components.interfaces.amIWebInstallInfo);
+    case "xpinstall-install-blocked":
+      var installInfo = aSubject.QueryInterface(Components.interfaces.nsIXPIInstallInfo);
       var win = installInfo.originatingWindow;
       var shell = win.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                      .getInterface(Components.interfaces.nsIWebNavigation)
                      .QueryInterface(Components.interfaces.nsIDocShell);
       var browser = this._getBrowser(shell);
       if (browser) {
         var host = installInfo.originatingURI.host;
         var brandShortName = brandBundle.getString("brandShortName");
         var notificationName, messageString, buttons;
-        var enabled = true;
-        try {
-          enabled = gPrefService.getBoolPref("xpinstall.enabled");
-        }
-        catch (e) {
-        }
-        if (!enabled) {
+        if (!gPrefService.getBoolPref("xpinstall.enabled")) {
           notificationName = "xpinstall-disabled"
           if (gPrefService.prefIsLocked("xpinstall.enabled")) {
             messageString = gNavigatorBundle.getString("xpinstallDisabledMessageLocked");
             buttons = [];
           }
           else {
             messageString = gNavigatorBundle.getFormattedString("xpinstallDisabledMessage",
                                                                 [brandShortName, host]);
@@ -640,17 +634,19 @@ const gXPInstallObserver = {
           messageString = gNavigatorBundle.getFormattedString("xpinstallPromptWarning",
                                                               [brandShortName, host]);
 
           buttons = [{
             label: gNavigatorBundle.getString("xpinstallPromptAllowButton"),
             accessKey: gNavigatorBundle.getString("xpinstallPromptAllowButton.accesskey"),
             popup: null,
             callback: function() {
-              installInfo.install();
+              var mgr = Components.classes["@mozilla.org/xpinstall/install-manager;1"]
+                                  .createInstance(Components.interfaces.nsIXPInstallManager);
+              mgr.initManagerWithInstallInfo(installInfo);
               return false;
             }
           }];
         }
 
         var notificationBox = gBrowser.getNotificationBox(browser);
         if (!notificationBox.getNotificationWithValue(notificationName)) {
           const priority = notificationBox.PRIORITY_WARNING_MEDIUM;
@@ -1182,17 +1178,17 @@ function prepareForStartup() {
                             OfflineApps, false);
 
   // setup simple gestures support
   gGestureSupport.init(true);
 }
 
 function delayedStartup(isLoadingBlank, mustLoadSidebar) {
   Services.obs.addObserver(gSessionHistoryObserver, "browser:purge-session-history", false);
-  Services.obs.addObserver(gXPInstallObserver, "addon-install-blocked", false);
+  Services.obs.addObserver(gXPInstallObserver, "xpinstall-install-blocked", false);
 
   BrowserOffline.init();
   OfflineApps.init();
 
   gBrowser.addEventListener("pageshow", function(evt) { setTimeout(pageShowEventHandlers, 0, evt); }, true);
 
   // Ensure login manager is up and running.
   Cc["@mozilla.org/login-manager;1"].getService(Ci.nsILoginManager);
@@ -1400,17 +1396,17 @@ function BrowserShutdown()
   try {
     FullZoom.destroy();
   }
   catch(ex) {
     Components.utils.reportError(ex);
   }
 
   Services.obs.removeObserver(gSessionHistoryObserver, "browser:purge-session-history");
-  Services.obs.removeObserver(gXPInstallObserver, "addon-install-blocked");
+  Services.obs.removeObserver(gXPInstallObserver, "xpinstall-install-blocked");
   Services.obs.removeObserver(gPluginHandler.pluginCrashed, "plugin-crashed");
 
   try {
     gBrowser.removeProgressListener(window.XULBrowserWindow);
     gBrowser.removeTabsProgressListener(window.TabsProgressListener);
   } catch (ex) {
   }
 
@@ -5718,18 +5714,31 @@ var MailIntegration = {
        Cc["@mozilla.org/uriloader/external-protocol-service;1"]
          .getService(Ci.nsIExternalProtocolService);
     if (extProtocolSvc)
       extProtocolSvc.loadUrl(aURL);
   }
 };
 
 function BrowserOpenAddonsMgr(aPane) {
-  // TODO need to implement switching to the relevant view - see bug 560449
-  switchToTabHavingURI("about:addons", true);
+  const EMTYPE = "Extension:Manager";
+  var theEM = Services.wm.getMostRecentWindow(EMTYPE);
+  if (theEM) {
+    theEM.focus();
+    if (aPane)
+      theEM.showView(aPane);
+    return;
+  }
+
+  const EMURL = "chrome://mozapps/content/extensions/extensions.xul";
+  const EMFEATURES = "chrome,menubar,extra-chrome,toolbar,dialog=no,resizable";
+  if (aPane)
+    window.openDialog(EMURL, "", EMFEATURES, aPane);
+  else
+    window.openDialog(EMURL, "", EMFEATURES);
 }
 
 function AddKeywordForSearchField() {
   var node = document.popupNode;
 
   var charset = node.ownerDocument.characterSet;
 
   var docURI = makeURI(node.ownerDocument.URL,
@@ -7502,38 +7511,44 @@ var LightWeightThemeWebInstaller = {
     gBrowser.tabContainer.removeEventListener("TabSelect", this, false);
 
     this._manager.resetPreview();
   },
 
   _isAllowed: function (node) {
     var pm = Services.perms;
 
+    var prefs = [["xpinstall.whitelist.add", pm.ALLOW_ACTION],
+                 ["xpinstall.whitelist.add.36", pm.ALLOW_ACTION],
+                 ["xpinstall.blacklist.add", pm.DENY_ACTION]];
+    prefs.forEach(function ([pref, permission]) {
+      try {
+        var hosts = gPrefService.getCharPref(pref);
+      } catch (e) {}
+
+      if (hosts) {
+        hosts.split(",").forEach(function (host) {
+          pm.add(makeURI("http://" + host), "install", permission);
+        });
+
+        gPrefService.setCharPref(pref, "");
+      }
+    });
+
     var uri = node.ownerDocument.documentURIObject;
     return pm.testPermission(uri, "install") == pm.ALLOW_ACTION;
   },
 
   _getThemeFromNode: function (node) {
     return this._manager.parseTheme(node.getAttribute("data-browsertheme"),
                                     node.baseURI);
   }
 }
 
-/**
- * Switch to a tab that has a given URI, and focusses its browser window.
- * If a matching tab is in this window, it will be switched to. Otherwise, other
- * windows will be searched.
- *
- * @param aURI
- *        URI to search for
- * @param aOpenNew
- *        True to open a new tab and switch to it, if no existing tab is found
- * @return True if a tab was switched to (or opened), false otherwise
- */
-function switchToTabHavingURI(aURI, aOpenNew) {
+function switchToTabHavingURI(aURI) {
   function switchIfURIInWindow(aWindow) {
     if (!("gBrowser" in aWindow))
       return false;
     let browsers = aWindow.gBrowser.browsers;
     for (let i = 0; i < browsers.length; i++) {
       let browser = browsers[i];
       if (browser.currentURI.equals(aURI)) {
         gURLBar.handleRevert();
@@ -7558,23 +7573,17 @@ function switchToTabHavingURI(aURI, aOpe
     let browserWin = winEnum.getNext();
     // Skip closed (but not yet destroyed) windows,
     // and the current window (which was checked earlier).
     if (browserWin.closed || browserWin == window)
       continue;
     if (switchIfURIInWindow(browserWin))
       return true;
   }
-
   // No opened tab has that url.
-  if (aOpenNew) {
-    gBrowser.selectedTab = gBrowser.addTab(aURI.spec);
-    return true;
-  }
-
   return false;
 }
 
 var TabContextMenu = {
   contextTab: null,
   updateContextMenu: function updateContextMenu(aPopupMenu) {
     this.contextTab = document.popupNode.localName == "tab" ?
                       document.popupNode : gBrowser.selectedTab;
--- a/browser/base/content/pageinfo/pageInfo.css
+++ b/browser/base/content/pageinfo/pageInfo.css
@@ -1,11 +1,11 @@
 
 #viewGroup > radio {
-  -moz-binding: url("chrome://browser/content/pageinfo/pageInfo.xml#viewbutton");
+  -moz-binding: url("chrome://mozapps/content/extensions/extensions.xml#viewbutton");
 }
 
 richlistitem[feed] {
   -moz-binding: url("chrome://browser/content/pageinfo/feeds.xml#feed");
 }
 
 richlistitem[feed]:not([selected="true"]) .feed-subscribe {
   display: none;
deleted file mode 100644
--- a/browser/base/content/pageinfo/pageInfo.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0"?>
-
-<bindings id="pageInfoBindings"
-          xmlns="http://www.mozilla.org/xbl"
-          xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
-          xmlns:xbl="http://www.mozilla.org/xbl">
-
-  <!-- based on preferences.xml paneButton -->
-  <binding id="viewbutton" extends="chrome://global/content/bindings/radio.xml#radio">
-    <content>
-      <xul:image class="viewButtonIcon" xbl:inherits="src"/>
-      <xul:label class="viewButtonLabel" xbl:inherits="value=label"/>
-    </content>
-    <implementation implements="nsIAccessibleProvider">
-      <property name="accessibleType" readonly="true">
-        <getter>
-          <![CDATA[
-            return Components.interfaces.nsIAccessibleProvider.XULListitem;
-          ]]>
-        </getter>
-      </property>
-    </implementation>
-  </binding>
-
-</bindings>
--- a/browser/base/content/pageinfo/permissions.js
+++ b/browser/base/content/pageinfo/permissions.js
@@ -58,23 +58,19 @@ var gPermObj = {
   popup: function getPopupDefaultPermission()
   {
     if (gPrefs.getBoolPref("dom.disable_open_during_load"))
       return BLOCK;
     return ALLOW;
   },
   install: function getInstallDefaultPermission()
   {
-    try {
-      if (!gPrefs.getBoolPref("xpinstall.whitelist.required"))
-        return ALLOW;
-    }
-    catch (e) {
-    }
-    return BLOCK;
+    if (gPrefs.getBoolPref("xpinstall.whitelist.required"))
+      return BLOCK;
+    return ALLOW;
   },
   geo: function getGeoDefaultPermissions()
   {
       return BLOCK;
   }
 };
 
 var permissionObserver = {
--- a/browser/base/content/test/browser_pluginnotification.js
+++ b/browser/base/content/test/browser_pluginnotification.js
@@ -1,67 +1,76 @@
 const gTestRoot = "chrome://mochikit/content/browser/browser/base/content/test/";
 
 var gTestBrowser = null;
 var gNextTest = null;
 
 function get_test_plugin() {
   var ph = Cc["@mozilla.org/plugin/host;1"].getService(Ci.nsIPluginHost);
   var tags = ph.getPluginTags();
-
+  
   // Find the test plugin
   for (var i = 0; i < tags.length; i++) {
     if (tags[i].name == "Test Plug-in")
       return tags[i];
   }
 }
 
-// This listens for the next opened tab and checks it is of the right url.
-// opencallback is called when the new tab is fully loaded
-// closecallback is called when the tab is closed
-function TabOpenListener(url, opencallback, closecallback) {
+// This listens for the next opened window and checks it is of the right url.
+// opencallback is called when the new window is fully loaded
+// closecallback is called when the window is closed
+function WindowOpenListener(url, opencallback, closecallback) {
   this.url = url;
   this.opencallback = opencallback;
   this.closecallback = closecallback;
 
-  gBrowser.tabContainer.addEventListener("TabOpen", this, false);
+  Services.wm.addListener(this);
 }
 
-TabOpenListener.prototype = {
+WindowOpenListener.prototype = {
   url: null,
   opencallback: null,
   closecallback: null,
-  tab: null,
-  browser: null,
+  window: null,
+  domwindow: null,
 
   handleEvent: function(event) {
-    if (event.type == "TabOpen") {
-      gBrowser.tabContainer.removeEventListener("TabOpen", this, false);
-      this.tab = event.originalTarget;
-      this.browser = this.tab.linkedBrowser;
-      gBrowser.addEventListener("load", this, true);
-    } else if (event.type == "load") {
-      gBrowser.removeEventListener("load", this, true);
-      this.tab.addEventListener("TabClose", this, false);
-      var url = this.browser.contentDocument.location.href;
-      is(url, this.url, "Should have opened the correct tab");
-      // Allow any other load handlers to execute
-      var self = this;
-      executeSoon(function() { self.opencallback(self.tab, self.browser.contentWindow); } );
-    } else if (event.type == "TabClose") {
-      if (event.originalTarget != this.tab)
-        return;
-      this.tab.removeEventListener("TabClose", this, false);
-      this.opencallback = null;
-      this.tab = null;
-      this.browser = null;
-      // Let the window close complete
-      executeSoon(this.closecallback);
-      this.closecallback = null;
-    }
+    is(this.domwindow.document.location.href, this.url, "Should have opened the correct window");
+
+    this.domwindow.removeEventListener("load", this, false);
+    // Allow any other load handlers to execute
+    var self = this;
+    executeSoon(function() { self.opencallback(self.domwindow); } );
+  },
+
+  onWindowTitleChange: function(window, title) {
+  },
+
+  onOpenWindow: function(window) {
+    if (this.window)
+      return;
+
+    this.window = window;
+    this.domwindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
+                           .getInterface(Components.interfaces.nsIDOMWindowInternal);
+    this.domwindow.addEventListener("load", this, false);
+  },
+
+  onCloseWindow: function(window) {
+    if (this.window != window)
+      return;
+
+    Services.wm.removeListener(this);
+    this.opencallback = null;
+    this.window = null;
+    this.domwindow = null;
+
+    // Let the window close complete
+    executeSoon(this.closecallback);
+    this.closecallback = null;
   }
 };
 
 function test() {
   waitForExplicitFinish();
 
   var newTab = gBrowser.addTab();
   gBrowser.selectedTab = newTab;
@@ -119,25 +128,25 @@ function test2() {
 
 // Tests a page with a disabled plugin in it.
 function test3() {
   var notificationBox = gBrowser.getNotificationBox(gTestBrowser);
   ok(!notificationBox.getNotificationWithValue("missing-plugins"), "Test 3, Should not have displayed the missing plugin notification");
   ok(!notificationBox.getNotificationWithValue("blocked-plugins"), "Test 3, Should not have displayed the blocked plugin notification");
   ok(!gTestBrowser.missingPlugins, "Test 3, Should not be a missing plugin list");
 
-  new TabOpenListener("about:addons", test4, prepareTest5);
+  new WindowOpenListener("chrome://mozapps/content/extensions/extensions.xul", test4, prepareTest5);
 
   EventUtils.synthesizeMouse(gTestBrowser.contentDocument.getElementById("test"),
                              0, 0, {}, gTestBrowser.contentWindow);
 }
 
-function test4(tab, win) {
-  todo_is(win.gView, "plugins", "Should have displayed the plugins pane");
-  gBrowser.removeTab(tab);
+function test4(win) {
+  is(win.gView, "plugins", "Should have displayed the plugins pane");
+  win.close();
 }
 
 function prepareTest5() {
   var plugin = get_test_plugin();
   plugin.disabled = false;
   plugin.blocklisted = true;
   prepareTest(test5, gTestRoot + "plugin_test.html");
 }
--- a/browser/base/jar.mn
+++ b/browser/base/jar.mn
@@ -22,17 +22,16 @@ browser.jar:
 *       content/browser/browser.js                    (content/browser.js)
 *       content/browser/browser.xul                   (content/browser.xul)
 *       content/browser/browser-tabPreviews.xml       (content/browser-tabPreviews.xml)
 *       content/browser/credits.xhtml                 (content/credits.xhtml)
 *       content/browser/fullscreen-video.xhtml        (content/fullscreen-video.xhtml)
 *       content/browser/pageinfo/pageInfo.xul         (content/pageinfo/pageInfo.xul)
 *       content/browser/pageinfo/pageInfo.js          (content/pageinfo/pageInfo.js)
 *       content/browser/pageinfo/pageInfo.css         (content/pageinfo/pageInfo.css)
-*       content/browser/pageinfo/pageInfo.xml         (content/pageinfo/pageInfo.xml)
 *       content/browser/pageinfo/feeds.js             (content/pageinfo/feeds.js)
 *       content/browser/pageinfo/feeds.xml            (content/pageinfo/feeds.xml)
 *       content/browser/pageinfo/permissions.js       (content/pageinfo/permissions.js)
 *       content/browser/pageinfo/security.js          (content/pageinfo/security.js)
 *       content/browser/openLocation.js               (content/openLocation.js)
 *       content/browser/openLocation.xul              (content/openLocation.xul)
 *       content/browser/pageReportFirstTime.xul       (content/pageReportFirstTime.xul)
 *       content/browser/safeMode.js                   (content/safeMode.js)
--- a/browser/components/preferences/main.js
+++ b/browser/components/preferences/main.js
@@ -456,11 +456,23 @@ var gMainPane = {
     }
   },
 
   /**
    * Displays the Add-ons Manager.
    */
   showAddonsMgr: function ()
   {
-    openUILinkIn("about:addons", "window");
+    const EMTYPE = "Extension:Manager";
+    var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
+                       .getService(Components.interfaces.nsIWindowMediator);
+    var theEM = wm.getMostRecentWindow(EMTYPE);
+    if (theEM) {
+      theEM.focus();
+      theEM.showView("extensions");
+      return;
+    }
+
+    const EMURL = "chrome://mozapps/content/extensions/extensions.xul";
+    const EMFEATURES = "chrome,menubar,extra-chrome,toolbar,dialog=no,resizable";
+    window.openDialog(EMURL, "", EMFEATURES, "extensions");
   }
 };
--- a/browser/components/preferences/permissions.js
+++ b/browser/components/preferences/permissions.js
@@ -203,16 +203,22 @@ var gPermissionManager = {
 
     var urlLabel = document.getElementById("urlLabel");
     urlLabel.hidden = !urlFieldVisible;
 
     var os = Components.classes["@mozilla.org/observer-service;1"]
                        .getService(Components.interfaces.nsIObserverService);
     os.addObserver(this, "perm-changed", false);
 
+    if (this._type == "install") {
+      var enumerator = this._pm.enumerator;
+      if (!enumerator.hasMoreElements())
+        this._updatePermissions();
+    }
+
     this._loadPermissions();
     
     urlField.focus();
 
     this._ltrAtom = Components.classes["@mozilla.org/atom-service;1"]
                               .getService(Components.interfaces.nsIAtomService)
                               .getAtom("ltr");
   },
@@ -352,16 +358,53 @@ var gPermissionManager = {
                              (host.charAt(0) == ".") ? host.substring(1,host.length) : host,
                              aPermission.type,
                              capabilityString, 
                              aPermission.capability);
       this._permissions.push(p);
     }  
   },
   
+  _updatePermissions: function ()
+  {
+    try {
+      var ioService = Components.classes["@mozilla.org/network/io-service;1"]
+                                .getService(Components.interfaces.nsIIOService);
+      var pbi = Components.classes["@mozilla.org/preferences-service;1"]
+                          .getService(Components.interfaces.nsIPrefBranch2);
+      var prefList = [["xpinstall.whitelist.add", nsIPermissionManager.ALLOW_ACTION],
+                      ["xpinstall.whitelist.add.36", nsIPermissionManager.ALLOW_ACTION],
+                      ["xpinstall.blacklist.add", nsIPermissionManager.DENY_ACTION]];
+
+      for (var i = 0; i < prefList.length; ++i) {
+        try {
+          // this pref is a comma-delimited list of hosts
+          var hosts = pbi.getCharPref(prefList[i][0]);
+        } catch(ex) {
+          continue;
+        }
+
+        if (!hosts)
+          continue;
+
+        hostList = hosts.split(",");
+        var capability = prefList[i][1];
+        for (var j = 0; j < hostList.length; ++j) {
+          // trim leading and trailing spaces
+          var host = hostList[j].replace(/^\s*/,"").replace(/\s*$/,"");
+          try {
+            var uri = ioService.newURI("http://" + host, null, null);
+            this._pm.add(uri, this._type, capability);
+          } catch(ex) { }
+        }
+        pbi.setCharPref(prefList[i][0], "");
+      }
+    } catch(ex) { }
+  },
+  
   setHost: function (aHost)
   {
     document.getElementById("url").value = aHost;
   }
 };
 
 function setHost(aHost)
 {
--- a/browser/fuel/src/fuelApplication.js
+++ b/browser/fuel/src/fuelApplication.js
@@ -652,16 +652,17 @@ var ApplicationFactory = {
       gSingleton = new Application();
     }
 
     return gSingleton.QueryInterface(aIID);
   }
 };
 
 
+
 //=================================================
 // Application constructor
 function Application() {
   this.initToolkitHelpers();
   this._bookmarks = null;
 }
 
 //=================================================
--- a/browser/fuel/test/Makefile.in
+++ b/browser/fuel/test/Makefile.in
@@ -45,15 +45,16 @@ include $(DEPTH)/config/autoconf.mk
 include $(topsrcdir)/config/rules.mk
 
 _BROWSER_FILES =browser_Application.js \
 		browser_ApplicationPrefs.js \
 		browser_ApplicationStorage.js \
 		browser_ApplicationQuitting.js \
 		browser_Bookmarks.js \
 		browser_Browser.js \
+		browser_Extensions.js \
 		ContentA.html \
 		ContentB.html \
 		ContentWithFrames.html \
 		$(NULL)
 
 libs::	$(_BROWSER_FILES)
 	$(INSTALL) $(foreach f,$^,"$f") $(DEPTH)/_tests/testing/mochitest/browser/$(relativesrcdir)
new file mode 100644
--- /dev/null
+++ b/browser/fuel/test/browser_Extensions.js
@@ -0,0 +1,126 @@
+// The various pieces that we'll be testing
+var testdata = {
+  dummyid: "fuel-dummy-extension@mozilla.org",
+  dummyname: "Dummy Extension",
+  inspectorid: "inspector@mozilla.org",
+  inspectorname: "DOM Inspector",
+  missing: "fuel.fuel-test-missing",
+  dummy: "fuel.fuel-test"
+};
+var gLastEvent = "";
+
+function test() {
+  // test to see if the extensions object is available
+  ok(Application.extensions, "Check for the 'Extensions' object");
+
+  // test to see if a non-existant extension exists
+  ok(!Application.extensions.has(testdata.dummyid), "Check non-existant extension for existence");
+
+  // BUG 420028: Must find a way to add a dummy extension for test suite
+  return;
+
+  // test to see if an extension exists
+  ok(Application.extensions.has(testdata.inspectorid), "Check extension for existence");
+
+  var inspector = Application.extensions.get(testdata.inspectorid);
+  is(inspector.id, testdata.inspectorid, "Check 'Extension.id' for known extension");
+  is(inspector.name, testdata.inspectorname, "Check 'Extension.name' for known extension");
+  // The known version number changes too frequently to hardcode in
+  ok(inspector.version, "Check 'Extension.version' for known extension");
+  ok(inspector.firstRun, "Check 'Extension.firstRun' for known extension");
+  ok(inspector.enabled, "Check 'Extension.enabled' for known extension");
+
+  // test to see if extension find works
+  is(Application.extensions.all.length, 1, "Check a find for all extensions");
+  // STORAGE TESTING
+  // Make sure the we are given the same extension (cached) so things like .storage work right
+  inspector.storage.set("test", "simple check");
+  ok(inspector.storage.has("test"), "Checking that extension storage worked");
+
+  var inspector2 = Application.extensions.get(testdata.inspectorid);
+  is(inspector2.id, testdata.inspectorid, "Check 'Extension.id' for known extension - from cache");
+  ok(inspector.storage.has("test"), "Checking that extension storage worked - from cache");
+  is(inspector2.storage.get("test", "cache"), inspector.storage.get("test", "original"), "Checking that the storage of same extension is correct - from cache");
+
+  inspector.events.addListener("disable", onGenericEvent);
+  inspector.events.addListener("enable", onGenericEvent);
+  inspector.events.addListener("uninstall", onGenericEvent);
+  inspector.events.addListener("cancel", onGenericEvent);
+
+  var extmgr = Components.classes["@mozilla.org/extensions/manager;1"]
+                         .getService(Components.interfaces.nsIExtensionManager);
+
+  extmgr.disableItem(testdata.inspectorid);
+  is(gLastEvent, "disable", "Checking that disable event is fired");
+
+  // enabling after a disable will only fire a 'cancel' event
+  // see - http://mxr.mozilla.org/seamonkey/source/toolkit/mozapps/extensions/src/nsExtensionManager.js.in#5216
+  extmgr.enableItem(testdata.inspectorid);
+  is(gLastEvent, "cancel", "Checking that enable (cancel) event is fired");
+
+  extmgr.uninstallItem(testdata.inspectorid);
+  is(gLastEvent, "uninstall", "Checking that uninstall event is fired");
+
+  extmgr.cancelUninstallItem(testdata.inspectorid);
+  is(gLastEvent, "cancel", "Checking that cancel event is fired");
+
+  // PREF TESTING
+  // Reset the install event preference, so that we can test it again later
+  inspector.prefs.get("install-event-fired").reset();
+
+  // test the value of the preference root
+  is(Application.extensions.all[0].prefs.root, "extensions.inspector@mozilla.org.", "Check an extension preference root");
+
+  // test getting non-existing values
+  var itemValue = inspector.prefs.getValue(testdata.missing, "default");
+  is(itemValue, "default", "Check 'Extension.prefs.getValue' for non-existing item");
+
+  is(inspector.prefs.get(testdata.missing), null, "Check 'Extension.prefs.get' for non-existing item");
+
+  // test setting and getting a value
+  inspector.prefs.setValue(testdata.dummy, "dummy");
+  itemValue = inspector.prefs.getValue(testdata.dummy, "default");
+  is(itemValue, "dummy", "Check 'Extension.prefs.getValue' for existing item");
+
+  // test for overwriting an existing value
+  inspector.prefs.setValue(testdata.dummy, "smarty");
+  itemValue = inspector.prefs.getValue(testdata.dummy, "default");
+  is(itemValue, "smarty", "Check 'Extension.prefs.getValue' for overwritten item");
+
+  // test setting and getting a value
+  inspector.prefs.get(testdata.dummy).value = "dummy2";
+  itemValue = inspector.prefs.get(testdata.dummy).value;
+  is(itemValue, "dummy2", "Check 'Extension.prefs.get().value' for existing item");
+
+  // test resetting a pref [since there is no default value, the pref should disappear]
+  inspector.prefs.get(testdata.dummy).reset();
+  var itemValue = inspector.prefs.getValue(testdata.dummy, "default");
+  is(itemValue, "default", "Check 'Extension.prefs.getValue' for reset pref");
+
+  // test to see if a non-existant property exists
+  ok(!inspector.prefs.has(testdata.dummy), "Check non-existant property for existence");
+
+  waitForExplicitFinish();
+  inspector.prefs.events.addListener("change", onPrefChange);
+  inspector.prefs.setValue("fuel.fuel-test", "change event");
+}
+
+function onGenericEvent(event) {
+  gLastEvent = event.type;
+}
+
+function onPrefChange(evt) {
+  var inspector3 = Application.extensions.get(testdata.inspectorid);
+
+  is(evt.data, testdata.dummy, "Check 'Extension.prefs.set' fired a change event");
+  inspector3.prefs.events.removeListener("change", onPrefChange);
+
+  inspector3.prefs.get("fuel.fuel-test").events.addListener("change", onPrefChange2);
+  inspector3.prefs.setValue("fuel.fuel-test", "change event2");
+}
+
+function onPrefChange2(evt) {
+  is(evt.data, testdata.dummy, "Check 'Extension.prefs.set' fired a change event for a single preference");
+
+  finish();
+}
--- a/browser/installer/package-manifest.in
+++ b/browser/installer/package-manifest.in
@@ -252,16 +252,17 @@
 @BINPATH@/components/xpcom_base.xpt
 @BINPATH@/components/xpcom_system.xpt
 @BINPATH@/components/xpcom_components.xpt
 @BINPATH@/components/xpcom_ds.xpt
 @BINPATH@/components/xpcom_io.xpt
 @BINPATH@/components/xpcom_threads.xpt
 @BINPATH@/components/xpcom_xpti.xpt
 @BINPATH@/components/xpconnect.xpt
+@BINPATH@/components/xpinstall.xpt
 @BINPATH@/components/xulapp.xpt
 @BINPATH@/components/xuldoc.xpt
 @BINPATH@/components/xultmpl.xpt
 @BINPATH@/components/zipwriter.xpt
 
 ; JavaScript components
 @BINPATH@/components/FeedProcessor.js
 @BINPATH@/components/FeedConverter.js
@@ -289,19 +290,17 @@
 @BINPATH@/components/nsFilePicker.js
 #endif
 @BINPATH@/components/nsHelperAppDlg.js
 @BINPATH@/components/nsDownloadManagerUI.js
 @BINPATH@/components/nsProxyAutoConfig.js
 @BINPATH@/components/NetworkGeolocationProvider.js
 @BINPATH@/components/GPSDGeolocationProvider.js
 @BINPATH@/components/nsSidebar.js
-@BINPATH@/components/addonManager.js
-@BINPATH@/components/amContentHandler.js
-@BINPATH@/components/amWebInstallListener.js
+@BINPATH@/components/nsExtensionManager.js
 @BINPATH@/components/nsBlocklistService.js
 #ifdef MOZ_UPDATER
 @BINPATH@/components/nsUpdateService.js
 @BINPATH@/components/nsUpdateServiceStub.js
 #endif
 @BINPATH@/components/nsUpdateTimerManager.js
 @BINPATH@/components/pluginGlue.js
 @BINPATH@/components/nsSessionStartup.js
--- a/browser/installer/removed-files.in
+++ b/browser/installer/removed-files.in
@@ -74,17 +74,16 @@ components/@DLL_PREFIX@browserdirprovide
 components/@DLL_PREFIX@brwsrdir@DLL_SUFFIX@
 components/@DLL_PREFIX@myspell@DLL_SUFFIX@
 components/@DLL_PREFIX@spellchecker@DLL_SUFFIX@
 components/@DLL_PREFIX@spellchk@DLL_SUFFIX@
 components/xpti.dat
 components/xptitemp.dat
 components/nsBackgroundUpdateService.js
 components/nsCloseAllWindows.js
-components/nsExtensionManager.js
 #ifndef XP_MACOSX
 components/autocomplete.xpt
 #endif
 @DLL_PREFIX@zlib@DLL_SUFFIX@
 #Remove Talkback files from old location (in case user updates from 1.0.x)
 components/BrandRes.dll
 components/fullsoft.dll
 components/master.ini
--- a/build/automation.py.in
+++ b/build/automation.py.in
@@ -307,17 +307,16 @@ user_pref("browser.EULA.override", true)
 user_pref("javascript.options.jit.content", true);
 user_pref("gfx.color_management.force_srgb", true);
 user_pref("network.manage-offline-status", false);
 user_pref("test.mousescroll", true);
 user_pref("security.default_personal_cert", "Select Automatically"); // Need to client auth test be w/o any dialogs
 user_pref("network.http.prompt-temp-redirect", false);
 user_pref("media.cache_size", 100);
 user_pref("security.warn_viewing_mixed", false);
-user_pref("extensions.enabledScopes", 3);
 
 user_pref("geo.wifi.uri", "http://%(server)s/tests/dom/tests/mochitest/geolocation/network_geolocation.sjs");
 user_pref("geo.wifi.testing", true);
 
 user_pref("camino.warn_when_closing", false); // Camino-only, harmless to others
 
 // Make url-classifier updates so rare that they won't affect tests
 user_pref("urlclassifier.updateinterval", 172800);
--- a/config/autoconf.mk.in
+++ b/config/autoconf.mk.in
@@ -121,16 +121,17 @@ MOZ_MAIL_NEWS	= @MOZ_MAIL_NEWS@
 MOZ_PLAINTEXT_EDITOR_ONLY = @MOZ_PLAINTEXT_EDITOR_ONLY@
 BUILD_STATIC_LIBS = @BUILD_STATIC_LIBS@
 MOZ_ENABLE_LIBXUL = @MOZ_ENABLE_LIBXUL@
 ENABLE_TESTS	= @ENABLE_TESTS@
 IBMBIDI = @IBMBIDI@
 MOZ_UNIVERSALCHARDET = @MOZ_UNIVERSALCHARDET@
 ACCESSIBILITY = @ACCESSIBILITY@
 MOZ_VIEW_SOURCE = @MOZ_VIEW_SOURCE@
+MOZ_XPINSTALL = @MOZ_XPINSTALL@
 MOZ_JSLOADER  = @MOZ_JSLOADER@
 MOZ_USE_NATIVE_UCONV = @MOZ_USE_NATIVE_UCONV@
 MOZ_BRANDING_DIRECTORY = @MOZ_BRANDING_DIRECTORY@
 XPCOM_USE_LEA = @XPCOM_USE_LEA@
 MOZ_ENABLE_POSTSCRIPT = @MOZ_ENABLE_POSTSCRIPT@
 MOZ_INSTALLER	= @MOZ_INSTALLER@
 MOZ_UPDATER	= @MOZ_UPDATER@
 MOZ_UPDATE_PACKAGING	= @MOZ_UPDATE_PACKAGING@
--- a/configure.in
+++ b/configure.in
@@ -4917,16 +4917,17 @@ MOZ_STORAGE=1
 MOZ_SVG=1
 MOZ_TIMELINE=
 MOZ_TOOLKIT_SEARCH=1
 MOZ_UI_LOCALE=en-US
 MOZ_UNIVERSALCHARDET=1
 MOZ_URL_CLASSIFIER=
 MOZ_USE_NATIVE_UCONV=
 MOZ_VIEW_SOURCE=1
+MOZ_XPINSTALL=1
 MOZ_XSLT_STANDALONE=
 MOZ_XTF=1
 MOZ_XUL=1
 MOZ_ZIPWRITER=1
 NS_PRINTING=1
 NECKO_WIFI=1
 NECKO_COOKIES=1
 NECKO_DISK_CACHE=1
@@ -5735,16 +5736,27 @@ case "$target" in
     if test "$ac_cv_header_oleacc_idl" = "no"; then
         AC_MSG_ERROR([System header oleacc.idl is not available. See http://developer.mozilla.org/en/docs/oleacc.idl for details on fixing this problem.])
     fi
     ;;
 esac
 fi
 
 dnl ========================================================
+dnl xpinstall support on by default
+dnl ========================================================
+MOZ_ARG_DISABLE_BOOL(xpinstall,
+[  --disable-xpinstall     Disable xpinstall support],
+    MOZ_XPINSTALL=,
+    MOZ_XPINSTALL=1 )
+if test "$MOZ_XPINSTALL"; then
+    AC_DEFINE(MOZ_XPINSTALL)
+fi
+
+dnl ========================================================
 dnl xpcom js loader support on by default
 dnl ========================================================
 if test "$MOZ_JSLOADER"; then
     AC_DEFINE(MOZ_JSLOADER)
 fi
 
 dnl ========================================================
 dnl Disable printing
@@ -6326,16 +6338,20 @@ if test -n "$MOZ_INSTALLER" -a "$OS_ARCH
     # The Windows build for NSIS requires the iconv command line utility to
     # convert the charset of the locale files.
     MOZ_PATH_PROGS(HOST_ICONV, $HOST_ICONV "iconv", "")
     if test -z "$HOST_ICONV"; then
         AC_MSG_ERROR([To build the installer iconv is required in your path. To build without the installer reconfigure using --disable-installer.])
     fi
 fi
 
+# Automatically disable installer if xpinstall isn't built
+if test -z "$MOZ_XPINSTALL"; then
+    MOZ_INSTALLER=
+fi
 AC_SUBST(MOZ_INSTALLER)
 
 AC_MSG_CHECKING([for tar archiver])
 AC_CHECK_PROGS(TAR, gnutar gtar tar, "")
 if test -z "$TAR"; then
     AC_MSG_ERROR([no tar archiver found in \$PATH])
 fi
 AC_MSG_RESULT([$TAR])
@@ -8405,16 +8421,17 @@ AC_SUBST(MOZ_XIE_LIBS)
 AC_SUBST(MOZ_ENABLE_POSTSCRIPT)
 
 AC_SUBST(BUILD_STATIC_LIBS)
 AC_SUBST(MOZ_ENABLE_LIBXUL)
 AC_SUBST(ENABLE_TESTS)
 AC_SUBST(IBMBIDI)
 AC_SUBST(MOZ_UNIVERSALCHARDET)
 AC_SUBST(ACCESSIBILITY)
+AC_SUBST(MOZ_XPINSTALL)
 AC_SUBST(MOZ_VIEW_SOURCE)
 AC_SUBST(MOZ_SPELLCHECK)
 AC_SUBST(MOZ_USER_DIR)
 AC_SUBST(MOZ_CRASHREPORTER)
 
 AC_SUBST(ENABLE_STRIP)
 AC_SUBST(PKG_SKIP_STRIP)
 AC_SUBST(USE_ELF_DYNSTR_GC)
--- a/docshell/base/nsAboutRedirector.cpp
+++ b/docshell/base/nsAboutRedirector.cpp
@@ -83,18 +83,16 @@ static RedirEntry kRedirMap[] = {
     { "licence", "chrome://global/content/license.html",
       nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT },
     { "neterror", "chrome://global/content/netError.xhtml",
       nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT |
       nsIAboutModule::ALLOW_SCRIPT |
       nsIAboutModule::HIDE_FROM_ABOUTABOUT },
     { "memory", "chrome://global/content/aboutMemory.xhtml",
       nsIAboutModule::ALLOW_SCRIPT },
-    { "addons", "chrome://mozapps/content/extensions/extensions.xul",
-      nsIAboutModule::ALLOW_SCRIPT },
     { "support", "chrome://global/content/aboutSupport.xhtml",
       nsIAboutModule::ALLOW_SCRIPT }
 };
 static const int kRedirTotal = NS_ARRAY_LENGTH(kRedirMap);
 
 NS_IMETHODIMP
 nsAboutRedirector::NewChannel(nsIURI *aURI, nsIChannel **result)
 {
--- a/docshell/build/nsDocShellModule.cpp
+++ b/docshell/build/nsDocShellModule.cpp
@@ -209,21 +209,16 @@ static const nsModuleComponentInfo gDocS
       NS_ABOUT_MODULE_CONTRACTID_PREFIX "neterror",
       nsAboutRedirector::Create
     },
     { "about:memory",
       NS_ABOUT_REDIRECTOR_MODULE_CID,
       NS_ABOUT_MODULE_CONTRACTID_PREFIX "memory",
       nsAboutRedirector::Create
     },
-    { "about:addons",
-      NS_ABOUT_REDIRECTOR_MODULE_CID,
-      NS_ABOUT_MODULE_CONTRACTID_PREFIX "addons",
-      nsAboutRedirector::Create
-    },
     { "about:support",
       NS_ABOUT_REDIRECTOR_MODULE_CID,
       NS_ABOUT_MODULE_CONTRACTID_PREFIX "support",
       nsAboutRedirector::Create
     },
 
     // uriloader
   { "Netscape URI Loader Service", NS_URI_LOADER_CID, NS_URI_LOADER_CONTRACTID, nsURILoaderConstructor, },
--- a/modules/libpref/src/Makefile.in
+++ b/modules/libpref/src/Makefile.in
@@ -80,17 +80,17 @@ EXTRA_DSO_LDOPTS = \
 include $(topsrcdir)/config/rules.mk
 
 GARBAGE		+= $(addprefix $(DIST)/bin/defaults/pref/, \
 			mailnews.js editor.js \
 			aix.js beos.js unix.js winpref.js os2prefs.js openvms.js photon.js)
 
 GARBAGE		+= greprefs.js
 
-GREPREF_FILES = $(topsrcdir)/netwerk/base/public/security-prefs.js $(srcdir)/init/all.js
+GREPREF_FILES = $(topsrcdir)/xpinstall/public/xpinstall.js $(topsrcdir)/netwerk/base/public/security-prefs.js $(srcdir)/init/all.js
 
 # Optimizer bug with GCC 3.2.2 on OS/2
 ifeq ($(OS_ARCH), OS2)
 nsPrefService.$(OBJ_SUFFIX): nsPrefService.cpp
 	$(REPORT_BUILD)
 	@$(MAKE_DEPS_AUTO_CXX)
 	$(ELOG) $(CCC) $(OUTOPTION)$@ -c $(COMPILE_CXXFLAGS:-O2=-O1) $(_VPATH_SRCS)
 endif
--- a/modules/libpref/src/init/all.js
+++ b/modules/libpref/src/init/all.js
@@ -2886,13 +2886,10 @@ pref("html5.flushtimer.initialdelay", 20
 pref("html5.flushtimer.subsequentdelay", 120);
 
 // Push/Pop/Replace State prefs
 pref("browser.history.allowPushState", true);
 pref("browser.history.allowReplaceState", true);
 pref("browser.history.allowPopState", true);
 pref("browser.history.maxStateObjectSize", 655360);
 
-// XPInstall prefs
-pref("xpinstall.whitelist.required", true);
-
 pref("network.buffer.cache.count", 24);
 pref("network.buffer.cache.size",  4096);
--- a/netwerk/confvars.sh
+++ b/netwerk/confvars.sh
@@ -34,8 +34,9 @@
 # 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 *****
 
 MOZ_APP_NAME=mozilla
 MOZ_EXTENSIONS_DEFAULT=""
 MOZ_APP_VERSION=$MOZILLA_VERSION
+MOZ_XPINSTALL=
--- a/toolkit/components/exthelper/extApplication.js
+++ b/toolkit/components/exthelper/extApplication.js
@@ -31,17 +31,16 @@
  * 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 ***** */
 
 Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
-Components.utils.import("resource://gre/modules/AddonManager.jsm");
 
 //=================================================
 // Shutdown - used to store cleanup functions which will
 //            be called on Application shutdown
 var gShutdown = [];
 
 //=================================================
 // Console constructor
@@ -391,82 +390,89 @@ SessionStorage.prototype = {
 };
 
 
 //=================================================
 // Extension constructor
 function Extension(aItem) {
   this._item = aItem;
   this._firstRun = false;
-  this._prefs = new PreferenceBranch("extensions." + this.id + ".");
+  this._prefs = new PreferenceBranch("extensions." + this._item.id + ".");
   this._storage = new SessionStorage();
   this._events = new Events();
 
   var installPref = "install-event-fired";
   if (!this._prefs.has(installPref)) {
     this._prefs.setValue(installPref, true);
     this._firstRun = true;
   }
 
-  AddonManager.addAddonListener(this);
-  AddonManager.addInstallListener(this);
+  this._enabled = false;
+  const PREFIX_ITEM_URI = "urn:mozilla:item:";
+  const PREFIX_NS_EM = "http://www.mozilla.org/2004/em-rdf#";
+  var rdf = Cc["@mozilla.org/rdf/rdf-service;1"].getService(Ci.nsIRDFService);
+  var itemResource = rdf.GetResource(PREFIX_ITEM_URI + this._item.id);
+  if (itemResource) {
+    var extmgr = Cc["@mozilla.org/extensions/manager;1"].getService(Ci.nsIExtensionManager);
+    var ds = extmgr.datasource;
+    var target = ds.GetTarget(itemResource, rdf.GetResource(PREFIX_NS_EM + "isDisabled"), true);
+    if (target && target instanceof Ci.nsIRDFLiteral)
+      this._enabled = (target.Value != "true");
+  }
+
+  var os = Components.classes["@mozilla.org/observer-service;1"]
+                     .getService(Ci.nsIObserverService);
+  os.addObserver(this, "em-action-requested", false);
 
   var self = this;
   gShutdown.push(function(){ self._shutdown(); });
 }
 
 //=================================================
 // Extension implementation
 Extension.prototype = {
   // cleanup observer so we don't leak
   _shutdown: function ext_shutdown() {
-    AddonManager.removeAddonListener(this);
-    AddonManager.removeInstallListener(this);
+    var os = Components.classes["@mozilla.org/observer-service;1"]
+                       .getService(Ci.nsIObserverService);
+    os.removeObserver(this, "em-action-requested");
 
     this._prefs = null;
     this._storage = null;
     this._events = null;
   },
 
-  // for AddonListener
-  onDisabling: function(addon, needsRestart) {
-    if (addon.id == this.id)
-      this._events.dispatch("disable", this.id);
-  },
-
-  onEnabling: function(addon, needsRestart) {
-    if (addon.id == this.id)
-      this._events.dispatch("enable", this.id);
-  },
-
-  onUninstalling: function(addon, needsRestart) {
-    if (addon.id == this.id)
-      this._events.dispatch("uninstall", this.id);
-  },
-
-  onOperationCancelled: function(addon) {
-    if (addon.id == this.id)
-      this._events.dispatch("cancel", this.id);
-  },
-
-  onInstallEnded: function(install, addon) {
-    if (addon.id == this.id)
-      this._events.dispatch("upgrade", this.id);
+  // for nsIObserver
+  observe: function ext_observe(aSubject, aTopic, aData)
+  {
+    if ((aSubject instanceof Ci.nsIUpdateItem) && (aSubject.id == this._item.id))
+    {
+      if (aData == "item-uninstalled")
+        this._events.dispatch("uninstall", this._item.id);
+      else if (aData == "item-disabled")
+        this._events.dispatch("disable", this._item.id);
+      else if (aData == "item-enabled")
+        this._events.dispatch("enable", this._item.id);
+      else if (aData == "item-cancel-action")
+        this._events.dispatch("cancel", this._item.id);
+      else if (aData == "item-upgraded")
+        this._events.dispatch("upgrade", this._item.id);
+    }
   },
 
   get id() {
     return this._item.id;
   },
 
   get name() {
     return this._item.name;
   },
 
   get enabled() {
-    return this._item.isActive;
+    return this._enabled;
   },
 
   get version() {
     return this._item.version;
   },
 
   get firstRun() {
     return this._firstRun;
@@ -485,54 +491,74 @@ Extension.prototype = {
   },
 
   QueryInterface : XPCOMUtils.generateQI([Ci.extIExtension])
 };
 
 
 //=================================================
 // Extensions constructor
-function Extensions(addons) {
-  this._cache = {};
+function Extensions() {
+  XPCOMUtils.defineLazyServiceGetter(this, "_extmgr",
+                                     "@mozilla.org/extensions/manager;1",
+                                     "nsIExtensionManager");
 
-  addons.forEach(function(addon) {
-    this._cache[addon.id] = new Extension(addon);
-  }, this);
+  this._cache = {};
 
   var self = this;
   gShutdown.push(function() { self._shutdown(); });
 }
 
 //=================================================
 // Extensions implementation
 Extensions.prototype = {
   _shutdown : function exts_shutdown() {
+    this._extmgr = null;
     this._cache = null;
   },
 
+  /*
+   * Helper method to check cache before creating a new extension
+   */
+  _get : function exts_get(aId) {
+    if (this._cache.hasOwnProperty(aId))
+      return this._cache[aId];
+
+    var newExt = new Extension(this._extmgr.getItemForID(aId));
+    this._cache[aId] = newExt;
+    return newExt;
+  },
+
   get all() {
     return this.find({});
   },
 
   // XXX: Disabled until we can figure out the wrapped object issues
   // id: "some@id" or /id/
   // name: "name" or /name/
   // version: "1.0.1"
   // minVersion: "1.0"
   // maxVersion: "2.0"
   find : function exts_find(aOptions) {
-    return [e for each (e in this._cache)];
+    var retVal = [];
+    var items = this._extmgr.getItemList(Ci.nsIUpdateItem.TYPE_EXTENSION);
+
+    for (var i = 0; i < items.length; i++) {
+      retVal.push(this._get(items[i].id));
+    }
+
+    return retVal;
   },
 
   has : function exts_has(aId) {
-    return aId in this._cache;
+    return this._extmgr.getItemForID(aId) != null;
   },
 
   get : function exts_get(aId) {
-    return this.has(aId) ? this._cache[aId] : null;
+    return this.has(aId) ? this._get(aId) : null;
   },
 
   QueryInterface : XPCOMUtils.generateQI([Ci.extIExtensions])
 };
 
 //=================================================
 // extApplication constructor
 function extApplication() {
@@ -632,20 +658,20 @@ extApplication.prototype = {
   },
 
   get prefs() {
     let prefs = new PreferenceBranch("");
     this.__defineGetter__("prefs", function() prefs);
     return this.prefs;
   },
 
-  getExtensions: function(callback) {
-    AddonManager.getAddonsByTypes(["extension"], function(addons) {
-      callback.callback(new Extensions(addons));
-    });
+  get extensions() {
+    let extensions = new Extensions();
+    this.__defineGetter__("extensions", function() extensions);
+    return this.extensions;
   },
 
   get events() {
 
     // This ensures that FUEL only registers for notifications as needed
     // by callers. Note that the unload (xpcom-shutdown) event is listened
     // for by default, as it's needed for cleanup purposes.
     var self = this;
--- a/toolkit/components/exthelper/extIApplication.idl
+++ b/toolkit/components/exthelper/extIApplication.idl
@@ -303,16 +303,17 @@ interface extIExtension : nsISupports
 
   /**
    * The events object for the extension.
    * supports: "uninstall"
    */
   readonly attribute extIEvents events;
 }; 
 
+
 /**
  * Interface representing a list of all installed extensions
  */
 [scriptable, uuid(de281930-aa5a-11db-abbd-0800200c9a66)]
 interface extIExtensions : nsISupports
 {
   /**
    * Array of extIExtension listing all extensions in the application.
@@ -334,25 +335,16 @@ interface extIExtensions : nsISupports
    *          The id of an extension
    * @returns An extension object or null if no extension exists
    *          with the given id.
    */
   extIExtension get(in AString aId);
 }; 
 
 /**
- * Interface representing a callback that receives an array of extIExtensions
- */
-[scriptable, function, uuid(2571cbb5-550d-4400-8038-75df9b553f98)]
-interface extIExtensionsCallback : nsISupports
-{
-  void callback(in nsIVariant extensions);
-};
-
-/**
  * Interface representing a simple storage system
  */
 [scriptable, uuid(0787ac44-29b9-4889-b97f-13573aec6971)]
 interface extISessionStorage : nsISupports
 {
   /**
    * The events object for the storage
    * supports: "change"
@@ -385,17 +377,17 @@ interface extISessionStorage : nsISuppor
    * @param   aDefaultValue
    *          The value to return if no item exists with the given name
    * @returns value of the item or the given default value if no item
    *          exists with the given name.
    */
   nsIVariant get(in AString aName, in nsIVariant aDefaultValue);
 }; 
 
-[scriptable, uuid(2be87909-0817-4292-acfa-fc39be53be3f)]
+[scriptable, uuid(e53d6610-7468-11dd-ad8b-0800200c9a66)]
 interface extIApplication : nsISupports
 {
   /**
    * The id of the application.
    */
   readonly attribute AString id;
 
   /**
@@ -412,17 +404,17 @@ interface extIApplication : nsISupports
    * The console object for the application.
    */
   readonly attribute extIConsole console;
 
   /**
    * The extensions object for the application. Contains a list
    * of all installed extensions.
    */
-  void getExtensions(in extIExtensionsCallback aCallback);
+  readonly attribute extIExtensions extensions;
 
   /**
    * The preferences object for the application. Defaults to an empty
    * root branch.
    */
   readonly attribute extIPreferenceBranch prefs;
 
   /**
--- a/toolkit/components/startup/public/nsIAppStartup.idl
+++ b/toolkit/components/startup/public/nsIAppStartup.idl
@@ -112,27 +112,17 @@ interface nsIAppStartup : nsISupports
      *        constructed from the constants defined above.
      */
     void quit(in PRUint32 aMode);
 };
 
 [scriptable, uuid(3012668f-44b6-49b1-89fb-761a912a78c1)]
 interface nsIAppStartup2 : nsIAppStartup
 {
-    /**
-     * True if the application is in the process of shutting down.
-     */
     readonly attribute boolean shuttingDown;
-
-    /**
-     * Set to true to tell the platform that a restart is necessary to load new
-     * XPCOM components and interfaces. Setting this only has an effect early in
-     * the startup process.
-     */
-    attribute boolean needsRestart;
 };
 
 %{C++
 /**
  * This success code may be returned by nsIAppStartup::Run to indicate that the
  * application should be restarted.  This condition corresponds to the case in
  * which nsIAppStartup::Quit was called with the eRestart flag.
  */
--- a/toolkit/components/startup/src/nsAppStartup.cpp
+++ b/toolkit/components/startup/src/nsAppStartup.cpp
@@ -94,18 +94,17 @@ public:
 // nsAppStartup
 //
 
 nsAppStartup::nsAppStartup() :
   mConsiderQuitStopper(0),
   mRunning(PR_FALSE),
   mShuttingDown(PR_FALSE),
   mAttemptingQuit(PR_FALSE),
-  mRestart(PR_FALSE),
-  mNeedsRestart(PR_FALSE)
+  mRestart(PR_FALSE)
 { }
 
 
 nsresult
 nsAppStartup::Init()
 {
   nsresult rv;
 
@@ -401,33 +400,16 @@ nsAppStartup::ExitLastWindowClosingSurvi
 
 NS_IMETHODIMP
 nsAppStartup::GetShuttingDown(PRBool *aResult)
 {
   *aResult = mShuttingDown;
   return NS_OK;
 }
 
-NS_IMETHODIMP
-nsAppStartup::GetNeedsRestart(PRBool *aResult)
-{
-  *aResult = mNeedsRestart;
-  return NS_OK;
-}
-
-NS_IMETHODIMP
-nsAppStartup::SetNeedsRestart(PRBool aNeedsRestart)
-{
-  if (mRunning)
-    return NS_ERROR_UNEXPECTED;
-
-  mNeedsRestart = aNeedsRestart;
-  return NS_OK;
-}
-
 //
 // nsAppStartup->nsIWindowCreator
 //
 
 NS_IMETHODIMP
 nsAppStartup::CreateChromeWindow(nsIWebBrowserChrome *aParent,
                                  PRUint32 aChromeFlags,
                                  nsIWebBrowserChrome **_retval)
--- a/toolkit/components/startup/src/nsAppStartup.h
+++ b/toolkit/components/startup/src/nsAppStartup.h
@@ -80,12 +80,11 @@ private:
 
   nsCOMPtr<nsIAppShell> mAppShell;
 
   PRInt32      mConsiderQuitStopper; // if > 0, Quit(eConsiderQuit) fails
   PRPackedBool mRunning;        // Have we started the main event loop?
   PRPackedBool mShuttingDown;   // Quit method reentrancy check
   PRPackedBool mAttemptingQuit; // Quit(eAttemptQuit) still trying
   PRPackedBool mRestart;        // Quit(eRestart)
-  PRPackedBool mNeedsRestart;   // Used to flag that a platform restart is necessary
 };
 
 #endif // nsAppStartup_h__
--- a/toolkit/content/aboutSupport.js
+++ b/toolkit/content/aboutSupport.js
@@ -88,36 +88,34 @@ window.onload = function () {
   let supportUrl = urlFormatter.formatURLPref("app.support.baseURL");
 
   // Update the application basics section.
   document.getElementById("application-box").textContent = Application.name;
   document.getElementById("version-box").textContent = Application.version;
   document.getElementById("supportLink").href = supportUrl;
 
   // Update the other sections.
+  populateExtensionsSection();
   populatePreferencesSection();
-  populateExtensionsSection();
 }
 
 function populateExtensionsSection() {
-  Application.getExtensions(function (extensions) {
-    let all = extensions.all;
-    let trExtensions = [];
-    for (let i = 0; i < all.length; i++) {
-      let extension = all[i];
-      let tr = createParentElement("tr", [
-        createElement("td", extension.name),
-        createElement("td", extension.version),
-        createElement("td", extension.enabled),
-        createElement("td", extension.id),
-      ]);
-      trExtensions.push(tr);
-    }
-    appendChildren(document.getElementById("extensions-tbody"), trExtensions);
-  });
+  let extensions = Application.extensions.all;
+  let trExtensions = [];
+  for (let i = 0; i < extensions.length; i++) {
+    let extension = extensions[i];
+    let tr = createParentElement("tr", [
+      createElement("td", extension.name),
+      createElement("td", extension.version),
+      createElement("td", extension.enabled),
+      createElement("td", extension.id),
+    ]);
+    trExtensions.push(tr);
+  }
+  appendChildren(document.getElementById("extensions-tbody"), trExtensions);
 }
 
 function populatePreferencesSection() {
   let modifiedPrefs = getModifiedPrefs();
 
   function comparePrefs(pref1, pref2) {
     if (pref1.name < pref2.name)
       return -1;
--- a/toolkit/library/libxul-config.mk
+++ b/toolkit/library/libxul-config.mk
@@ -118,20 +118,22 @@ STATIC_LIBS += \
 	gfxutils \
 	$(NULL)
 
 ifdef MOZ_IPC
 STATIC_LIBS += chromium_s
 endif
 
 ifndef WINCE
+ifdef MOZ_XPINSTALL
 STATIC_LIBS += \
 	mozreg_s \
 	$(NULL)
 endif
+endif
 
 # component libraries
 COMPONENT_LIBS += \
 	xpconnect \
 	necko \
 	uconv \
 	i18n \
 	chardet \
@@ -143,17 +145,16 @@ COMPONENT_LIBS += \
 	gklayout \
 	docshell \
 	embedcomponents \
 	webbrwsr \
 	nsappshell \
 	txmgr \
 	chrome \
 	commandlines \
-	extensions \
 	toolkitcomps \
 	pipboot \
 	pipnss \
 	appcomps \
 	$(NULL)
 
 ifdef BUILD_CTYPES
 COMPONENT_LIBS += \
@@ -191,16 +192,23 @@ endif
 endif
 
 ifneq (,$(filter windows,$(MOZ_WIDGET_TOOLKIT)))
 COMPONENT_LIBS += \
 	windowsproxy \
 	$(NULL)
 endif
 
+ifdef MOZ_XPINSTALL
+DEFINES += -DMOZ_XPINSTALL
+COMPONENT_LIBS += \
+	xpinstall \
+	$(NULL)
+endif
+
 ifdef MOZ_JSDEBUGGER
 DEFINES += -DMOZ_JSDEBUGGER
 COMPONENT_LIBS += \
 	jsd \
 	$(NULL)
 endif
 
 ifdef MOZ_PREF_EXTENSIONS
--- a/toolkit/library/nsStaticXULComponents.cpp
+++ b/toolkit/library/nsStaticXULComponents.cpp
@@ -139,16 +139,23 @@
 
 #ifdef MOZ_PLUGINS
 #define PLUGINS_MODULES \
     MODULE(nsPluginModule)
 #else
 #define PLUGINS_MODULES
 #endif
 
+#ifdef MOZ_XPINSTALL
+#define XPINSTALL_MODULES \
+    MODULE(nsSoftwareUpdate)
+#else
+#define XPINSTALL_MODULES
+#endif
+
 #ifdef MOZ_JSDEBUGGER
 #define JSDEBUGGER_MODULES \
     MODULE(JavaScript_Debugger)
 #else
 #define JSDEBUGGER_MODULES
 #endif
 
 #if defined(MOZ_FILEVIEW) && defined(MOZ_XUL)
@@ -257,19 +264,19 @@
     MODULE(nsChromeModule)                   \
     MODULE(application)                      \
     MODULE(Apprunner)                        \
     MODULE(CommandLineModule)                \
     FILEVIEW_MODULE                          \
     STORAGE_MODULE                           \
     PLACES_MODULES                           \
     XULENABLED_MODULES                       \
-    MODULE(AddonsModule)                     \
     MODULE(nsToolkitCompsModule)             \
     XREMOTE_MODULES                          \
+    XPINSTALL_MODULES                        \
     JSDEBUGGER_MODULES                       \
     MODULE(BOOT)                             \
     MODULE(NSS)                              \
     SYSTEMPREF_MODULES                       \
     SPELLCHECK_MODULE                        \
     LAYOUT_DEBUG_MODULE                      \
     UNIXPROXY_MODULE                         \
     OSXPROXY_MODULE                          \
--- a/toolkit/locales/en-US/chrome/mozapps/extensions/extensions.dtd
+++ b/toolkit/locales/en-US/chrome/mozapps/extensions/extensions.dtd
@@ -1,112 +1,176 @@
-<!ENTITY addons.windowTitle                   "Add-ons Manager">
-<!ENTITY search.placeholder                   "Search all add-ons">
-<!ENTITY loading.label                        "Loading…">
-<!ENTITY listEmpty.installed.label            "You don't have any add-ons of this type installed">
-<!ENTITY listEmpty.search.label               "Could not find any matching add-ons">
-<!ENTITY listEmpty.button.label               "Learn more about add-ons">
+<!ENTITY addons.title                     "Add-ons">
 
+<!-- Default window size for the addon manager in pixels -->
+<!ENTITY em.width                         "520">
+<!ENTITY em.height                        "380">
 
-<!-- categories / views -->
-<!-- LOCALIZATION NOTE: These should match the header-* entries in extensions.properties -->
-<!ENTITY view.search.label                    "Search">
-<!ENTITY view.discover.label                  "Get Add-ons">
-<!ENTITY view.languages.label                 "Languages">
-<!ENTITY view.searchengines.label             "Search Engines">
-<!ENTITY view.features.label                  "Extensions">
-<!ENTITY view.appearance.label                "Themes">
-<!ENTITY view.plugins.label                   "Plugins">
+<!ENTITY cmd.info.commandKey              "i">
+<!ENTITY cmd.options.commandKey           ",">
+<!ENTITY cmd.close.commandKey             "w">
+
+<!-- View labels -->
+<!ENTITY search.label                     "Get Add-ons">
+<!ENTITY extensions.label                 "Extensions">
+<!ENTITY themes.label                     "Themes">
+<!ENTITY locales.label                    "Languages">
+<!ENTITY plugins.label                    "Plugins">
+<!ENTITY update.label                     "Updates">
+<!ENTITY install.label                    "Installation">
 
-<!-- addon updates -->
-<!ENTITY updates.updateNow.label              "Update add-ons">
-<!ENTITY updates.updating.label               "Updating add-ons">
-<!ENTITY updates.installed.label              "Your add-ons have been updated.">
-<!ENTITY updates.downloaded.label             "Your add-on updates have been downloaded.">
-<!ENTITY updates.restart.label                "Restart now to complete installation">
-<!ENTITY updates.noneFound.label              "No updates found">
+<!-- Command Bar items -->
+<!ENTITY cmd.checkUpdatesAll.label        "Find Updates">
+<!ENTITY cmd.checkUpdatesAll.accesskey    "F">
+<!ENTITY cmd.checkUpdatesAllAddon.tooltip "Finds Updates to your Add-ons">
+<!ENTITY cmd.checkUpdatesAllTheme.tooltip "Finds Updates to your Themes">
+<!ENTITY cmd.checkUpdatesAllPlugin.tooltip "Finds Updates to your Plugins">
+<!ENTITY cmd.installLocalFile.label       "Install…">
+<!ENTITY cmd.installLocalFile.accesskey   "n">
+<!ENTITY cmd.installFileAddon.tooltip     "Install an Add-on">
+<!ENTITY cmd.installFileTheme.tooltip     "Install a Theme">
+<!ENTITY cmd.installUpdatesAll2.label     "Install Updates">
+<!ENTITY cmd.installUpdatesAll2.accesskey "I">
+<!ENTITY cmd.installUpdatesAll2.tooltip   "Install the selected updates">
+<!ENTITY cmd.restartApp2.label            "Restart &brandShortName;">
+<!ENTITY cmd.restartApp2.accesskey        "R">
+<!ENTITY cmd.restartApp2.tooltip          "Restart &brandShortName; to apply changes">
+<!ENTITY cmd.skip.label                   "Skip">
+<!ENTITY cmd.skip.accesskey               "k">
+<!ENTITY cmd.skip.tooltip                 "Skip these updates">
+<!ENTITY cmd.continue.label               "Continue">
+<!ENTITY cmd.continue.accesskey           "C">
+<!ENTITY cmd.continue.tooltip             "Continue loading &brandShortName;">
 
-<!-- addon actions -->
-<!ENTITY cmd.showDetails.label                "Show more information">
-<!ENTITY cmd.showDetails.accesskey            "S">
-<!ENTITY cmd.findUpdates.label                "Find updates">
-<!ENTITY cmd.findUpdates.accesskey            "F">
-<!ENTITY cmd.preferences.label                "Preferences">
-<!ENTITY cmd.preferences.accesskey            "P">
-<!ENTITY cmd.about.label                      "About">
-<!ENTITY cmd.about.accesskey                  "A">
-
-<!ENTITY cmd.enableAddon.label                "Enable">
-<!ENTITY cmd.enableAddon.accesskey            "E">
-<!ENTITY cmd.enableAddon.tooltip              "Enable this add-on">
-<!ENTITY cmd.disableAddon.label               "Disable">
-<!ENTITY cmd.disableAddon.accesskey           "D">
-<!ENTITY cmd.disableAddon.tooltip             "Disable this add-on">
-<!ENTITY cmd.uninstallAddon.label             "Remove">
-<!ENTITY cmd.uninstallAddon.accesskey         "R">
-<!ENTITY cmd.uninstallAddon.tooltip           "Uninstall this add-on">
-<!ENTITY cmd.contribute.label                 "Contribute">
-<!ENTITY cmd.contribute.accesskey             "C">
-<!ENTITY cmd.contribute.tooltip               "Contribute to the development of this add-on">
-
+<!ENTITY cmd.enableAll.label              "Enable All">
+<!ENTITY cmd.enableAll.accesskey          "a">
+<!ENTITY cmd.enableAll.tooltip            "Enable all displayed Add-ons">
+<!ENTITY cmd.disableAll.label             "Disable All">
+<!ENTITY cmd.disableAll.accesskey         "s">
+<!ENTITY cmd.disableAll.tooltip           "Disable all displayed Add-ons">
 
-<!-- detail view -->
-<!ENTITY detail.version.label                 "Version">
-<!ENTITY detail.updated.label                 "Updated">
-<!ENTITY detail.creator.label                 "Developer">
-<!ENTITY detail.homepage.label                "Homepage">
-<!ENTITY detail.numberOfDownloads.label       "Downloads">
+<!-- Displayed in the selected Add-on's richlistitem and context menu -->
+<!ENTITY cmd.useTheme.label               "Use Theme">
+<!ENTITY cmd.useTheme.accesskey           "T">
+<!ENTITY cmd.useTheme.tooltip             "Changes &brandShortName;'s Theme">
+<!ENTITY cmd.options.label                "Options">
+<!ENTITY cmd.options.accesskey            "O">
+<!ENTITY cmd.options.tooltip              "Set Options for the selected Extension">
+<!ENTITY cmd.optionsUnix.label            "Preferences">
+<!ENTITY cmd.optionsUnix.accesskey        "P">
+<!ENTITY cmd.optionsUnix.tooltip          "Edit Preferences for the selected Extension">
+<!ENTITY cmd.enable.label                 "Enable">
+<!ENTITY cmd.enable.accesskey             "E">
+<!ENTITY cmd.enable.tooltip               "Enable this Add-on when &brandShortName; is restarted">
+<!ENTITY cmd.disable.label                "Disable">
+<!ENTITY cmd.disable.accesskey            "D">
+<!ENTITY cmd.disable.tooltip              "Disable this Add-on when &brandShortName; is restarted">
+<!ENTITY cmd.uninstall.label              "Uninstall">
+<!ENTITY cmd.uninstall2.accesskey         "U">
+<!ENTITY cmd.uninstall2.tooltip           "Uninstall this Add-on when &brandShortName; is restarted">
+<!ENTITY cmd.cancelUninstall.label        "Cancel Uninstall">
+<!ENTITY cmd.cancelUninstall.accesskey    "C">
+<!ENTITY cmd.cancelUninstall.tooltip      "Cancel the uninstall of this Add-on">
+<!ENTITY cmd.cancelInstall.label          "Cancel Install">
+<!ENTITY cmd.cancelInstall.accesskey      "C">
+<!ENTITY cmd.cancelInstall.tooltip        "Cancel the install of this Add-on">
+<!ENTITY cmd.cancelUpgrade.label          "Cancel Upgrade">
+<!ENTITY cmd.cancelUpgrade.accesskey      "C">
+<!ENTITY cmd.cancelUpgrade.tooltip        "Cancel the upgrade of this Add-on">
+<!ENTITY cmd.installUpdate.label          "Install Update">
+<!ENTITY cmd.installUpdate.accesskey      "I">
+<!ENTITY cmd.installUpdate.tooltip        "Install an update for this Add-on">
+<!ENTITY cmd.showUpdateInfo.label         "Show Information">
+<!ENTITY cmd.showUpdateInfo.accesskey     "S">
+<!ENTITY cmd.showUpdateInfo.tooltip       "Show more information about these updates">
+<!ENTITY cmd.hideUpdateInfo.label         "Hide Information">
+<!ENTITY cmd.hideUpdateInfo.accesskey     "H">
+<!ENTITY cmd.hideUpdateInfo.tooltip       "Hide information about these updates">
+<!ENTITY cmd.installSearchResult.label     "Add to &brandShortName;…">
+<!ENTITY cmd.installSearchResult.accesskey "A">
+<!ENTITY cmd.installSearchResult.tooltip   "Download and install this add-on">
+<!-- The selected add-on's cancel action button label -->
+<!ENTITY cancel.label                     "Cancel">
+<!ENTITY cancel.accesskey                 "C">
+<!ENTITY cancelInstall.label              "Cancel">
+<!ENTITY cancelInstall.accesskey          "C">
+<!ENTITY cancelUpgrade.label              "Cancel">
+<!ENTITY cancelUpgrade.accesskey          "C">
 
-<!ENTITY detail.updateAutomatically.label     "Update automatically">
-<!ENTITY detail.updateAutomatically.accesskey "U">
-<!ENTITY detail.updateAutomatically.tooltip   "Update this add-on automatically whenever there is an update available">
-<!ENTITY detail.checkForUpdates.label         "Check for updates">
-<!ENTITY detail.checkForUpdates.accesskey     "F">
-<!ENTITY detail.checkForUpdates.tooltip       "Check for updates for this add-on">
-<!ENTITY detail.showPreferences.label         "Preferences">
-<!ENTITY detail.showPreferences.accesskey     "P">
-<!ENTITY detail.showPreferences.tooltip       "Change this add-on's preferences">
+<!-- Only displayed in the selected Add-on's context menu -->
+<!ENTITY cmd.homepage.label               "Visit Home Page">
+<!ENTITY cmd.homepage.accesskey           "H">
+<!ENTITY cmd.about2.label                 "About this Add-on">
+<!ENTITY cmd.about.accesskey              "A">
+<!ENTITY cmd.checkUpdate.label            "Find Update">
+<!ENTITY cmd.checkUpdate.accesskey        "F">
 
-
-<!-- ratings -->
-<!ENTITY rating.yourRating.label              "Your rating:">
-
-<!-- download/install progress -->
-<!ENTITY progress.pause.tooltip               "Pause">
-<!ENTITY progress.cancel.tooltip              "Cancel">
-
+<!ENTITY cmd.includeUpdate.label          "Include Update">
+<!ENTITY cmd.includeUpdate.accesskey      "n">
+<!ENTITY includeUpdate.label              "Include this update">
+<!ENTITY includeUpdate.accesskey          "n">
+<!ENTITY includeUpdate.tooltip            "Include this Add-on when installing the updates">
 
-<!-- list sorting -->
-<!ENTITY sort.name.label                      "Name">
-<!ENTITY sort.name.tooltip                    "Sort by name">
-<!ENTITY sort.size.label                      "Size">
-<!ENTITY sort.size.tooltip                    "Sort by size">
-<!ENTITY sort.dateUpdated.label               "Last Updated">
-<!ENTITY sort.dateUpdated.tooltip             "Sort by date updated">
-<!ENTITY sort.rating.label                    "Rating">
-<!ENTITY sort.rating.tooltip                  "Sort by average rating">
+<!-- Status Messsages -->
+<!ENTITY insecureUpdate.label             "Does not provide secure updates.">
+<!ENTITY needsDependencies.label          "Requires additional items.">
+<!ENTITY blocklisted.label                "Disabled for your protection.">
+<!ENTITY softBlocklisted.label            "Known to cause security or stability issues.">
+<!ENTITY outdated.label                   "A newer, safer version is available.">
+<!ENTITY toBeDisabled.label               "This add-on will be disabled when &brandShortName; is restarted.">
+<!ENTITY toBeEnabled.label                "This add-on will be enabled when &brandShortName; is restarted.">
+<!ENTITY toBeInstalled.label              "This add-on will be installed when &brandShortName; is restarted.">
+<!ENTITY toBeUninstalled.label            "This add-on will be uninstalled when &brandShortName; is restarted.">
+<!ENTITY toBeUpdated.label                "This add-on will be updated when &brandShortName; is restarted.">
 
-
-<!ENTITY showMore.label                       "Show more">
-<!ENTITY showMore.accesskey                   "m">
-<!ENTITY showMore.tooltip                     "Show more details">
-<!ENTITY showLess.label                       "Show less">
-<!ENTITY showLess.accesskey                   "l">
-<!ENTITY showLess.tooltip                     "Show fewer details">
+<!ENTITY getExtensions.label              "Get Extensions">
+<!ENTITY getThemes.label                  "Get Themes">
+<!ENTITY getPlugins.label                 "Get Plugins">
 
-<!ENTITY search.filter.label                  "Show:">
-<!ENTITY search.filter.installed.label        "Your installed add-ons">
-<!ENTITY search.filter.available.label        "Available add-ons">
+<!ENTITY searchAddons.label               "Search All Add-ons">
+<!ENTITY browseAddons.label               "Browse All Add-ons">
+<!ENTITY searchFailed.label               "&brandShortName; couldn't retrieve add-ons">
+<!ENTITY recommendedHeader.label          "Recommended">
+<!ENTITY recommendedThrobber.label        "Retrieving recommended add-ons">
+<!ENTITY searchThrobber.label             "Searching add-ons">
+<!ENTITY resetSearch.label                "Clear Results">
+<!ENTITY noSearchResults.label            "All results are already installed or incompatible.">
+<!ENTITY noRecommendedResults.label       "All recommendations are already installed or incompatible.">
+<!ENTITY emptySearch.label                "No matching add-ons">
+<!ENTITY emptySearch.button               "OK">
+<!ENTITY cancelSearch.button              "Cancel">
+<!ENTITY searchFailed.button              "OK">
+<!ENTITY searchResultHomepage.value       "Learn More">
+<!ENTITY searchBox.label                  "Search All Add-ons">
+<!ENTITY recommendedResults.label         "See All Recommended Add-ons">
+<!ENTITY searchResultConnecting.label     "Connecting…">
+<!ENTITY searchResultInstalling.label     "Installing…">
+<!ENTITY searchResultFailed.label         "Install Failed">
+<!ENTITY searchResultInstalled.label      "Install Complete">
+<!ENTITY addonTypeExtension.label         "Extension">
+<!ENTITY addonTypeTheme.label             "Theme">
+<!ENTITY missingThumbnail.label           "No Preview">
 
-<!ENTITY addon.homepage                       "Homepage">
-<!ENTITY addon.unknownDate                    "Unknown">
-<!ENTITY addon.disabled.postfix               "(disabled)">
-<!ENTITY addon.undo.label                     "Undo?">
-<!ENTITY addon.undo.tooltip                   "Undo this action">
-<!ENTITY addon.undoUninstall.label            "Undo?">
-<!ENTITY addon.undoUninstall.tooltip          "Keep this add-on installed">
-<!ENTITY addon.restartNow.label               "Restart now">
-<!ENTITY addon.restartNow.tooltip             "Restart now to complete installation">
-<!ENTITY addon.install.label                  "Install">
-<!ENTITY addon.install.tooltip                "Install this add-on">
-<!ENTITY addon.checkingForUpdates.label       "Checking for updates…">
+<!ENTITY previewNoThemeSelected.label     "No Theme Selected">
+<!ENTITY previewNoPreviewImage.label      "This Theme does not have a Preview Image">
+<!ENTITY moreInfo.label                   "More Information">
+<!ENTITY infoNoAddonSelected.label        "No Update Selected">
+<!ENTITY infoNoUpdateInfo.label           "This update does not have any additional information">
+<!ENTITY infoUpdateInfoError.label        "There was an error loading the information about this update">
 
-<!ENTITY addon.createdBy.label                "By ">
+<!ENTITY updateSuccess.label              "Update completed successfully.">
+<!ENTITY installSuccess.label             "Install completed successfully.">
+<!ENTITY installSuccessRestart.label      "Restart to complete the installation.">
+<!ENTITY updateSuccessRestart.label       "Restart to complete the update.">
+<!ENTITY installWaiting.label             "Waiting…">
+<!ENTITY installIncompatibleUpdate.label  "Checking compatibility…">
+<!ENTITY installFinishing.label           "Installing…">
+<!ENTITY installFailure.label             "Install failed.">
+
+<!ENTITY progressStatus.label             "Checking For Updates">
+
+<!ENTITY eula.title                       "End-User License Agreement">
+<!ENTITY eula.width                       "560px">
+<!ENTITY eula.height                      "400px">
+<!ENTITY eula.accept                      "Accept and Install…">
+
+<!ENTITY blocklist.blocked.label          "Blocked">
+<!ENTITY blocklist.checkbox.label         "Disable">
--- a/toolkit/locales/en-US/chrome/mozapps/extensions/extensions.properties
+++ b/toolkit/locales/en-US/chrome/mozapps/extensions/extensions.properties
@@ -1,53 +1,116 @@
-#LOCALIZATION NOTE (aboutWindowTitle) %S is the addon name
 aboutWindowTitle=About %S
 aboutWindowCloseButton=Close
-#LOCALIZATION NOTE (aboutWindowVersionString) %S is the addon version
 aboutWindowVersionString=version %S
-#LOCALIZATION NOTE (aboutAddon) %S is the addon name
 aboutAddon=About %S
+updatingMsg=Looking for updates…
+updateCompatibilityMsg=A compatibility update has been applied.
+updateNoUpdateMsg=No updates were found.
+updateErrorMessage=An error occurred while trying to find updates for %S.
+updateDisabledMessage=Updates are disabled for %S.
+updateReadOnlyMessage=Update not supported (install location is read only).
+updateNotManagedMessage=Update not supported (install location is not managed by %S).
+incompatibleUpdateMessage=%S is checking for a compatibility update to %S.
+installSuccess=Install completed successfully
+installWaiting=Waiting…
+droppedInWarning=The following items were found in your Extensions folder. Do you want to install them?
+updateNotificationTitle=Add-on updates found
+updateNotificationText=%S has found an update for 1 of your add-ons
+multipleUpdateNotificationText=%S has found updates for %S of your add-ons
+# LOCALIZATION NOTE (lightweightThemeDescription): %S is the theme designer, either a person or organisation
+lightweightThemeDescription=Created by %S.
 
-#LOCALIZATION NOTE These should match the view.*.label entities in extensions.dtd
-header-search=Search Results
-header-discover=Get Add-ons
-header-language=Languages
-header-searchengine=Search Engines
-header-extension=Extensions
-header-theme=Themes
-header-plugin=Plugins
+uninstallButton=Uninstall
+disableButton=Disable
+cancelButton=Cancel
+restartMessage=Restart %S to complete your changes.
+restartButton=Restart %S
+restartAccessKey=R
+laterButton=Later
+moreInfoText=More information
+uninstallTitle=Uninstall %S
+uninstallWarnDependMsg=%S is required by one or more add-ons. If you continue, the following items will be disabled:
+uninstallQueryMessage=Do you want to uninstall %S?
+cancelInstallTitle=Cancel Install of %S
+cancelInstallQueryMessage=Are you sure you want to cancel the install of %S?
+cancelInstallButton=Yes
+cancelCancelInstallButton=No
+cancelUpgradeTitle=Cancel Upgrade of %S
+cancelUpgradeQueryMessage=Are you sure you want to cancel the upgrade of %S?
+cancelUpgradeButton=Yes
+cancelCancelUpgradeButton=No
+disableTitle=Disable %S
+disableWarningDependMessage=If you disable %S, the following items that require this extension will also be disabled:
+disableQueryMessage=Do you want to disable %S?
 
-#LOCALIZATION NOTE (header-goBack) %S is the name of the pane to go back to
-header-goBack=Back to %S
+themesTitle=Themes
+extensionsTitle=Extensions
 
-#LOCALIZATION NOTE (uninstallNotice) %S is the add-on name
-uninstallNotice=%S has been removed.
-
-#LOCALIZATION NOTE (numReviews) #1 is the number of reviews
-numReviews=#1 review;#1 reviews
+type-32=Multiple Extension Package
+type-16=Plugin
+type-8=Language
+type-4=Theme
+type-2=Extension
+incompatibleTitle=Incompatible %S
+incompatibleMessage=%S %S could not be installed because it is not compatible with %S %S.
+incompatibleThemeName=this Theme
+incompatibleExtension=Disabled - not compatible with %S %S
+incompatibleAddonMsg=Not compatible with %S %S
+insecureUpdateMessage="%S" will not be installed because it does not provide secure updates
 
-#LOCALIZATION NOTE (dateUpdated) %S is the date the addon was last updated
-dateUpdated=Updated %S
+invalidGUIDMessage="%S" could not be installed because of an error in its Install Manifest ("%S" is not a valid GUID). Please contact the author of this item about the problem.
+invalidVersionMessage="%S" could not be installed because of an error in its Install Manifest ("%S" is not a valid Version String). Please contact the author of this item about the problem.
+incompatiblePlatformMessage="%S" could not be installed because it is not compatible with your %S build type (%S). Please contact the author of this item about the problem.
+
+blocklistedInstallTitle2=This add-on is dangerous to use
+blocklistedInstallMsg2=The add-on %S has a high risk of causing stability or security problems and can't be installed.
+softBlockedInstallTitle=This add-on may be dangerous to use
+softBlockedInstallMsg=The add-on %S may cause stability or security problems. It is highly recommended that you do not install it.
+softBlockedInstallAcceptLabel=Install Anyway
+softBlockedInstallAcceptKey=I
 
-#LOCALIZATION NOTE (incompatibleWith) %1$S is brand name, %2$S is application version
-incompatibleWith=Incompatible with %1$S %2$S
+missingFileTitle=Missing File
+missingFileMessage=%S could not load this item because the file %S was missing.
+
+malformedMessage=%S could not install this item because "%S" (provided by the item) is not well-formed or does not exist. Please contact the author about this problem.
+malformedTitle=Malformed File
 
-incompatibleTitle2=Incompatible add-on
-#LOCALIZATION NOTE (incompatibleMessage2) %1$S is add-on name, %2$% is add-on version, %3$% is application name, %4$% is application version
-incompatibleMessage2=%1$S %2$S could not be installed because it is not compatible with %3$S %4$S.
+invalidFileExtTitle=Invalid File Extension
+invalidFileExtMessage="%S" could not be installed because this item has an invalid file extension (%S is not a valid file extension for a %S). Please contact the author about this problem.
+missingPackageFilesTitle=Missing Installation Files
+missingPackageFilesMessage="%S" could not be installed because it does not contain a valid package (a %S must contain at least one extension or theme). Please contact the author about this problem.
+
+errorInstallTitle=Error
+errorInstallMsg=%S could not install the file at \n\n%S\n\nbecause: %S
 
-installDownloading=Downloading
-installDownloaded=Downloaded
-installDownloadFailed=Error downloading
-installVerifying=Verifying
-installInstalling=Installing
-installInstallPending=Ready to install
-installUpdatePending=Ready to update
-installEnablePending=Restart to enable
-installDisablePending=Restart to disable
-installFailed=Error installing
-installCancelled=Install cancelled
+extensionFilter=Extensions (*.xpi)
+themesFilter=Themes (*.jar)
+installThemePickerTitle=Select a theme to install
+installExtensionPickerTitle=Select an extension to install
+
+dssSwitchAfterRestart=Restart %S to use.
+
+finishedUpdateCheck=Finished checking for updates to %S
+updateAvailableMsg=Version %S is available.
 
-#LOCALIZATION NOTE: %1$S is the addon name, %2$S is brand name
-restartToEnable=%1$% will be enabled after you restart %2$S
-restartToDisable=%1$S will be disabled after you restart %2$S
-restartToUninstall=%1$S will be removed after you restart %2$S
-restartToUpgrade=%1$S will be updated after you restart %2$S
+xpinstallDisabledMsgLocked=Software installation has been disabled by your system administrator.
+xpinstallDisabledMsg=Software installation is currently disabled. Click Enable and try again.
+# LOCALIZATION NOTE: Semi-colon list of plural forms.
+# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
+newAddonsNotificationMsg2=%S new add-on has been installed.;%S new add-ons have been installed.
+safeModeMsg=All add-ons have been disabled by safe mode.
+disabledCompatMsg=Add-on compatibility checking is disabled. You may have incompatible add-ons.
+disabledUpdateSecurityMsg=Add-on update security checking is disabled. You may be compromised by updates.
+noUpdatesMsg=No updates were found.
+offlineUpdateMsg2=%S is currently in offline mode and is unable to update add-ons. Click Go Online and try again.
+offlineSearchMsg=%S is currently in offline mode and is unable to search for add-ons. Click Go Online and try again.
+enableButtonLabel=Enable
+enableButtonAccesskey=n
+goOnlineButtonLabel=Go Online
+goOnlineButtonAccesskey=G
+
+newUpdateWindowTitle=%S Add-on Updates
+newUpdatesAvailableMsg=There are new updates available for your add-ons.
+
+searchResults=See all results (%S)
+
+eulaHeader=%S requires that you accept the following End User License Agreement before installation can proceed:
deleted file mode 100644
--- a/toolkit/mozapps/extensions/AddonLogging.jsm
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
-# ***** 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 the Extension Manager.
-#
-# The Initial Developer of the Original Code is
-# the Mozilla Foundation.
-# Portions created by the Initial Developer are Copyright (C) 2010
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Dave Townsend <dtownsend@oxymoronical.com>
-#
-# 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 Cc = Components.classes;
-const Ci = Components.interfaces;
-const Cr = Components.results;
-
-const KEY_PROFILEDIR                  = "ProfD";
-const FILE_EXTENSIONS_LOG             = "extensions.log";
-
-Components.utils.import("resource://gre/modules/FileUtils.jsm");
-Components.utils.import("resource://gre/modules/Services.jsm");
-
-var EXPORTED_SYMBOLS = [ "LogManager" ];
-
-var gDebugLogEnabled = false;
-
-function formatLogMessage(aType, aName, aStr) {
-  return aType.toUpperCase() + " " + aName + ": " + aStr;
-}
-
-function AddonLogger(aName) {
-  this.name = aName;
-}
-
-AddonLogger.prototype = {
-  name: null,
-
-  error: function(aStr) {
-    let message = formatLogMessage("error", this.name, aStr);
-
-    let consoleMessage = Cc["@mozilla.org/scripterror;1"].
-                         createInstance(Ci.nsIScriptError);
-    consoleMessage.init(message, null, null, 0, 0, Ci.nsIScriptError.errorFlag,
-                        "component javascript");
-    Services.console.logMessage(consoleMessage);
-
-    if (gDebugLogEnabled)
-      dump("*** " + message + "\n");
-
-    try {
-      var tstamp = new Date();
-      var logfile = FileUtils.getFile(KEY_PROFILEDIR, [FILE_EXTENSIONS_LOG]);
-      var stream = Cc["@mozilla.org/network/file-output-stream;1"].
-                   createInstance(Ci.nsIFileOutputStream);
-      stream.init(logfile, 0x02 | 0x08 | 0x10, 0666, 0); // write, create, append
-      var writer = Cc["@mozilla.org/intl/converter-output-stream;1"].
-                   createInstance(Ci.nsIConverterOutputStream);
-      writer.init(stream, "UTF-8", 0, 0x0000);
-      writer.writeString(tstamp.toLocaleFormat("%Y-%m-%d %H:%M:%S ") +
-                         message + "\n");
-      writer.close();
-    }
-    catch (e) { }
-  },
-
-  warn: function(aStr) {
-    let message = formatLogMessage("warn", this.name, aStr);
-
-    let consoleMessage = Cc["@mozilla.org/scripterror;1"].
-                         createInstance(Ci.nsIScriptError);
-    consoleMessage.init(message, null, null, 0, 0, Ci.nsIScriptError.warningFlag,
-                        "component javascript");
-    Services.console.logMessage(consoleMessage);
-
-    if (gDebugLogEnabled)
-      dump("*** " + message + "\n");
-  },
-
-  log: function(aStr) {
-    if (gDebugLogEnabled) {
-      let message = formatLogMessage("log", this.name, aStr);
-      dump("*** " + message + "\n");
-      Services.console.logStringMessage(message);
-    }
-  }
-};
-
-var LogManager = {
-  getLogger: function(aName, aTarget) {
-    let logger = new AddonLogger(aName);
-
-    if (aTarget) {
-      ["error", "warn", "log"].forEach(function(name) {
-        let fname = name.toUpperCase();
-        delete aTarget[fname];
-        aTarget[fname] = function(aStr) {
-          logger[name](aStr);
-        };
-      });
-    }
-
-    return logger;
-  }
-};
-
-try {
-  gDebugLogEnabled = Services.prefs.getBoolPref("extensions.logging.enabled");
-}
-catch (e) {
-}
deleted file mode 100644
--- a/toolkit/mozapps/extensions/AddonManager.jsm
+++ /dev/null
@@ -1,929 +0,0 @@
-/*
-# ***** 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 the Extension Manager.
-#
-# The Initial Developer of the Original Code is
-# the Mozilla Foundation.
-# Portions created by the Initial Developer are Copyright (C) 2009
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Dave Townsend <dtownsend@oxymoronical.com>
-#
-# 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 Cc = Components.classes;
-const Ci = Components.interfaces;
-const Cr = Components.results;
-
-const PREF_EM_UPDATE_ENABLED = "extensions.update.enabled";
-
-Components.utils.import("resource://gre/modules/Services.jsm");
-
-var EXPORTED_SYMBOLS = [ "AddonManager", "AddonManagerPrivate" ];
-
-// A list of providers to load by default
-const PROVIDERS = [
-  "resource://gre/modules/XPIProvider.jsm",
-  "resource://gre/modules/PluginProvider.jsm",
-  "resource://gre/modules/LightweightThemeManager.jsm"
-];
-
-["LOG", "WARN", "ERROR"].forEach(function(aName) {
-  this.__defineGetter__(aName, function() {
-    Components.utils.import("resource://gre/modules/AddonLogging.jsm");
-
-    LogManager.getLogger("addons.manager", this);
-    return this[aName];
-  });
-}, this);
-
-/**
- * Calls a callback method consuming any thrown exception. Any parameters after
- * the callback parameter will be passed to the callback.
- *
- * @param  aCallback
- *         The callback method to call
- */
-function safeCall(aCallback) {
-  var args = Array.slice(arguments, 1);
-
-  try {
-    aCallback.apply(null, args);
-  }
-  catch (e) {
-    WARN("Exception calling callback: " + e);
-  }
-}
-
-/**
- * Calls a method on a provider if it exists and consumes any thrown exception.
- * Any parameters after the dflt parameter are passed to the provider's method.
- *
- * @param  aProvider
- *         The provider to call
- * @param  aMethod
- *         The method name to call
- * @param  aDefault
- *         A default return value if the provider does not implement the named
- *         method or throws an error.
- * @return the return value from the provider or dflt if the provider does not
- *         implement method or throws an error
- */
-function callProvider(aProvider, aMethod, aDefault) {
-  if (!(aMethod in aProvider))
-    return aDefault;
-
-  var args = Array.slice(arguments, 3);
-
-  try {
-    return aProvider[aMethod].apply(aProvider, args);
-  } catch (e) {
-    ERROR("Exception calling provider." + aMethod + ": " + e);
-    return aDefault;
-  }
-}
-
-/**
- * A helper class to repeatedly call a listener with each object in an array
- * optionally checking whether the object has a method in it.
- *
- * @param  aObjects
- *         The array of objects to iterate through
- * @param  aMethod
- *         An optional method name, if not null any objects without this method
- *         will not be passed to the listener
- * @param  aListener
- *         A listener implementing nextObject and noMoreObjects methods. The
- *         former will be called with the AsyncObjectCaller as the first
- *         parameter and the object as the second. noMoreObjects will be passed
- *         just the AsyncObjectCaller
- */
-function AsyncObjectCaller(aObjects, aMethod, aListener) {
-  this.objects = aObjects.slice(0);
-  this.method = aMethod;
-  this.listener = aListener;
-
-  this.callNext();
-}
-
-AsyncObjectCaller.prototype = {
-  objects: null,
-  method: null,
-  listener: null,
-
-  /**
-   * Passes the next object to the listener or calls noMoreObjects if there
-   * are none left.
-   */
-  callNext: function AOC_callNext() {
-    if (this.objects.length == 0) {
-      this.listener.noMoreObjects(this);
-      return;
-    }
-
-    let object = this.objects.shift();
-    if (!this.method || this.method in object)
-      this.listener.nextObject(this, object);
-    else
-      this.callNext();
-  }
-};
-
-/**
- * This is the real manager, kept here rather than in AddonManager to keep its
- * contents hidden from API users.
- */
-var AddonManagerInternal = {
-  installListeners: null,
-  addonListeners: null,
-  providers: [],
-  started: false,
-
-  /**
-   * Initializes the AddonManager, loading any known providers and initializing
-   * them. 
-   */
-  startup: function AMI_startup() {
-    if (this.started)
-      return;
-
-    this.installListeners = [];
-    this.addonListeners = [];
-
-    let appChanged = true;
-
-    try {
-      appChanged = Services.appinfo.version !=
-                   Services.prefs.getCharPref("extensions.lastAppVersion");
-    }
-    catch (e) { }
-
-    if (appChanged) {
-      LOG("Application has been upgraded");
-      Services.prefs.setCharPref("extensions.lastAppVersion",
-                                 Services.appinfo.version);
-    }
-
-    // Ensure all default providers have had a chance to register themselves
-    PROVIDERS.forEach(function(url) {
-      try {
-        Components.utils.import(url, {});
-      }
-      catch (e) {
-        ERROR("Exception loading provider \"" + url + "\": " + e);
-      }
-    });
-
-    let needsRestart = false;
-    this.providers.forEach(function(provider) {
-      callProvider(provider, "startup");
-      if (callProvider(provider, "checkForChanges", false, appChanged))
-        needsRestart = true;
-    });
-    this.started = true;
-
-    // Flag to the platform that a restart is necessary
-    if (needsRestart) {
-      let appStartup = Cc["@mozilla.org/toolkit/app-startup;1"].
-                       getService(Ci.nsIAppStartup2);
-      appStartup.needsRestart = needsRestart;
-    }
-  },
-
-  /**
-   * Registers a new AddonProvider.
-   *
-   * @param  aProvider
-   *         The provider to register
-   */
-  registerProvider: function AMI_registerProvider(aProvider) {
-    this.providers.push(aProvider);
-
-    // If we're registering after startup call this provider's startup.
-    if (this.started)
-      callProvider(aProvider, "startup");
-  },
-
-  /**
-   * Shuts down the addon manager and all registered providers, this must clean
-   * up everything in order for automated tests to fake restarts.
-   */
-  shutdown: function AM_shutdown() {
-    this.providers.forEach(function(provider) {
-      callProvider(provider, "shutdown");
-    });
-
-    this.installListeners = null;
-    this.addonListeners = null;
-    this.started = false;
-  },
-
-  /**
-   * Performs a background update check by starting an update for all add-ons
-   * that can be updated.
-   */
-  backgroundUpdateCheck: function AMI_backgroundUpdateCheck() {
-    if (!Services.prefs.getBoolPref(PREF_EM_UPDATE_ENABLED))
-      return;
-
-    let scope = {};
-    Components.utils.import("resource://gre/modules/LightweightThemeManager.jsm", scope);
-    scope.LightweightThemeManager.updateCurrentTheme();
-
-    this.getAllAddons(function getAddonsCallback(aAddons) {
-      aAddons.forEach(function BUC_forEachCallback(aAddon) {
-        // Check all add-ons for updates so that any compatibility updates will
-        // be applied
-        aAddon.findUpdates({
-          onUpdateAvailable: function BUC_onUpdateAvailable(aAddon, aInstall) {
-            // Start installing updates when the add-on can be updated and
-            // background updates should be applied.
-            if (aAddon.permissions & AddonManager.PERM_CAN_UPGRADE &&
-                aAddon.applyBackgroundUpdates) {
-              aInstall.install();
-            }
-          }
-        }, AddonManager.UPDATE_WHEN_PERIODIC_UPDATE);
-      });
-    });
-  },
-
-  /**
-   * Calls all registered InstallListeners with an event. Any parameters after
-   * the extraListeners parameter are passed to the listener.
-   *
-   * @param  aMethod
-   *         The method on the listeners to call
-   * @param  aExtraListeners
-   *         An array of extra InstallListeners to also call
-   * @return false if any of the listeners returned false, true otherwise
-   */
-  callInstallListeners: function AMI_callInstallListeners(aMethod, aExtraListeners) {
-    let result = true;
-    let listeners = this.installListeners;
-    if (aExtraListeners)
-      listeners = aExtraListeners.concat(listeners);
-    let args = Array.slice(arguments, 2);
-
-    listeners.forEach(function(listener) {
-      try {
-        if (aMethod in listener) {
-          if (listener[aMethod].apply(listener, args) === false)
-            result = false;
-        }
-      }
-      catch (e) {
-        WARN("InstallListener threw exception when calling " + aMethod + ": " + e);
-      }
-    });
-    return result;
-  },
-
-  /**
-   * Calls all registered AddonListeners with an event. Any parameters after
-   * the method parameter are passed to the listener.
-   *
-   * @param  aMethod
-   *         The method on the listeners to call
-   */
-  callAddonListeners: function AMI_callAddonListeners(aMethod) {
-    var args = Array.slice(arguments, 1);
-    this.addonListeners.forEach(function(listener) {
-      try {
-        if (aMethod in listener)
-          listener[aMethod].apply(listener, args);
-      }
-      catch (e) {
-        WARN("AddonListener threw exception when calling " + aMethod + ": " + e);
-      }
-    });
-  },
-
-  /**
-   * Notifies all providers that an add-on has been enabled when that type of
-   * add-on only supports a single add-on being enabled at a time. This allows
-   * the providers to disable theirs if necessary.
-   *
-   * @param  aId
-   *         The id of the enabled add-on
-   * @param  aType
-   *         The type of the enabled add-on
-   * @param  aPendingRestart
-   *         A boolean indicating if the change will only take place the next
-   *         time the application is restarted
-   */
-  notifyAddonChanged: function AMI_notifyAddonChanged(aId, aType, aPendingRestart) {
-    this.providers.forEach(function(provider) {
-      callProvider(provider, "addonChanged", null, aId, aType, aPendingRestart);
-    });
-  },
-
-  /**
-   * Notifies all providers they need to update the appDisabled property for
-   * their add-ons in response to an application change such as a blocklist
-   * update.
-   */
-  updateAddonAppDisabledStates: function AMI_updateAddonAppDisabledStates() {
-    this.providers.forEach(function(provider) {
-      callProvider(provider, "updateAddonAppDisabledStates");
-    });
-  },
-
-  /**
-   * Asynchronously gets an AddonInstall for a URL.
-   *
-   * @param  aUrl
-   *         The url the add-on is located at
-   * @param  aCallback
-   *         A callback to pass the AddonInstall to
-   * @param  aMimetype
-   *         The mimetype of the add-on
-   * @param  aHash
-   *         An optional hash of the add-on
-   * @param  aName
-   *         An optional placeholder name while the add-on is being downloaded
-   * @param  aIconURL
-   *         An optional placeholder icon URL while the add-on is being downloaded
-   * @param  aVersion
-   *         An optional placeholder version while the add-on is being downloaded
-   * @param  aLoadGroup
-   *         An optional nsILoadGroup to associate any network requests with
-   * @throws if the aUrl, aCallback or aMimetype arguments are not specified
-   */
-  getInstallForURL: function AMI_getInstallForURL(aUrl, aCallback, aMimetype,
-                                                  aHash, aName, aIconURL,
-                                                  aVersion, aLoadGroup) {
-    if (!aUrl || !aMimetype || !aCallback)
-      throw new TypeError("Invalid arguments");
-
-    for (let i = 0; i < this.providers.length; i++) {
-      if (callProvider(this.providers[i], "supportsMimetype", false, aMimetype)) {
-        callProvider(this.providers[i], "getInstallForURL", null,
-                     aUrl, aHash, aName, aIconURL, aVersion, aLoadGroup,
-                     function(aInstall) {
-          safeCall(aCallback, aInstall);
-        });
-        return;
-      }
-    }
-    safeCall(aCallback, null);
-  },
-
-  /**
-   * Asynchronously gets an AddonInstall for an nsIFile.
-   *
-   * @param  aFile
-   *         the nsIFile where the add-on is located
-   * @param  aCallback
-   *         A callback to pass the AddonInstall to
-   * @param  aMimetype
-   *         An optional mimetype hint for the add-on
-   * @throws if the aFile or aCallback arguments are not specified
-   */
-  getInstallForFile: function AMI_getInstallForFile(aFile, aCallback, aMimetype) {
-    if (!aFile || !aCallback)
-      throw Cr.NS_ERROR_INVALID_ARG;
-
-    new AsyncObjectCaller(this.providers, "getInstallForFile", {
-      nextObject: function(aCaller, aProvider) {
-        callProvider(aProvider, "getInstallForFile", null, aFile,
-                     function(aInstall) {
-          if (aInstall)
-            safeCall(aCallback, aInstall);
-          else
-            aCaller.callNext();
-        });
-      },
-
-      noMoreObjects: function(aCaller) {
-        safeCall(aCallback, null);
-      }
-    });
-  },
-
-  /**
-   * Asynchronously gets all current AddonInstalls optionally limiting to a list
-   * of types.
-   *
-   * @param  aTypes
-   *         An optional array of types to retrieve. Each type is a string name
-   * @param  aCallback
-   *         A callback which will be passed an array of AddonInstalls
-   * @throws if the aCallback argument is not specified
-   */
-  getInstallsByTypes: function AMI_getInstallsByTypes(aTypes, aCallback) {
-    if (!aCallback)
-      throw Cr.NS_ERROR_INVALID_ARG;
-
-    let installs = [];
-
-    new AsyncObjectCaller(this.providers, "getInstallsByTypes", {
-      nextObject: function(aCaller, aProvider) {
-        callProvider(aProvider, "getInstallsByTypes", null, aTypes,
-                     function(aProviderInstalls) {
-          installs = installs.concat(aProviderInstalls);
-          aCaller.callNext();
-        });
-      },
-
-      noMoreObjects: function(aCaller) {
-        safeCall(aCallback, installs);
-      }
-    });
-  },
-
-  /**
-   * Asynchronously gets all current AddonInstalls.
-   *
-   * @param  aCallback
-   *         A callback which will be passed an array of AddonInstalls
-   */
-  getAllInstalls: function AMI_getAllInstalls(aCallback) {
-    this.getInstallsByTypes(null, aCallback);
-  },
-
-  /**
-   * Checks whether installation is enabled for a particular mimetype.
-   *
-   * @param  aMimetype
-   *         The mimetype to check
-   * @return true if installation is enabled for the mimetype
-   */
-  isInstallEnabled: function AMI_isInstallEnabled(aMimetype) {
-    for (let i = 0; i < this.providers.length; i++) {
-      if (callProvider(this.providers[i], "supportsMimetype", false, aMimetype) &&
-          callProvider(this.providers[i], "isInstallEnabled"))
-        return true;
-    }
-    return false;
-  },
-
-  /**
-   * Checks whether a particular source is allowed to install add-ons of a
-   * given mimetype.
-   *
-   * @param  aMimetype
-   *         The mimetype of the add-on
-   * @param  aURI
-   *         The uri of the source, may be null
-   * @return true if the source is allowed to install this mimetype
-   */
-  isInstallAllowed: function AMI_isInstallAllowed(aMimetype, aURI) {
-    for (let i = 0; i < this.providers.length; i++) {
-      if (callProvider(this.providers[i], "supportsMimetype", false, aMimetype) &&
-          callProvider(this.providers[i], "isInstallAllowed", null, aURI))
-        return true;
-    }
-    return false;
-  },
-
-  /**
-   * Starts installation of an array of AddonInstalls notifying the registered
-   * web install listener of blocked or started installs.
-   *
-   * @param  aMimetype
-   *         The mimetype of add-ons being installed
-   * @param  aSource
-   *         The nsIDOMWindowInternal that started the installs
-   * @param  aURI
-   *         the nsIURI that started the installs
-   * @param  aInstalls
-   *         The array of AddonInstalls to be installed
-   */
-  installAddonsFromWebpage: function AMI_installAddonsFromWebpage(aMimetype,
-                                                                  aSource,
-                                                                  aURI,
-                                                                  aInstalls) {
-    if (!("@mozilla.org/addons/web-install-listener;1" in Cc)) {
-      WARN("No web installer available, cancelling all installs");
-      aInstalls.forEach(function(aInstall) {
-        aInstall.cancel();
-      });
-      return;
-    }
-
-    try {
-      let weblistener = Cc["@mozilla.org/addons/web-install-listener;1"].
-                        getService(Ci.amIWebInstallListener);
-
-      if (!this.isInstallAllowed(aMimetype, aURI)) {
-        if (weblistener.onWebInstallBlocked(aSource, aURI, aInstalls,
-                                            aInstalls.length)) {
-          aInstalls.forEach(function(aInstall) {
-            aInstall.install();
-          });
-        }
-      }
-      else if (weblistener.onWebInstallRequested(aSource, aURI, aInstalls,
-                                                   aInstalls.length)) {
-        aInstalls.forEach(function(aInstall) {
-          aInstall.install();
-        });
-      }
-    }
-    catch (e) {
-      // In the event that the weblistener throws during instatiation or when
-      // calling onWebInstallBlocked or onWebInstallRequested all of the
-      // installs should get cancelled.
-      WARN("Failure calling web installer: " + e);
-      aInstalls.forEach(function(aInstall) {
-        aInstall.cancel();
-      });
-    }
-  },
-
-  /**
-   * Adds a new InstallListener if the listener is not already registered.
-   *
-   * @param  aListener
-   *         The InstallListener to add
-   */
-  addInstallListener: function AMI_addInstallListener(aListener) {
-    if (!this.installListeners.some(function(i) { return i == aListener; }))
-      this.installListeners.push(aListener);
-  },
-
-  /**
-   * Removes an InstallListener if the listener is registered.
-   *
-   * @param  aListener
-   *         The InstallListener to remove
-   */
-  removeInstallListener: function AMI_removeInstallListener(aListener) {
-    this.installListeners = this.installListeners.filter(function(i) {
-      return i != aListener;
-    });
-  },
-
-  /**
-   * Asynchronously gets an add-on with a specific ID.
-   *
-   * @param  aId
-   *         The ID of the add-on to retrieve
-   * @param  aCallback
-   *         The callback to pass the retrieved add-on to
-   * @throws if the aId or aCallback arguments are not specified
-   */
-  getAddonByID: function AMI_getAddonByID(aId, aCallback) {
-    if (!aId || !aCallback)
-      throw Cr.NS_ERROR_INVALID_ARG;
-
-    new AsyncObjectCaller(this.providers, "getAddonByID", {
-      nextObject: function(aCaller, aProvider) {
-        callProvider(aProvider, "getAddonByID", null, aId, function(aAddon) {
-          if (aAddon)
-            safeCall(aCallback, aAddon);
-          else
-            aCaller.callNext();
-        });
-      },
-
-      noMoreObjects: function(aCaller) {
-        safeCall(aCallback, null);
-      }
-    });
-  },
-
-  /**
-   * Asynchronously gets an array of add-ons.
-   *
-   * @param  aIds
-   *         The array of IDs to retrieve
-   * @param  aCallback
-   *         The callback to pass an array of Addons to
-   * @throws if the aId or aCallback arguments are not specified
-   */
-  getAddonsByIDs: function AMI_getAddonsByIDs(aIds, aCallback) {
-    if (!aIds || !aCallback)
-      throw Cr.NS_ERROR_INVALID_ARG;
-
-    let addons = [];
-
-    new AsyncObjectCaller(aIds, null, {
-      nextObject: function(aCaller, aId) {
-        AddonManagerInternal.getAddonByID(aId, function(aAddon) {
-          addons.push(aAddon);
-          aCaller.callNext();
-        });
-      },
-
-      noMoreObjects: function(aCaller) {
-        safeCall(aCallback, addons);
-      }
-    });
-  },
-
-  /**
-   * Asynchronously gets add-ons of specific types.
-   *
-   * @param  aTypes
-   *         An optional array of types to retrieve. Each type is a string name
-   * @param  aCallback
-   *         The callback to pass an array of Addons to.
-   * @throws if the aCallback argument is not specified
-   */
-  getAddonsByTypes: function AMI_getAddonsByTypes(aTypes, aCallback) {
-    if (!aCallback)
-      throw Cr.NS_ERROR_INVALID_ARG;
-
-    let addons = [];
-
-    new AsyncObjectCaller(this.providers, "getAddonsByTypes", {
-      nextObject: function(aCaller, aProvider) {
-        callProvider(aProvider, "getAddonsByTypes", null, aTypes,
-                     function(aProviderAddons) {
-          addons = addons.concat(aProviderAddons);
-          aCaller.callNext();
-        });
-      },
-
-      noMoreObjects: function(aCaller) {
-        safeCall(aCallback, addons);
-      }
-    });
-  },
-
-  /**
-   * Asynchronously gets all installed add-ons.
-   *
-   * @param  aCallback
-   *         A callback which will be passed an array of Addons
-   */
-  getAllAddons: function AMI_getAllAddons(aCallback) {
-    this.getAddonsByTypes(null, aCallback);
-  },
-
-  /**
-   * Asynchronously gets add-ons that have operations waiting for an application
-   * restart to complete.
-   *
-   * @param  aTypes
-   *         An optional array of types to retrieve. Each type is a string name
-   * @param  aCallback
-   *         The callback to pass the array of Addons to
-   * @throws if the aCallback argument is not specified
-   */
-  getAddonsWithOperationsByTypes:
-  function AMI_getAddonsWithOperationsByTypes(aTypes, aCallback) {
-    if (!aCallback)
-      throw Cr.NS_ERROR_INVALID_ARG;
-
-    let addons = [];
-
-    new AsyncObjectCaller(this.providers, "getAddonsWithOperationsByTypes", {
-      nextObject: function(aCaller, aProvider) {
-        callProvider(aProvider, "getAddonsWithOperationsByTypes", null, aTypes,
-                     function(aProviderAddons) {
-          addons = addons.concat(aProviderAddons);
-          aCaller.callNext();
-        });
-      },
-
-      noMoreObjects: function(caller) {
-        safeCall(aCallback, addons);
-      }
-    });
-  },
-
-  /**
-   * Adds a new AddonListener if the listener is not already registered.
-   *
-   * @param  aListener
-   *         The listener to add
-   */
-  addAddonListener: function AMI_addAddonListener(aListener) {
-    if (!this.addonListeners.some(function(i) { return i == aListener; }))
-      this.addonListeners.push(aListener);
-  },
-
-  /**
-   * Removes an AddonListener if the listener is registered.
-   *
-   * @param  aListener
-   *         The listener to remove
-   */
-  removeAddonListener: function AMI_removeAddonListener(aListener) {
-    this.addonListeners = this.addonListeners.filter(function(i) {
-      return i != aListener;
-    });
-  }
-};
-
-/**
- * Should not be used outside of core Mozilla code. This is a private API for
- * the startup and platform integration code to use. Refer to the methods on
- * AddonManagerInternal for documentation however note that these methods are
- * subject to change at any time.
- */
-var AddonManagerPrivate = {
-  startup: function AMP_startup() {
-    AddonManagerInternal.startup();
-  },
-
-  registerProvider: function AMP_registerProvider(aProvider) {
-    AddonManagerInternal.registerProvider(aProvider);
-  },
-
-  shutdown: function AMP_shutdown() {
-    AddonManagerInternal.shutdown();
-  },
-
-  backgroundUpdateCheck: function AMP_backgroundUpdateCheck() {
-    AddonManagerInternal.backgroundUpdateCheck();
-  },
-
-  notifyAddonChanged: function AMP_notifyAddonChanged(aId, aType, aPendingRestart) {
-    AddonManagerInternal.notifyAddonChanged(aId, aType, aPendingRestart);
-  },
-
-  updateAddonAppDisabledStates: function AMP_updateAddonAppDisabledStates() {
-    AddonManagerInternal.updateAddonAppDisabledStates();
-  },
-
-  callInstallListeners: function AMP_callInstallListeners(aMethod) {
-    return AddonManagerInternal.callInstallListeners.apply(AddonManagerInternal,
-                                                           arguments);
-  },
-
-  callAddonListeners: function AMP_callAddonListeners(aMethod) {
-    AddonManagerInternal.callAddonListeners.apply(AddonManagerInternal, arguments);
-  }
-};
-
-/**
- * This is the public API that UI and developers should be calling. All methods
- * just forward to AddonManagerInternal.
- */
-var AddonManager = {
-  // Constants for the AddonInstall.state property
-  // The install is available for download.
-  STATE_AVAILABLE: 0,
-  // The install is being downloaded.
-  STATE_DOWNLOADING: 1,
-  // The install is checking for compatibility information.
-  STATE_CHECKING: 2,
-  // The install is downloaded and ready to install.
-  STATE_DOWNLOADED: 3,
-  // The download failed.
-  STATE_DOWNLOAD_FAILED: 4,
-  // The add-on is being installed.
-  STATE_INSTALLING: 5,
-  // The add-on has been installed.
-  STATE_INSTALLED: 6,
-  // The install failed.
-  STATE_INSTALL_FAILED: 7,
-  // The install has been cancelled.
-  STATE_CANCELLED: 8,
-
-  // Constants representing different types of errors while downloading an
-  // add-on.
-  // The download failed due to network problems.
-  ERROR_NETWORK_FAILURE: -1,
-  // The downloaded file did not match the provided hash.
-  ERROR_INCORRECT_HASH: -2,
-  // The downloaded file seems to be corrupted in some way.
-  ERROR_CORRUPT_FILE: -3,
-
-  // Constants to indicate why an update check is being performed
-  // Update check has been requested by the user.
-  UPDATE_WHEN_USER_REQUESTED: 1,
-  // Update check is necessary to see if the Addon is compatibile with a new
-  // version of the application.
-  UPDATE_WHEN_NEW_APP_DETECTED: 2,
-  // Update check is necessary because a new application has been installed.
-  UPDATE_WHEN_NEW_APP_INSTALLED: 3,
-  // Update check is a regular background update check.
-  UPDATE_WHEN_PERIODIC_UPDATE: 16,
-  // Update check is needed to check an Addon that is being installed.
-  UPDATE_WHEN_ADDON_INSTALLED: 17,
-
-  // Constants for operations in Addon.pendingOperations
-  // Indicates that the Addon has no pending operations.
-  PENDING_NONE: 0,
-  // Indicates that the Addon will be enabled after the application restarts.
-  PENDING_ENABLE: 1,
-  // Indicates that the Addon will be disabled after the application restarts.
-  PENDING_DISABLE: 2,
-  // Indicates that the Addon will be uninstalled after the application restarts.
-  PENDING_UNINSTALL: 4,
-  // Indicates that the Addon will be installed after the application restarts.
-  PENDING_INSTALL: 8,
-  PENDING_UPGRADE: 16,
-
-  // Constants for permissions in Addon.permissions.
-  // Indicates that the Addon can be uninstalled.
-  PERM_CAN_UNINSTALL: 1,
-  // Indicates that the Addon can be enabled by the user.
-  PERM_CAN_ENABLE: 2,
-  // Indicates that the Addon can be disabled by the user.
-  PERM_CAN_DISABLE: 4,
-  // Indicates that the Addon can be upgraded.
-  PERM_CAN_UPGRADE: 8,
-
-  // General descriptions of where items are installed.
-  // Installed in this profile.
-  SCOPE_PROFILE: 1,
-  // Installed for all of this user's profiles.
-  SCOPE_USER: 2,
-  // Installed and owned by the application.
-  SCOPE_APPLICATION: 4,
-  // Installed for all users of the computer.
-  SCOPE_SYSTEM: 8,
-  // The combination of all scopes.
-  SCOPE_ALL: 15,
-
-  getInstallForURL: function AM_getInstallForURL(aUrl, aCallback, aMimetype,
-                                                 aHash, aName, aIconURL,
-                                                 aVersion, aLoadGroup) {
-    AddonManagerInternal.getInstallForURL(aUrl, aCallback, aMimetype, aHash,
-                                          aName, aIconURL, aVersion, aLoadGroup);
-  },
-
-  getInstallForFile: function AM_getInstallForFile(aFile, aCallback, aMimetype) {
-    AddonManagerInternal.getInstallForFile(aFile, aCallback, aMimetype);
-  },
-
-  getAddonByID: function AM_getAddonByID(aId, aCallback) {
-    AddonManagerInternal.getAddonByID(aId, aCallback);
-  },
-
-  getAddonsByIDs: function AM_getAddonsByIDs(aIds, aCallback) {
-    AddonManagerInternal.getAddonsByIDs(aIds, aCallback);
-  },
-
-  getAddonsWithOperationsByTypes:
-  function AM_getAddonsWithOperationsByTypes(aTypes, aCallback) {
-    AddonManagerInternal.getAddonsWithOperationsByTypes(aTypes, aCallback);
-  },
-
-  getAddonsByTypes: function AM_getAddonsByTypes(aTypes, aCallback) {
-    AddonManagerInternal.getAddonsByTypes(aTypes, aCallback);
-  },
-
-  getAllAddons: function AM_getAllAddons(aCallback) {
-    AddonManagerInternal.getAllAddons(aCallback);
-  },
-
-  getInstallsByTypes: function AM_getInstallsByTypes(aTypes, aCallback) {
-    AddonManagerInternal.getInstallsByTypes(aTypes, aCallback);
-  },
-
-  getAllInstalls: function AM_getAllInstalls(aCallback) {
-    AddonManagerInternal.getAllInstalls(aCallback);
-  },
-
-  isInstallEnabled: function AM_isInstallEnabled(aType) {
-    return AddonManagerInternal.isInstallEnabled(aType);
-  },
-
-  isInstallAllowed: function AM_isInstallAllowed(aType, aUri) {
-    return AddonManagerInternal.isInstallAllowed(aType, aUri);
-  },
-
-  installAddonsFromWebpage: function AM_installAddonsFromWebpage(aType, aSource,
-                                                                 aUri, aInstalls) {
-    AddonManagerInternal.installAddonsFromWebpage(aType, aSource, aUri, aInstalls);
-  },
-
-  addInstallListener: function AM_addInstallListener(aListener) {
-    AddonManagerInternal.addInstallListener(aListener);
-  },
-
-  removeInstallListener: function AM_removeInstallListener(aListener) {
-    AddonManagerInternal.removeInstallListener(aListener);
-  },
-
-  addAddonListener: function AM_addAddonListener(aListener) {
-    AddonManagerInternal.addAddonListener(aListener);
-  },
-
-  removeAddonListener: function AM_removeAddonListener(aListener) {
-    AddonManagerInternal.removeAddonListener(aListener);
-  }
-};
deleted file mode 100644
--- a/toolkit/mozapps/extensions/AddonUpdateChecker.jsm
+++ /dev/null
@@ -1,658 +0,0 @@
-/*
-# ***** 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 the Extension Manager.
-#
-# The Initial Developer of the Original Code is
-# the Mozilla Foundation.
-# Portions created by the Initial Developer are Copyright (C) 2009
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Dave Townsend <dtownsend@oxymoronical.com>
-#
-# 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 *****
-*/
-
-/**
- * The AddonUpdateChecker is responsible for retrieving the update information
- * from an add-on's remote update manifest.
- */
-
-const Cc = Components.classes;
-const Ci = Components.interfaces;
-
-var EXPORTED_SYMBOLS = [ "AddonUpdateChecker" ];
-
-const TIMEOUT               = 2 * 60 * 1000;
-const PREFIX_NS_RDF         = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
-const PREFIX_NS_EM          = "http://www.mozilla.org/2004/em-rdf#";
-const PREFIX_ITEM           = "urn:mozilla:item:";
-const PREFIX_EXTENSION      = "urn:mozilla:extension:";
-const PREFIX_THEME          = "urn:mozilla:theme:";
-const TOOLKIT_ID            = "toolkit@mozilla.org"
-const XMLURI_PARSE_ERROR    = "http://www.mozilla.org/newlayout/xml/parsererror.xml"
-
-Components.utils.import("resource://gre/modules/Services.jsm");
-// shared code for suppressing bad cert dialogs
-Components.utils.import("resource://gre/modules/CertUtils.jsm");
-
-var gRDF = Cc["@mozilla.org/rdf/rdf-service;1"].
-           getService(Ci.nsIRDFService);
-
-["LOG", "WARN", "ERROR"].forEach(function(aName) {
-  this.__defineGetter__(aName, function() {
-    Components.utils.import("resource://gre/modules/AddonLogging.jsm");
-
-    LogManager.getLogger("addons.updates", this);
-    return this[aName];
-  });
-}, this);
-
-/**
- * A serialisation method for RDF data that produces an identical string
- * for matching RDF graphs.
- * The serialisation is not complete, only assertions stemming from a given
- * resource are included, multiple references to the same resource are not
- * permitted, and the RDF prolog and epilog are not included.
- * RDF Blob and Date literals are not supported.
- */
-function RDFSerializer() {
-  this.cUtils = Cc["@mozilla.org/rdf/container-utils;1"].
-                getService(Ci.nsIRDFContainerUtils);
-  this.resources = [];
-}
-
-RDFSerializer.prototype = {
-  INDENT: "  ",      // The indent used for pretty-printing
-  resources: null,   // Array of the resources that have been found
-
-  /**
-   * Escapes characters from a string that should not appear in XML.
-   *
-   * @param  aString
-   *         The string to be escaped
-   * @return a string with all characters invalid in XML character data
-   *         converted to entity references.
-   */
-  escapeEntities: function RDFS_escapeEntities(aString) {
-    aString = aString.replace(/&/g, "&amp;");
-    aString = aString.replace(/</g, "&lt;");
-    aString = aString.replace(/>/g, "&gt;");
-    return aString.replace(/"/g, "&quot;");
-  },
-
-  /**
-   * Serializes all the elements of an RDF container.
-   *
-   * @param  aDs
-   *         The RDF datasource
-   * @param  aContainer
-   *         The RDF container to output the child elements of
-   * @param  aIndent
-   *         The current level of indent for pretty-printing
-   * @return a string containing the serialized elements.
-   */
-  serializeContainerItems: function RDFS_serializeContainerItems(aDs, aContainer,
-                                                                 aIndent) {
-    var result = "";
-    var items = aContainer.GetElements();
-    while (items.hasMoreElements()) {
-      var item = items.getNext().QueryInterface(Ci.nsIRDFResource);
-      result += aIndent + "<RDF:li>\n"
-      result += this.serializeResource(aDs, item, aIndent + this.INDENT);
-      result += aIndent + "</RDF:li>\n"
-    }
-    return result;
-  },
-
-  /**
-   * Serializes all em:* (see EM_NS) properties of an RDF resource except for
-   * the em:signature property. As this serialization is to be compared against
-   * the manifest signature it cannot contain the em:signature property itself.
-   *
-   * @param  aDs
-   *         The RDF datasource
-   * @param  aResource
-   *         The RDF resource that contains the properties to serialize
-   * @param  aIndent
-   *         The current level of indent for pretty-printing
-   * @return a string containing the serialized properties.
-   * @throws if the resource contains a property that cannot be serialized
-   */
-  serializeResourceProperties: function RDFS_serializeResourceProperties(aDs,
-                                                                         aResource,
-                                                                         aIndent) {
-    var result = "";
-    var items = [];
-    var arcs = aDs.ArcLabelsOut(aResource);
-    while (arcs.hasMoreElements()) {
-      var arc = arcs.getNext().QueryInterface(Ci.nsIRDFResource);
-      if (arc.ValueUTF8.substring(0, PREFIX_NS_EM.length) != PREFIX_NS_EM)
-        continue;
-      var prop = arc.ValueUTF8.substring(PREFIX_NS_EM.length);
-      if (prop == "signature")
-        continue;
-
-      var targets = aDs.GetTargets(aResource, arc, true);
-      while (targets.hasMoreElements()) {
-        var target = targets.getNext();
-        if (target instanceof Ci.nsIRDFResource) {
-          var item = aIndent + "<em:" + prop + ">\n";
-          item += this.serializeResource(aDs, target, aIndent + this.INDENT);
-          item += aIndent + "</em:" + prop + ">\n";
-          items.push(item);
-        }
-        else if (target instanceof Ci.nsIRDFLiteral) {
-          items.push(aIndent + "<em:" + prop + ">" +
-                     this.escapeEntities(target.Value) + "</em:" + prop + ">\n");
-        }
-        else if (target instanceof Ci.nsIRDFInt) {
-          items.push(aIndent + "<em:" + prop + " NC:parseType=\"Integer\">" +
-                     target.Value + "</em:" + prop + ">\n");
-        }
-        else {
-          throw new Error("Cannot serialize unknown literal type");
-        }
-      }
-    }
-    items.sort();
-    result += items.join("");
-    return result;
-  },
-
-  /**
-   * Recursively serializes an RDF resource and all resources it links to.
-   * This will only output EM_NS properties and will ignore any em:signature
-   * property.
-   *
-   * @param  aDs
-   *         The RDF datasource
-   * @param  aResource
-   *         The RDF resource to serialize
-   * @param  aIndent
-   *         The current level of indent for pretty-printing. If undefined no
-   *         indent will be added
-   * @return a string containing the serialized resource.
-   * @throws if the RDF data contains multiple references to the same resource.
-   */
-  serializeResource: function RDFS_serializeResource(aDs, aResource, aIndent) {
-    if (this.resources.indexOf(aResource) != -1 ) {
-      // We cannot output multiple references to the same resource.
-      throw new Error("Cannot serialize multiple references to " + aResource.Value);
-    }
-    if (aIndent === undefined)
-      aIndent = "";
-
-    this.resources.push(aResource);
-    var container = null;
-    var type = "Description";
-    if (this.cUtils.IsSeq(aDs, aResource)) {
-      type = "Seq";
-      container = this.cUtils.MakeSeq(aDs, aResource);
-    }
-    else if (this.cUtils.IsAlt(aDs, aResource)) {
-      type = "Alt";
-      container = this.cUtils.MakeAlt(aDs, aResource);
-    }
-    else if (this.cUtils.IsBag(aDs, aResource)) {
-      type = "Bag";
-      container = this.cUtils.MakeBag(aDs, aResource);
-    }
-
-    var result = aIndent + "<RDF:" + type;
-    if (!gRDF.IsAnonymousResource(aResource))
-      result += " about=\"" + this.escapeEntities(aResource.ValueUTF8) + "\"";
-    result += ">\n";
-
-    if (container)
-      result += this.serializeContainerItems(aDs, container, aIndent + this.INDENT);
-
-    result += this.serializeResourceProperties(aDs, aResource, aIndent + this.INDENT);
-
-    result += aIndent + "</RDF:" + type + ">\n";
-    return result;
-  }
-}
-
-/**
- * Parses an RDF style update manifest into an array of update objects.
- *
- * @param  aId
- *         The ID of the add-on being checked for updates
- * @param  aType
- *         The type of the add-on being checked for updates
- * @param  aUpdateKey
- *         An optional update key for the add-on
- * @param  aRequest
- *         The XMLHttpRequest that has retrieved the update manifest
- * @return an array of update objects
- * @throws if the update manifest is invalid in any way
- */
-function parseRDFManifest(aId, aType, aUpdateKey, aRequest) {
-  function EM_R(aProp) {
-    return gRDF.GetResource(PREFIX_NS_EM + aProp);
-  }
-
-  function getValue(aLiteral) {
-    if (aLiteral instanceof Ci.nsIRDFLiteral)
-      return aLiteral.Value;
-    if (aLiteral instanceof Ci.nsIRDFResource)
-      return aLiteral.Value;
-    if (aLiteral instanceof Ci.nsIRDFInt)
-      return aLiteral.Value;
-    return null;
-  }
-
-  function getProperty(aDs, aSource, aProperty) {
-    return getValue(aDs.GetTarget(aSource, EM_R(aProperty), true));
-  }
-
-  function getRequiredProperty(aDs, aSource, aProperty) {
-    let value = getProperty(aDs, aSource, aProperty);
-    if (!value)
-      throw new Error("Update manifest is missing a required " + aProperty + " property.");
-    return value;
-  }
-
-  let rdfParser = Cc["@mozilla.org/rdf/xml-parser;1"].
-                  createInstance(Ci.nsIRDFXMLParser);
-  let ds = Cc["@mozilla.org/rdf/datasource;1?name=in-memory-datasource"].
-           createInstance(Ci.nsIRDFDataSource);
-  rdfParser.parseString(ds, aRequest.channel.URI, aRequest.responseText);
-
-  switch (aType) {
-  case "extension":
-    var item = PREFIX_EXTENSION + aId;
-    break;
-  case "theme":
-    item = PREFIX_THEME + aId;
-    break;
-  default:
-    item = PREFIX_ITEM + aId;
-    break;
-  }
-
-  let extensionRes  = gRDF.GetResource(item);
-
-  // If we have an update key then the update manifest must be signed
-  if (aUpdateKey) {
-    let signature = getProperty(ds, extensionRes, "signature");
-    if (!signature)
-      throw new Error("Update manifest for " + aId + " does not contain a required signature");
-    let serializer = new RDFSerializer();
-    let updateString = null;
-
-    try {
-      updateString = serializer.serializeResource(ds, extensionRes);
-    }
-    catch (e) {
-      throw new Error("Failed to generate signed string for " + aId + ". Serializer threw " + e);
-    }
-
-    let result = false;
-
-    try {
-      let verifier = Cc["@mozilla.org/security/datasignatureverifier;1"].
-                     getService(Ci.nsIDataSignatureVerifier);
-      result = verifier.verifyData(updateString, signature, aUpdateKey);
-    }
-    catch (e) {
-      throw new Error("The signature or updateKey for " + aId + " is malformed");
-    }
-
-    if (!result)
-      throw new Error("The signature for " + aId + " was not created by the add-on's updateKey");
-  }
-
-  let updates = ds.GetTarget(extensionRes, EM_R("updates"), true);
-
-  if (!updates || !(updates instanceof Ci.nsIRDFResource))
-    throw new Error("Missing updates property for " + extensionRes.Value);
-
-  let cu = Cc["@mozilla.org/rdf/container-utils;1"].
-           getService(Ci.nsIRDFContainerUtils);
-  if (!cu.IsContainer(ds, updates))
-    throw new Error("Updates property was not an RDF container");
-
-  let checkSecurity = true;
-
-  try {
-    checkSecurity = Services.prefs.getBoolPref("extensions.checkUpdateSecurity");
-  }
-  catch (e) {
-  }
-
-  let results = [];
-  let ctr = Cc["@mozilla.org/rdf/container;1"].
-            createInstance(Ci.nsIRDFContainer);
-  ctr.Init(ds, updates);
-  let items = ctr.GetElements();
-  while (items.hasMoreElements()) {
-    let item = items.getNext().QueryInterface(Ci.nsIRDFResource);
-    let version = getProperty(ds, item, "version");
-    if (!version) {
-      WARN("Update manifest is missing a required version property.");
-      continue;
-    }
-
-    LOG("Found an update entry for " + aId + " version " + version);
-
-    let targetApps = ds.GetTargets(item, EM_R("targetApplication"), true);
-    while (targetApps.hasMoreElements()) {
-      let targetApp = targetApps.getNext().QueryInterface(Ci.nsIRDFResource);
-
-      let appEntry = {};
-      try {
-        appEntry.id = getRequiredProperty(ds, targetApp, "id");
-        appEntry.minVersion = getRequiredProperty(ds, targetApp, "minVersion");
-        appEntry.maxVersion = getRequiredProperty(ds, targetApp, "maxVersion");
-      }
-      catch (e) {
-        WARN(e);
-        continue;
-      }
-
-      let result = {
-        version: version,
-        updateURL: getProperty(ds, targetApp, "updateLink"),
-        updateHash: getProperty(ds, targetApp, "updateHash"),
-        updateInfoURL: getProperty(ds, targetApp, "updateInfoURL"),
-        targetApplications: [appEntry]
-      };
-
-      if (result.updateURL && checkSecurity &&
-          result.updateURL.substring(0, 6) != "https:" &&
-          (!result.updateHash || result.updateHash.substring(0, 3) != "sha")) {
-        WARN("updateLink " + result.updateURL + " is not secure and is not verified" +
-             " by a strong enough hash (needs to be sha1 or stronger).");
-        delete result.updateURL;
-        delete result.updateHash;
-      }
-      results.push(result);
-    }
-  }
-  return results;
-}
-
-/**
- * Starts downloading an update manifest and then passes it to an appropriate
- * parser to convert to an array of update objects
- *
- * @param  aId
- *         The ID of the add-on being checked for updates
- * @param  aType
- *         The type of add-on being checked for updates
- * @param  aUpdateKey
- *         An optional update key for the add-on
- * @param  aUrl
- *         The URL of the update manifest
- * @param  aObserver
- *         An observer to pass results to
- */
-function UpdateParser(aId, aType, aUpdateKey, aUrl, aObserver) {
-  this.id = aId;
-  this.type = aType;
-  this.updateKey = aUpdateKey;
-  this.observer = aObserver;
-
-  this.timer = Cc["@mozilla.org/timer;1"].
-               createInstance(Ci.nsITimer);
-  this.timer.initWithCallback(this, TIMEOUT, Ci.nsITimer.TYPE_ONE_SHOT);
-
-  LOG("Requesting " + aUrl);
-  this.request = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].
-                 createInstance(Ci.nsIXMLHttpRequest);
-  this.request.open("GET", aUrl, true);
-  this.request.channel.notificationCallbacks = new BadCertHandler();
-  this.request.channel.loadFlags |= Ci.nsIRequest.LOAD_BYPASS_CACHE;
-  this.request.overrideMimeType("text/xml");
-  var self = this;
-  this.request.onload = function(event) { self.onLoad() };
-  this.request.onerror = function(event) { self.onError() };
-  this.request.send(null);
-}
-
-UpdateParser.prototype = {
-  id: null,
-  type: null,
-  updateKey: null,
-  observer: null,
-  request: null,
-  timer: null,
-
-  /**
-   * Called when the manifest has been successfully loaded.
-   */
-  onLoad: function UP_onLoad() {
-    this.timer.cancel();
-    this.timer = null;
-    let request = this.request;
-    this.request = null;
-
-    try {
-      checkCert(request.channel);
-    }
-    catch (e) {
-      this.notifyError(AddonUpdateChecker.ERROR_DOWNLOAD_ERROR);
-      return;
-    }
-
-    if (!Components.isSuccessCode(request.status)) {
-      WARN("Request failed: " + request.status);
-      this.notifyError(AddonUpdateChecker.ERROR_DOWNLOAD_ERROR);
-      return;
-    }
-
-    let xml = request.responseXML;
-    if (!xml || xml.documentElement.namespaceURI == XMLURI_PARSE_ERROR) {
-      WARN("Update manifest was not valid XML");
-      this.notifyError(AddonUpdateChecker.ERROR_PARSE_ERROR);
-      return;
-    }
-
-    // We currently only know about RDF update manifests
-    if (xml.documentElement.namespaceURI == PREFIX_NS_RDF) {
-      let results = null;
-
-      try {
-        results = parseRDFManifest(this.id, this.type, this.updateKey, request);
-      }
-      catch (e) {
-        WARN(e);
-        this.notifyError(AddonUpdateChecker.ERROR_PARSE_ERROR);
-        return;
-      }
-      if ("onUpdateCheckComplete" in this.observer)
-        this.observer.onUpdateCheckComplete(results);
-      return;
-    }
-
-    WARN("Update manifest had an unrecognised namespace: " + xml.documentElement.namespaceURI);
-    this.notifyError(AddonUpdateChecker.ERROR_UNKNOWN_FORMAT);
-  },
-
-  /**
-   * Called when the manifest failed to load.
-   */
-  onError: function UP_onError() {
-    this.timer.cancel();
-    this.timer = null;
-
-    WARN("Request failed: " + this.request.status);
-    this.request = null;
-
-    this.notifyError(AddonUpdateChecker.ERROR_DOWNLOAD_ERROR);
-  },
-
-  /**
-   * Helper method to notify the observer that an error occured.
-   */
-  notifyError: function UP_notifyError(aStatus) {
-    if ("onUpdateCheckError" in this.observer)
-      this.observer.onUpdateCheckError(aStatus);
-  },
-
-  /**
-   * Called when the request has timed out and should be canceled.
-   */
-  notify: function UP_notify(aTimer) {
-    this.timer = null;
-    this.request.abort();
-    this.request = null;
-
-    WARN("Request timed out");
-
-    this.notifyError(AddonUpdateChecker.ERROR_TIMEOUT);
-  }
-};
-
-/**
- * Tests if an update matches a version of the application or platform
- *
- * @param  aUpdate
- *         The available update
- * @param  aAppVersion
- *         The application version to use
- * @param  aPlatformVersion
- *         The platform version to use
- * @return true if the update is compatible with the application/platform
- */
-function matchesVersions(aUpdate, aAppVersion, aPlatformVersion) {
-  let result = false;
-  for (let i = 0; i < aUpdate.targetApplications.length; i++) {
-    let app = aUpdate.targetApplications[i];
-    if (app.id == Services.appinfo.ID) {
-      return (Services.vc.compare(aAppVersion, app.minVersion) >= 0) &&
-             (Services.vc.compare(aAppVersion, app.maxVersion) <= 0);
-    }
-    if (app.id == TOOLKIT_ID) {
-      result = (Services.vc.compare(aPlatformVersion, app.minVersion) >= 0) &&
-               (Services.vc.compare(aPlatformVersion, app.maxVersion) <= 0);
-    }
-  }
-  return result;
-}
-
-var AddonUpdateChecker = {
-  ERROR_TIMEOUT: -1,
-  ERROR_DOWNLOAD_ERROR: -2,
-  ERROR_PARSE_ERROR: -3,
-  ERROR_UNKNOWN_FORMAT: -4,
-  ERROR_SECURITY_ERROR: -5,
-
-  /**
-   * Retrieves the best matching compatibility update for the application from
-   * a list of available update objects.
-   *
-   * @param  aUpdates
-   *         An array of update objects
-   * @param  aVersion
-   *         The version of the add-on to get new compatibility information for
-   * @param  aIgnoreCompatibility
-   *         An optional parameter to get the first compatibility update that
-   *         is compatible with any version of the application or toolkit
-   * @param  aAppVersion
-   *         The version of the application or null to use the current version
-   * @param  aPlatformVersion
-   *         The version of the platform or null to use the current version
-   * @return an update object if one matches or null if not
-   */
-  getCompatibilityUpdate: function AUC_getCompatibilityUpdate(aUpdates, aVersion,
-                                                              aIgnoreCompatibility,
-                                                              aAppVersion,
-                                                              aPlatformVersion) {
-    if (!aAppVersion)
-      aAppVersion = Services.appinfo.version;
-    if (!aPlatformVersion)
-      aPlatformVersion = Services.appinfo.platformVersion;
-
-    for (let i = 0; i < aUpdates.length; i++) {
-      if (Services.vc.compare(aUpdates[i].version, aVersion) == 0) {
-        if (aIgnoreCompatibility) {
-          for (let j = 0; j < aUpdates[i].targetApplications.length; j++) {
-            let id = aUpdates[i].targetApplications[j].id;
-            if (id == Services.appinfo.ID || id == TOOLKIT_ID)
-              return aUpdates[i];
-          }
-        }
-        else if (matchesVersions(aUpdates[i], aAppVersion, aPlatformVersion)) {
-          return aUpdates[i];
-        }
-      }
-    }
-    return null;
-  },
-
-  /**
-   * Returns the newest available update from a list of update objects.
-   *
-   * @param  aUpdates
-   *         An array of update objects
-   * @param  aAppVersion
-   *         The version of the application or null to use the current version
-   * @param  aPlatformVersion
-   *         The version of the platform or null to use the current version
-   * @return an update object if one matches or null if not
-   */
-  getNewestCompatibleUpdate: function AUC_getNewestCompatibleUpdate(aUpdates,
-                                                                    aAppVersion,
-                                                                    aPlatformVersion) {
-    if (!aAppVersion)
-      aAppVersion = Services.appinfo.version;
-    if (!aPlatformVersion)
-      aPlatformVersion = Services.appinfo.platformVersion;
-
-    let newest = null;
-    for (let i = 0; i < aUpdates.length; i++) {
-      if (!aUpdates[i].updateURL)
-        continue;
-      if ((newest == null || (Services.vc.compare(newest.version, aUpdates[i].version) < 0)) &&
-          matchesVersions(aUpdates[i], aAppVersion, aPlatformVersion))
-        newest = aUpdates[i];
-    }
-    return newest;
-  },
-
-  /**
-   * Starts an update check.
-   *
-   * @param  aId
-   *         The ID of the add-on being checked for updates
-   * @param  aType
-   *         The type of add-on being checked for updates
-   * @param  aUpdateKey
-   *         An optional update key for the add-on
-   * @param  aUrl
-   *         The URL of the add-on's update manifest
-   * @param  aObserver
-   *         An observer to notify of results
-   */
-  checkForUpdates: function AUC_checkForUpdates(aId, aType, aUpdateKey, aUrl,
-                                                aObserver) {
-    new UpdateParser(aId, aType, aUpdateKey, aUrl, aObserver);
-  }
-};
--- a/toolkit/mozapps/extensions/LightweightThemeManager.jsm
+++ b/toolkit/mozapps/extensions/LightweightThemeManager.jsm
@@ -34,24 +34,16 @@
  *
  * ***** END LICENSE BLOCK ***** */
 
 var EXPORTED_SYMBOLS = ["LightweightThemeManager"];
 
 const Cc = Components.classes;
 const Ci = Components.interfaces;
 
-Components.utils.import("resource://gre/modules/AddonManager.jsm");
-Components.utils.import("resource://gre/modules/Services.jsm");
-
-const ID_SUFFIX              = "@personas.mozilla.org";
-const PREF_LWTHEME_TO_SELECT = "extensions.lwThemeToSelect";
-const PREF_GENERAL_SKINS_SELECTEDSKIN = "general.skins.selectedSkin";
-const ADDON_TYPE             = "theme";
-
 const MAX_USED_THEMES_COUNT = 8;
 
 const MAX_PREVIEW_SECONDS = 30;
 
 const MANDATORY = ["id", "name", "headerURL"];
 const OPTIONAL = ["footerURL", "textcolor", "accentcolor", "iconURL",
                   "previewURL", "author", "description", "homepageURL",
                   "updateURL", "version"];
@@ -130,31 +122,21 @@ var LightweightThemeManager = {
     for (let i = 0; i < usedThemes.length; i++) {
       if (usedThemes[i].id == aId)
         return usedThemes[i];
     }
     return null;
   },
 
   forgetUsedTheme: function (aId) {
-    let theme = this.getUsedTheme(aId);
-    if (!theme)
-      return;
-
-    let wrapper = new AddonWrapper(theme);
-    AddonManagerPrivate.callAddonListeners("onUninstalling", wrapper, false);
-
     var currentTheme = this.currentTheme;
-    if (currentTheme && currentTheme.id == aId) {
-      _prefs.setBoolPref("isThemeSelected", false);
-      AddonManagerPrivate.notifyAddonChanged(null, ADDON_TYPE, false);
-    }
+    if (currentTheme && currentTheme.id == aId)
+      this.currentTheme = null;
 
     _updateUsedThemes(_usedThemesExceptId(aId));
-    AddonManagerPrivate.callAddonListeners("onUninstalled", wrapper);
   },
 
   previewTheme: function (aData) {
     if (!aData)
       return;
 
     let cancel = Cc["@mozilla.org/supports-PRBool;1"].createInstance(Ci.nsISupportsPRBool);
     cancel.data = false;
@@ -221,338 +203,52 @@ var LightweightThemeManager = {
         return;
 
       var currentTheme = self.currentTheme;
       if (currentTheme && currentTheme.id == theme.id)
         self.currentTheme = newData;
     };
 
     req.send(null);
-  },
-
-  /**
-   * Switches to a new lightweight theme.
-   *
-   * @param  aData
-   *         The lightweight theme to switch to
-   */
-  themeChanged: function(aData) {
-    if (_previewTimer) {
-      _previewTimer.cancel();
-      _previewTimer = null;
-    }
-
-    if (aData) {
-      let usedThemes = _usedThemesExceptId(aData.id);
-      usedThemes.unshift(aData);
-      _updateUsedThemes(usedThemes);
-      if (PERSIST_ENABLED)
-        _persistImages(aData);
-    }
-
-    _prefs.setBoolPref("isThemeSelected", aData != null);
-    _notifyWindows(aData);
-    _observerService.notifyObservers(null, "lightweight-theme-changed", null);
-  },
-
-  /**
-   * Starts the Addons provider and enables the new lightweight theme if
-   * necessary.
-   */
-  startup: function() {
-    if (Services.prefs.prefHasUserValue(PREF_LWTHEME_TO_SELECT)) {
-      let id = Services.prefs.getCharPref(PREF_LWTHEME_TO_SELECT);
-      if (id)
-        this.themeChanged(this.getUsedTheme(id));
-      else
-        this.themeChanged(null);
-      Services.prefs.clearUserPref(PREF_LWTHEME_TO_SELECT);
-    }
-  },
-
-  /**
-   * Called when a new add-on has been enabled when only one add-on of that type
-   * can be enabled.
-   *
-   * @param  aId
-   *         The ID of the newly enabled add-on
-   * @param  aType
-   *         The type of the newly enabled add-on
-   * @param  aPendingRestart
-   *         true if the newly enabled add-on will only become enabled after a
-   *         restart
-   */
-  addonChanged: function(aId, aType, aPendingRestart) {
-    if (aType != ADDON_TYPE)
-      return;
-
-    let id = _getInternalID(aId);
-    let current = this.currentTheme;
-
-    try {
-      let next = Services.prefs.getCharPref(PREF_LWTHEME_TO_SELECT);
-      if (id == next && aPendingRestart)
-        return;
-
-      Services.prefs.clearUserPref(PREF_LWTHEME_TO_SELECT);
-      if (next) {
-        AddonManagerPrivate.callAddonListeners("onOperationCancelled",
-                                               new AddonWrapper(this.getUsedTheme(next)));
-      }
-      else {
-        if (id == current.id) {
-          AddonManagerPrivate.callAddonListeners("onOperationCancelled",
-                                                 new AddonWrapper(current));
-          return;
-        }
-      }
-    }
-    catch (e) {
-    }
-
-    if (current) {
-      if (current.id == id)
-        return;
-      let wrapper = new AddonWrapper(current);
-      if (aPendingRestart) {
-        Services.prefs.setCharPref(PREF_LWTHEME_TO_SELECT, "");
-        AddonManagerPrivate.callAddonListeners("onDisabling", wrapper, true);
-      }
-      else {
-        AddonManagerPrivate.callAddonListeners("onDisabling", wrapper, false);
-        this.themeChanged(null);
-        AddonManagerPrivate.callAddonListeners("onDisabled", wrapper);
-      }
-    }
-
-    if (id) {
-      let theme = this.getUsedTheme(id);
-      let wrapper = new AddonWrapper(theme, true);
-      if (aPendingRestart) {
-        AddonManagerPrivate.callAddonListeners("onEnabling", wrapper, true);
-        Services.prefs.setCharPref(PREF_LWTHEME_TO_SELECT, id);
-      }
-      else {
-        AddonManagerPrivate.callAddonListeners("onEnabling", wrapper, false);
-        this.themeChanged(theme);
-        AddonManagerPrivate.callAddonListeners("onEnabled", wrapper);
-      }
-    }
-  },
-
-  /**
-   * Called to get an Addon with a particular ID.
-   *
-   * @param  aId
-   *         The ID of the add-on to retrieve
-   * @param  aCallback
-   *         A callback to pass the Addon to
-   */
-  getAddonByID: function(aId, aCallback) {
-    let id = _getInternalID(aId);
-    if (!id) {
-      aCallback(null);
-      return;
-     }
-
-    let theme = this.getUsedTheme(id);
-    if (!theme) {
-      aCallback(null);
-      return;
-    }
-
-    aCallback(new AddonWrapper(theme));
-  },
-
-  /**
-   * Called to get Addons of a particular type.
-   *
-   * @param  aTypes
-   *         An array of types to fetch. Can be null to get all types.
-   * @param  aCallback
-   *         A callback to pass an array of Addons to
-   */
-  getAddonsByTypes: function(aTypes, aCallback) {
-    if (aTypes && aTypes.indexOf(ADDON_TYPE) == -1) {
-      aCallback([]);
-      return;
-    }
-
-    aCallback([new AddonWrapper(a) for each (a in this.usedThemes)]);
-  },
-};
-
-/**
- * The AddonWrapper wraps lightweight theme to provide the data visible to
- * consumers of the AddonManager API.
- */
-function AddonWrapper(aTheme, aBeingEnabled) {
-  this.__defineGetter__("id", function() aTheme.id + ID_SUFFIX);
-  this.__defineGetter__("type", function() ADDON_TYPE);
-  this.__defineGetter__("isActive", function() {
-    let current = LightweightThemeManager.currentTheme;
-    if (current)
-      return aTheme.id == current.id;
-    return false;
-  });
-
-  ["name", "version", "description", "homepageURL", "iconURL"].forEach(function(prop) {
-    this.__defineGetter__(prop, function() aTheme[prop]);
-  }, this);
-  this.__defineGetter__("creator", function() aTheme.author);
-  this.__defineGetter__("screenshots", function() [aTheme.previewURL]);
-
-  this.__defineGetter__("pendingOperations", function() {
-    let pending = AddonManager.PENDING_NONE;
-    if (this.isActive == this.userDisabled)
-      pending |= this.isActive ? AddonManager.PENDING_DISABLE : AddonManager.PENDING_ENABLE;
-    return pending;
-  });
-
-  this.__defineGetter__("permissions", function() {
-    let permissions = AddonManager.PERM_CAN_UNINSTALL;
-    if (this.userDisabled)
-      permissions |= AddonManager.PERM_CAN_ENABLE;
-    return permissions;
-  });
-
-  this.__defineGetter__("userDisabled", function() {
-    if (aBeingEnabled)
-      return false;
-
-    try {
-      let toSelect = Services.prefs.getCharPref(PREF_LWTHEME_TO_SELECT);
-      return aTheme.id != toSelect;
-    }
-    catch (e) {
-      let current = LightweightThemeManager.currentTheme;
-      return !current || current.id != aTheme.id;
-    }
-  });
-
-  this.__defineSetter__("userDisabled", function(val) {
-    if (val == this.userDisabled)
-      return val;
-
-    if (val)
-      throw new Error("Cannot disable the active theme");
-
-    LightweightThemeManager.currentTheme = aTheme;
-    return val;
-  });
-
-  this.uninstall = function() {
-    LightweightThemeManager.forgetUsedTheme(aTheme.id);
-  };
-
-  this.cancelUninstall = function() {
-    throw new Error("Theme is not marked to be uninstalled");
-  };
-
-  this.findUpdates = function(listener, reason, appVersion, platformVersion) {
-    if ("onNoCompatibilityUpdateAvailable" in listener)
-      listener.onNoCompatibilityUpdateAvailable(this);
-    if ("onNoUpdateAvailable" in listener)
-      listener.onNoUpdateAvailable(this);
-    if ("onUpdateFinished" in listener)
-      listener.onUpdateFinished(this);
-  };
-}
-
-AddonWrapper.prototype = {
-  // Lightweight themes are never disabled by the application
-  get appDisabled() {
-    return false;
-  },
-
-  // Lightweight themes are always compatible
-  get isCompatible() {
-    return true;
-  },
-
-  get scope() {
-    return AddonManager.SCOPE_PROFILE;
-  },
-
-  // Lightweight themes are always compatible
-  isCompatibleWith: function(appVersion, platformVersion) {
-    return true;
-  },
-
-  // Lightweight themes are always securely updated
-  get providesUpdatesSecurely() {
-    return true;
-  },
-
-  // Lightweight themes are never blocklisted
-  get blocklistState() {
-    return Ci.nsIBlocklistService.STATE_NOT_BLOCKED;
   }
 };
 
-/**
- * Converts the ID used by the public AddonManager API to an lightweight theme
- * ID.
- *
- * @param   id
- *          The ID to be converted
- *
- * @return  the lightweight theme ID or null if the ID was not for a lightweight
- *          theme.
- */
-function _getInternalID(id) {
-  if (!id)
-    return null;
-  let len = id.length - ID_SUFFIX.length;
-  if (len > 0 && id.substring(len) == ID_SUFFIX)
-    return id.substring(0, len);
-  return null;
-}
-
 function _setCurrentTheme(aData, aLocal) {
   aData = _sanitizeTheme(aData, null, aLocal);
 
-  let needsRestart = (ADDON_TYPE == "theme") &&
-                     Services.prefs.prefHasUserValue(PREF_GENERAL_SKINS_SELECTEDSKIN);
-
   let cancel = Cc["@mozilla.org/supports-PRBool;1"].createInstance(Ci.nsISupportsPRBool);
   cancel.data = false;
   _observerService.notifyObservers(cancel, "lightweight-theme-change-requested",
                                    JSON.stringify(aData));
 
   if (aData) {
-    let theme = LightweightThemeManager.getUsedTheme(aData.id);
-    let isInstall = !theme || theme.version != aData.version;
-    if (isInstall) {
-      var oldWrapper = theme ? new AddonWrapper(theme) : null;
-      var wrapper = new AddonWrapper(aData);
-      AddonManagerPrivate.callInstallListeners("onExternalInstall", null,
-                                               wrapper, oldWrapper, false);
-      AddonManagerPrivate.callAddonListeners("onInstalling", wrapper, false);
-    }
-
-    let current = LightweightThemeManager.currentTheme;
     let usedThemes = _usedThemesExceptId(aData.id);
-    if (current && current.id != aData.id)
+    if (cancel.data && _prefs.getBoolPref("isThemeSelected"))
       usedThemes.splice(1, 0, aData);
     else
       usedThemes.unshift(aData);
     _updateUsedThemes(usedThemes);
-
-    if (isInstall)
-       AddonManagerPrivate.callAddonListeners("onInstalled", wrapper);
   }
 
   if (cancel.data)
     return null;
 
-  AddonManagerPrivate.notifyAddonChanged(aData ? aData.id + ID_SUFFIX : null,
-                                         ADDON_TYPE, needsRestart);
+  if (_previewTimer) {
+    _previewTimer.cancel();
+    _previewTimer = null;
+  }
 
-  return LightweightThemeManager.currentTheme;
+  _prefs.setBoolPref("isThemeSelected", aData != null);
+  _notifyWindows(aData);
+  _observerService.notifyObservers(null, "lightweight-theme-changed", null);
+
+  if (PERSIST_ENABLED && aData)
+    _persistImages(aData);
+
+  return aData;
 }
 
 function _sanitizeTheme(aData, aBaseURI, aLocal) {
   if (!aData || typeof aData != "object")
     return null;
 
   var resourceProtocols = ["http", "https"];
   if (aLocal)
@@ -605,23 +301,18 @@ function _usedThemesExceptId(aId)
 
 function _version(aThemeData)
   aThemeData.version || "";
 
 function _makeURI(aURL, aBaseURI)
   _ioService.newURI(aURL, null, aBaseURI);
 
 function _updateUsedThemes(aList) {
-  // Send uninstall events for all themes that need to be removed.
-  while (aList.length > MAX_USED_THEMES_COUNT) {
-    let wrapper = new AddonWrapper(aList[aList.length - 1]);
-    AddonManagerPrivate.callAddonListeners("onUninstalling", wrapper, false);
-    aList.pop();
-    AddonManagerPrivate.callAddonListeners("onUninstalled", wrapper);
-  }
+  if (aList.length > MAX_USED_THEMES_COUNT)
+    aList.length = MAX_USED_THEMES_COUNT;
 
   var str = Cc["@mozilla.org/supports-string;1"]
               .createInstance(Ci.nsISupportsString);
   str.data = JSON.stringify(aList);
   _prefs.setComplexValue("usedThemes", Ci.nsISupportsString, str);
 
   _observerService.notifyObservers(null, "lightweight-theme-list-changed", null);
 }
@@ -697,10 +388,8 @@ function _persistProgressListener(succes
           successCallback();
           return;
         }
       } catch (e) { }
       // failure
     }
   };
 }
-
-AddonManagerPrivate.registerProvider(LightweightThemeManager);
--- a/toolkit/mozapps/extensions/Makefile.in
+++ b/toolkit/mozapps/extensions/Makefile.in
@@ -36,58 +36,30 @@
 
 DEPTH     = ../../..
 topsrcdir = @top_srcdir@
 srcdir    = @srcdir@
 VPATH     = @srcdir@
 
 include $(DEPTH)/config/autoconf.mk
 
-MODULE         = extensions
-LIBRARY_NAME   = extensions
-IS_COMPONENT   = 1
-MODULE_NAME    = AddonsModule
-GRE_MODULE     = 1
-LIBXUL_LIBRARY = 1
-EXPORT_LIBRARY = 1
+MODULE = extensions
 
 XPIDLSRCS = \
-  amIInstallTrigger.idl \
-  amIWebInstallListener.idl \
-  amIWebInstaller.idl \
   nsIAddonRepository.idl \
-  $(NULL)
-
-CPPSRCS		= \
-  amInstallTrigger.cpp \
+  nsIExtensionManager.idl \
   $(NULL)
 
 EXTRA_PP_COMPONENTS = \
   nsAddonRepository.js \
   nsBlocklistService.js \
-  addonManager.js \
-  amContentHandler.js \
-  amWebInstallListener.js \
-  $(NULL)
-
-EXTRA_PP_JS_MODULES = \
-  AddonManager.jsm \
-  XPIProvider.jsm \
-  PluginProvider.jsm \
-  AddonUpdateChecker.jsm \
-  AddonLogging.jsm \
+  nsExtensionManager.js \
   $(NULL)
 
 EXTRA_JS_MODULES = \
   LightweightThemeManager.jsm \
   $(NULL)
 
 ifdef ENABLE_TESTS
 DIRS += test
 endif
 
-EXTRA_DSO_LDOPTS = \
-		$(MOZ_JS_LIBS) \
-		$(MOZ_UNICHARUTIL_LIBS) \
-		$(MOZ_COMPONENT_LIBS) \
-		$(NULL)
-
 include $(topsrcdir)/config/rules.mk
deleted file mode 100644
--- a/toolkit/mozapps/extensions/PluginProvider.jsm
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
-# ***** 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 the Extension Manager.
-#
-# The Initial Developer of the Original Code is
-# the Mozilla Foundation.
-# Portions created by the Initial Developer are Copyright (C) 2010
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Dave Townsend <dtownsend@oxymoronical.com>
-#
-# 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 Cc = Components.classes;
-const Ci = Components.interfaces;
-
-var EXPORTED_SYMBOLS = [];
-
-Components.utils.import("resource://gre/modules/AddonManager.jsm");
-Components.utils.import("resource://gre/modules/Services.jsm");
-
-["LOG", "WARN", "ERROR"].forEach(function(aName) {
-  this.__defineGetter__(aName, function() {
-    Components.utils.import("resource://gre/modules/AddonLogging.jsm");
-
-    LogManager.getLogger("addons.plugins", this);
-    return this[aName];
-  });
-}, this);
-
-var PluginProvider = {
-  // A dictionary mapping IDs to names and descriptions
-  plugins: null,
-
-  /**
-   * Called to get an Addon with a particular ID.
-   *
-   * @param  aId
-   *         The ID of the add-on to retrieve
-   * @param  aCallback
-   *         A callback to pass the Addon to
-   */
-  getAddonByID: function PL_getAddon(aId, aCallback) {
-    if (!this.plugins)
-      this.buildPluginList();
-
-    if (aId in this.plugins) {
-      let name = this.plugins[aId].name;
-      let description = this.plugins[aId].description;
-
-      let tags = Cc["@mozilla.org/plugin/host;1"].
-                 getService(Ci.nsIPluginHost).
-                 getPluginTags({});
-      let selected = [];
-      tags.forEach(function(aTag) {
-        if (aTag.name == name && aTag.description == description)
-          selected.push(aTag);
-      }, this);
-
-      aCallback(new PluginWrapper(aId, name, description, selected));
-    }
-    else {
-      aCallback(null);
-    }
-  },
-
-  /**
-   * Called to get Addons of a particular type.
-   *
-   * @param  aTypes
-   *         An array of types to fetch. Can be null to get all types.
-   * @param  callback
-   *         A callback to pass an array of Addons to
-   */
-  getAddonsByTypes: function PL_getAddonsByTypes(aTypes, aCallback) {
-    if (aTypes && aTypes.indexOf("plugin") < 0) {
-      aCallback([]);
-      return;
-    }
-
-    if (!this.plugins)
-      this.buildPluginList();
-
-    let results = [];
-
-    for (let id in this.plugins) {
-      this.getAddonByID(id, function(aAddon) {
-        results.push(aAddon);
-      });
-    }
-
-    aCallback(results);
-  },
-
-  /**
-   * Called to get Addons that have pending operations.
-   *
-   * @param  aTypes
-   *         An array of types to fetch. Can be null to get all types
-   * @param  aCallback
-   *         A callback to pass an array of Addons to
-   */
-  getAddonsWithOperationsByTypes: function PL_getAddonsWithOperationsByTypes(aTypes, aCallback) {
-    aCallback([]);
-  },
-
-  /**
-   * Called to get the current AddonInstalls, optionally restricting by type.
-   *
-   * @param  aTypes
-   *         An array of types or null to get all types
-   * @param  aCallback
-   *         A callback to pass the array of AddonInstalls to
-   */
-  getInstallsByTypes: function PL_getInstallsByTypes(aTypes, aCallback) {
-    aCallback([]);
-  },
-
-  buildPluginList: function PL_buildPluginList() {
-    let tags = Cc["@mozilla.org/plugin/host;1"].
-               getService(Ci.nsIPluginHost).
-               getPluginTags({});
-
-    this.plugins = {};
-    let seen = {};
-    tags.forEach(function(aTag) {
-      if (!(aTag.name in seen))
-        seen[aTag.name] = {};
-      if (!(aTag.description in seen[aTag.name])) {
-        let id = Cc["@mozilla.org/uuid-generator;1"].
-                 getService(Ci.nsIUUIDGenerator).
-                 generateUUID();
-        this.plugins[id] = {
-          name: aTag.name,
-          description: aTag.description
-        };
-        seen[aTag.name][aTag.description] = true;
-      }
-    }, this);
-  }
-};
-
-/**
- * The PluginWrapper wraps a set of nsIPluginTags to provide the data visible to
- * public callers through the API.
- */
-function PluginWrapper(aId, aName, aDescription, aTags) {
-  let safedesc = aDescription.replace(/<\/?[a-z][^>]*>/gi, " ");
-  let homepageURL = null;
-  if (/<A\s+HREF=[^>]*>/i.test(aDescription))
-    homepageURL = /<A\s+HREF=["']?([^>"'\s]*)/i.exec(aDescription)[1];
-
-  this.__defineGetter__("id", function() aId);
-  this.__defineGetter__("type", function() "plugin");
-  this.__defineGetter__("name", function() aName);
-  this.__defineGetter__("creator", function() "");
-  this.__defineGetter__("description", function() safedesc);
-  this.__defineGetter__("version", function() aTags[0].version);
-  this.__defineGetter__("homepageURL", function() homepageURL);
-
-  this.__defineGetter__("isActive", function() !aTags[0].blocklisted && !aTags[0].disabled);
-  this.__defineGetter__("appDisabled", function() aTags[0].blocklisted);
-  this.__defineGetter__("userDisabled", function() aTags[0].disabled);
-  this.__defineSetter__("userDisabled", function(aVal) {
-    if (aTags[0].disabled == aVal)
-      return;
-
-    aTags.forEach(function(aTag) {
-      aTag.disabled = aVal;
-    });
-    AddonManagerPrivate.callAddonListeners(aVal ? "onDisabling" : "onEnabling", this, false);
-    AddonManagerPrivate.callAddonListeners(aVal ? "onDisabled" : "onEnabled", this);
-    return aVal;
-  });
-
-  this.__defineGetter__("blocklistState", function() {
-    let bs = Cc["@mozilla.org/extensions/blocklist;1"].
-             getService(Ci.nsIBlocklistService);
-    return bs.getPluginBlocklistState(aTags[0]);
-  });
-
-  this.__defineGetter__("scope", function() {
-    let path = aTags[0].fullpath;
-    // Plugins inside the application directory are in the application scope
-    let dir = Services.dirsvc.get("APlugns", Ci.nsILocalFile);
-    if (path.substring(0, dir.path.length) == dir.path)
-      return AddonManager.SCOPE_APPLICATION;
-
-    // Plugins inside the profile directory are in the profile scope
-    dir = Services.dirsvc.get("ProfD", Ci.nsILocalFile);
-    if (path.substring(0, dir.path.length) == dir.path)
-      return AddonManager.SCOPE_PROFILE;
-
-    // Plugins anywhere else in the user's home are in the user scope
-    dir = Services.dirsvc.get("Home", Ci.nsILocalFile);
-    if (path.substring(0, dir.path.length) == dir.path)
-      return AddonManager.SCOPE_USER;
-
-    // Any other locations are system scope
-    return AddonManager.SCOPE_SYSTEM;
-  });
-
-  this.__defineGetter__("pendingOperations", function() {
-    return 0;
-  });
-
-  this.__defineGetter__("permissions", function() {
-    let permissions = 0;
-    if (!this.appDisabled) {
-      if (this.userDisabled)
-        permissions |= AddonManager.PERM_CAN_ENABLE;
-      else
-        permissions |= AddonManager.PERM_CAN_DISABLE;
-    }
-    return permissions;
-  });
-}
-
-PluginWrapper.prototype = {
-  get isCompatible() {
-    return true;
-  },
-
-  get providesUpdatesSecurely() {
-    return true;
-  },
-
-  isCompatibleWith: function(aAppVerison, aPlatformVersion) {
-    return true;
-  },
-
-  findUpdates: function(aListener, aReason, aAppVersion, aPlatformVersion) {
-    if ("onNoCompatibilityUpdateAvailable" in aListener)
-      aListener.onNoCompatibilityUpdateAvailable(this);
-    if ("onNoUpdateAvailable" in aListener)
-      aListener.onNoUpdateAvailable(this);
-    if ("onUpdateFinished" in aListener)
-      aListener.onUpdateFinished(this);
-  }
-};
-
-AddonManagerPrivate.registerProvider(PluginProvider);
deleted file mode 100644
--- a/toolkit/mozapps/extensions/XPIProvider.jsm
+++ /dev/null
@@ -1,4953 +0,0 @@
-/*
-# ***** 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 the Extension Manager.
-#
-# The Initial Developer of the Original Code is
-# the Mozilla Foundation.
-# Portions created by the Initial Developer are Copyright (C) 2009
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Dave Townsend <dtownsend@oxymoronical.com>
-#
-# 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 Cc = Components.classes;
-const Ci = Components.interfaces;
-const Cr = Components.results;
-
-var EXPORTED_SYMBOLS = [];
-
-Components.utils.import("resource://gre/modules/Services.jsm");
-Components.utils.import("resource://gre/modules/AddonManager.jsm");
-Components.utils.import("resource://gre/modules/FileUtils.jsm");
-Components.utils.import("resource://gre/modules/NetUtil.jsm");
-
-const PREF_DB_SCHEMA                  = "extensions.databaseSchema";
-const PREF_INSTALL_CACHE              = "extensions.installCache";
-const PREF_BOOTSTRAP_ADDONS           = "extensions.bootstrappedAddons";
-const PREF_PENDING_OPERATIONS         = "extensions.pendingOperations";
-const PREF_MATCH_OS_LOCALE            = "intl.locale.matchOS";
-const PREF_SELECTED_LOCALE            = "general.useragent.locale";
-const PREF_EM_DSS_ENABLED             = "extensions.dss.enabled";
-const PREF_DSS_SWITCHPENDING          = "extensions.dss.switchPending";
-const PREF_DSS_SKIN_TO_SELECT         = "extensions.lastSelectedSkin";
-const PREF_GENERAL_SKINS_SELECTEDSKIN = "general.skins.selectedSkin";
-const PREF_EM_CHECK_COMPATIBILITY     = "extensions.checkCompatibility";
-const PREF_EM_CHECK_UPDATE_SECURITY   = "extensions.checkUpdateSecurity";
-const PREF_EM_UPDATE_URL              = "extensions.update.url";
-const PREF_EM_ENABLED_ADDONS          = "extensions.enabledAddons";
-const PREF_EM_EXTENSION_FORMAT        = "extensions.";
-const PREF_EM_ENABLED_SCOPES          = "extensions.enabledScopes";
-const PREF_XPI_ENABLED                = "xpinstall.enabled";
-const PREF_XPI_WHITELIST_REQUIRED     = "xpinstall.whitelist.required";
-const PREF_XPI_WHITELIST_PERMISSIONS  = "xpinstall.whitelist.add";
-const PREF_XPI_BLACKLIST_PERMISSIONS  = "xpinstall.blacklist.add";
-
-const DIR_EXTENSIONS                  = "extensions";
-const DIR_STAGE                       = "staged";
-
-const FILE_OLD_DATABASE               = "extensions.rdf";
-const FILE_DATABASE                   = "extensions.sqlite";
-const FILE_INSTALL_MANIFEST           = "install.rdf";
-const FILE_XPI_ADDONS_LIST            = "extensions.ini";
-
-const KEY_PROFILEDIR                  = "ProfD";
-const KEY_APPDIR                      = "XCurProcD";
-
-const KEY_APP_PROFILE                 = "app-profile";
-const KEY_APP_GLOBAL                  = "app-global";
-const KEY_APP_SYSTEM_LOCAL            = "app-system-local";
-const KEY_APP_SYSTEM_SHARE            = "app-system-share";
-const KEY_APP_SYSTEM_USER             = "app-system-user";
-
-const CATEGORY_UPDATE_PARAMS          = "extension-update-params";
-
-const UNKNOWN_XPCOM_ABI               = "unknownABI";
-const XPI_PERMISSION                  = "install";
-
-const PREFIX_ITEM_URI                 = "urn:mozilla:item:";
-const RDFURI_ITEM_ROOT                = "urn:mozilla:item:root"
-const RDFURI_INSTALL_MANIFEST_ROOT    = "urn:mozilla:install-manifest";
-const PREFIX_NS_EM                    = "http://www.mozilla.org/2004/em-rdf#";
-
-const TOOLKIT_ID                      = "toolkit@mozilla.org";
-
-const BRANCH_REGEXP                   = /^([^\.]+\.[0-9]+[a-z]*).*/gi;
-
-const DB_SCHEMA                       = 1;
-const REQ_VERSION                     = 2;
-
-const PROP_METADATA      = ["id", "version", "type", "internalName", "updateURL",
-                            "updateKey", "optionsURL", "aboutURL", "iconURL"]
-const PROP_LOCALE_SINGLE = ["name", "description", "creator", "homepageURL"];
-const PROP_LOCALE_MULTI  = ["developers", "translators", "contributors"];
-const PROP_TARGETAPP     = ["id", "minVersion", "maxVersion"];
-
-const BOOTSTRAP_REASONS = {
-  APP_STARTUP     : 1,
-  APP_SHUTDOWN    : 2,
-  ADDON_ENABLE    : 3,
-  ADDON_DISABLE   : 4,
-  ADDON_INSTALL   : 5,
-  ADDON_UNINSTALL : 6,
-  ADDON_UPGRADE   : 7,
-  ADDON_DOWNGRADE : 8
-};
-
-// Map new string type identifiers to old style nsIUpdateItem types
-const TYPES = {
-  extension: 2,
-  theme: 4,
-  locale: 8
-};
-
-/**
- * Valid IDs fit this pattern.
- */
-var gIDTest = /^(\{[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\}|[a-z0-9-\._]*\@[a-z0-9-\._]+)$/i;
-
-["LOG", "WARN", "ERROR"].forEach(function(aName) {
-  this.__defineGetter__(aName, function() {
-    Components.utils.import("resource://gre/modules/AddonLogging.jsm");
-
-    LogManager.getLogger("addons.xpi", this);
-    return this[aName];
-  })
-}, this);
-
-/**
- * Gets the currently selected locale for display.
- * @return  the selected locale or "en-US" if none is selected
- */
-function getLocale() {
-  if (Prefs.getBoolPref(PREF_MATCH_OS_LOCALE), false)
-    return Services.locale.getLocaleComponentForUserAgent();
-  return Prefs.getCharPref(PREF_SELECTED_LOCALE, "en-US");
-}
-
-/**
- * Selects the closest matching locale from a list of locales.
- *
- * @param  aLocales
- *         An array of locales
- * @return the best match for the currently selected locale
- */
-function findClosestLocale(aLocales) {
-  let appLocale = getLocale();
-
-  // Holds the best matching localized resource
-  var bestmatch = null;
-  // The number of locale parts it matched with
-  var bestmatchcount = 0;
-  // The number of locale parts in the match
-  var bestpartcount = 0;
-
-  var matchLocales = [appLocale.toLowerCase()];
-  /* If the current locale is English then it will find a match if there is
-     a valid match for en-US so no point searching that locale too. */
-  if (matchLocales[0].substring(0, 3) != "en-")
-    matchLocales.push("en-us");
-
-  for each (var locale in matchLocales) {
-    var lparts = locale.split("-");
-    for each (var localized in aLocales) {
-      for each (found in localized.locales) {
-        found = found.toLowerCase();
-        // Exact match is returned immediately
-        if (locale == found)
-          return localized;
-
-        var fparts = found.split("-");
-        /* If we have found a possible match and this one isn't any longer
-           then we dont need to check further. */
-        if (bestmatch && fparts.length < bestmatchcount)
-          continue;
-
-        // Count the number of parts that match
-        var maxmatchcount = Math.min(fparts.length, lparts.length);
-        var matchcount = 0;
-        while (matchcount < maxmatchcount &&
-               fparts[matchcount] == lparts[matchcount])
-          matchcount++;
-
-        /* If we matched more than the last best match or matched the same and
-           this locale is less specific than the last best match. */
-        if (matchcount > bestmatchcount ||
-           (matchcount == bestmatchcount && fparts.length < bestpartcount)) {
-          bestmatch = localized;
-          bestmatchcount = matchcount;
-          bestpartcount = fparts.length;
-        }
-      }
-    }
-    // If we found a valid match for this locale return it
-    if (bestmatch)
-      return bestmatch;
-  }
-  return null;
-}
-
-/**
- * Calculates whether an add-on should be appDisabled or not.
- *
- * @param  aAddon
- *         The add-on to check
- * @return true if the add-on should not be appDisabled
- */
-function isUsableAddon(aAddon) {
-  // Hack to ensure the default theme is always usable
-  if (aAddon.type == "theme" && aAddon.internalName == XPIProvider.defaultSkin)
-    return true;
-  if (XPIProvider.checkCompatibility) {
-    if (!aAddon.isCompatible)
-      return false;
-  }
-  else {
-    if (!aAddon.matchingTargetApplication)
-      return false;
-  }
-  if (XPIProvider.checkUpdateSecurity && !aAddon.providesUpdatesSecurely)
-    return false;
-  return aAddon.blocklistState != Ci.nsIBlocklistService.STATE_BLOCKED;
-}
-
-this.__defineGetter__("gRDF", function() {
-  delete this.gRDF;
-  return this.gRDF = Cc["@mozilla.org/rdf/rdf-service;1"].
-                     getService(Ci.nsIRDFService);
-});
-
-function EM_R(aProperty) {
-  return gRDF.GetResource(PREFIX_NS_EM + aProperty);
-}
-
-/**
- * Converts an RDF literal, resource or integer into a string.
- *
- * @param  aLiteral
- *         The RDF object to convert
- * @return a string if the object could be converted or null
- */
-function getRDFValue(aLiteral) {
-  if (aLiteral instanceof Ci.nsIRDFLiteral)
-    return aLiteral.Value;
-  if (aLiteral instanceof Ci.nsIRDFResource)
-    return aLiteral.Value;
-  if (aLiteral instanceof Ci.nsIRDFInt)
-    return aLiteral.Value;
-  return null;
-}
-
-/**
- * Gets an RDF property as a string
- *
- * @param  aDs
- *         The RDF datasource to read the property from
- * @param  aResource
- *         The RDF resource to read the property from
- * @param  aProperty
- *         The property to read
- * @return a string if the property existed or null
- */
-function getRDFProperty(aDs, aResource, aProperty) {
-  return getRDFValue(aDs.GetTarget(aResource, EM_R(aProperty), true));
-}
-
-/**
- * Reads an AddonInternal object from an RDF stream.
- *
- * @param  aUri
- *         The URI that the manifest is being read from
- * @param  aStream
- *         An open stream to read the RDF from
- * @return an AddonInternal object
- * @throws if the install manifest in the RDF stream is corrupt or could not
- *         be read
- */
-function loadManifestFromRDF(aUri, aStream) {
-  function getPropertyArray(aDs, aSource, aProperty) {
-    let values = [];
-    let targets = aDs.GetTargets(aSource, EM_R(aProperty), true);
-    while (targets.hasMoreElements())
-      values.push(getRDFValue(targets.getNext()));
-
-    return values;
-  }
-
-  function readLocale(aDs, aSource, isDefault) {
-    let locale = { };
-    if (!isDefault) {
-      locale.locales = [];
-      let targets = ds.GetTargets(aSource, EM_R("locale"), true);
-      while (targets.hasMoreElements())
-        locale.locales.push(getRDFValue(targets.getNext()));
-
-      if (locale.locales.length == 0)
-        throw new Error("No locales given for localized properties");
-    }
-
-    PROP_LOCALE_SINGLE.forEach(function(aProp) {
-      locale[aProp] = getRDFProperty(aDs, aSource, aProp);
-    });
-
-    PROP_LOCALE_MULTI.forEach(function(aProp) {
-      locale[aProp] = getPropertyArray(aDs, aSource,
-                                       aProp.substring(0, aProp.length - 1));
-    });
-
-    return locale;
-  }
-
-  let rdfParser = Cc["@mozilla.org/rdf/xml-parser;1"].
-                  createInstance(Ci.nsIRDFXMLParser)
-  let ds = Cc["@mozilla.org/rdf/datasource;1?name=in-memory-datasource"].
-           createInstance(Ci.nsIRDFDataSource);
-  let listener = rdfParser.parseAsync(ds, aUri);
-  let channel = Cc["@mozilla.org/network/input-stream-channel;1"].
-                createInstance(Ci.nsIInputStreamChannel);
-  channel.setURI(aUri);
-  channel.contentStream = aStream;
-  channel.QueryInterface(Ci.nsIChannel);
-  channel.contentType = "text/xml";
-
-  listener.onStartRequest(channel, null);
-
-  try {
-    let pos = 0;
-    let count = aStream.available();
-    while (count > 0) {
-      listener.onDataAvailable(channel, null, aStream, pos, count);
-      pos += count;
-      count = aStream.available();
-    }
-    listener.onStopRequest(channel, null, Components.results.NS_OK);
-  }
-  catch (e) {
-    listener.onStopRequest(channel, null, e.result);
-    throw e;
-  }
-
-  let root = gRDF.GetResource(RDFURI_INSTALL_MANIFEST_ROOT);
-  let addon = new AddonInternal();
-  PROP_METADATA.forEach(function(aProp) {
-    addon[aProp] = getRDFProperty(ds, root, aProp);
-  });
-  if (!addon.id || !addon.version)
-    throw new Error("No ID or version in install manifest");
-
-  if (!addon.type) {
-    addon.type = addon.internalName ? "theme" : "extension";
-  }
-  else {
-    for (let name in TYPES) {
-      if (TYPES[name] == addon.type) {
-        addon.type = name;
-        break;
-      }
-    }
-  }
-  if (!(addon.type in TYPES))
-    throw new Error("Install manifest specifies unknown type: " + addon.type);
-  if (addon.type == "theme" && !addon.internalName)
-    throw new Error("Themes must include an internalName property");
-
-  // Only extensions are allowed to provide an optionsURL or aboutURL. For all
-  // other types they are silently ignored
-  if (addon.type != "extension") {
-    addon.optionsURL = null;
-    addon.aboutURL = null;
-  }
-
-  // Only read the bootstrapped property for extensions
-  if (addon.type == "extension")
-    addon.bootstrap = getRDFProperty(ds, root, "bootstrap") == "true";
-
-  addon.defaultLocale = readLocale(ds, root, true);
-
-  addon.locales = [];
-  let targets = ds.GetTargets(root, EM_R("localized"), true);
-  while (targets.hasMoreElements()) {
-    let target = targets.getNext().QueryInterface(Ci.nsIRDFResource);
-    addon.locales.push(readLocale(ds, target, false));
-  }
-
-  addon.targetApplications = [];
-  targets = ds.GetTargets(root, EM_R("targetApplication"), true);
-  while (targets.hasMoreElements()) {
-    let target = targets.getNext().QueryInterface(Ci.nsIRDFResource);
-    let targetAppInfo = {};
-    PROP_TARGETAPP.forEach(function(aProp) {
-      targetAppInfo[aProp] = getRDFProperty(ds, target, aProp);
-    });
-    if (!targetAppInfo.id || !targetAppInfo.minVersion ||
-        !targetAppInfo.maxVersion)
-      throw new Error("Invalid targetApplication entry in install manifest");
-    addon.targetApplications.push(targetAppInfo);
-  }
-
-  addon.targetPlatforms = getPropertyArray(ds, root, "targetPlatform");
-
-  // Themes are disabled by default unless they are currently selected
-  if (addon.type == "theme")
-    addon.userDisabled = addon.internalName != XPIProvider.selectedSkin;
-  else
-    addon.userDisabled = addon.blocklistState == Ci.nsIBlocklistService.STATE_SOFTBLOCKED;
-  addon.appDisabled = !isUsableAddon(addon);
-
-  addon.applyBackgroundUpdates = true;
-
-  return addon;
-}
-
-/**
- * Loads an AddonInternal object from an add-on extracted in a directory.
- *
- * @param  aDir
- *         The nsIFile directory holding the add-on
- * @return an AddonInternal object
- * @throws if the directory does not contain a valid install manifest
- */
-function loadManifestFromDir(aDir) {
-  let file = aDir.clone();
-  file.append(FILE_INSTALL_MANIFEST);
-  if (!file.exists() || !file.isFile())
-    throw new Error("Directory " + dir.path + " does not contain a valid " +
-                    "install manifest");
-
-  let fis = Cc["@mozilla.org/network/file-input-stream;1"].
-            createInstance(Ci.nsIFileInputStream);
-  fis.init(file, -1, -1, false);
-  let bis = Cc["@mozilla.org/network/buffered-input-stream;1"].
-            createInstance(Ci.nsIBufferedInputStream);
-  bis.init(fis, 4096);
-
-  try {
-    let addon = loadManifestFromRDF(Services.io.newFileURI(file), bis);
-    addon._sourceBundle = aDir.clone().QueryInterface(Ci.nsILocalFile);
-    return addon;
-  }
-  finally {
-    bis.close();
-    fis.close();
-  }
-}
-
-/**
- * Creates a jar: URI for a file inside a ZIP file.
- *
- * @param  aJarfile
- *         The ZIP file as an nsIFile
- * @param  aPath
- *         The path inside the ZIP file
- * @return an nsIURI for the file
- */
-function buildJarURI(aJarfile, aPath) {
-  let uri = Services.io.newFileURI(aJarfile);
-  uri = "jar:" + uri.spec + "!/" + aPath;
-  return NetUtil.newURI(uri);
-}
-
-/**
- * Extracts files from a ZIP file into a directory.
- *
- * @param  aZipFile
- *         The source ZIP file that contains the add-on.
- * @param  aDir
- *         The nsIFile to extract to.
- */
-function extractFiles(aZipFile, aDir) {
-  function getTargetFile(aDir, entry) {
-    let target = aDir.clone();
-    entry.split("/").forEach(function(aPart) {
-      target.append(aPart);
-    });
-    return target;
-  }
-
-  let zipReader = Cc["@mozilla.org/libjar/zip-reader;1"].
-                  createInstance(Ci.nsIZipReader);
-  zipReader.open(aZipFile);
-
-  try {
-    // create directories first
-    let entries = zipReader.findEntries("*/");
-    while (entries.hasMore()) {
-      var entryName = entries.getNext();
-      let target = getTargetFile(aDir, entryName);
-      if (!target.exists()) {
-        try {
-          target.create(Ci.nsILocalFile.DIRECTORY_TYPE,
-                        FileUtils.PERMS_DIRECTORY);
-        }
-        catch (e) {
-          ERROR("extractFiles: failed to create target directory for " +
-                "extraction file = " + target.path + ", exception = " + e +
-                "\n");
-        }
-      }
-    }
-
-    entries = zipReader.findEntries(null);
-    while (entries.hasMore()) {
-      let entryName = entries.getNext();
-      let target = getTargetFile(aDir, entryName);
-      if (target.exists())
-        continue;
-
-      zipReader.extract(entryName, target);
-      target.permissions |= FileUtils.PERMS_FILE;
-    }
-  }
-  finally {
-    zipReader.close();
-  }
-}
-
-/**
- * Verifies that a zip file's contents are all signed by the same principal.
- * Directory entries and anything in the META-INF directory are not checked.
- *
- * @param  aZip
- *         A nsIZipReader to check
- * @param  aPrincipal
- *         The nsIPrincipal to compare against
- * @return true if all the contents that should be signed were signed by the
- *         principal
- */
-function verifyZipSigning(aZip, aPrincipal) {
-  var count = 0;
-  var entries = aZip.findEntries(null);
-  while (entries.hasMore()) {
-    var entry = entries.getNext();
-    // Nothing in META-INF is in the manifest.
-    if (entry.substr(0, 9) == "META-INF/")
-      continue;
-    // Directory entries aren't in the manifest.
-    if (entry.substr(-1) == "/")
-      continue;
-    count++;
-    var entryPrincipal = aZip.getCertificatePrincipal(entry);
-    if (!entryPrincipal || !aPrincipal.equals(entryPrincipal))
-      return false;
-  }
-  return aZip.manifestEntriesCount == count;
-}
-
-/**
- * Replaces %...% strings in an addon url (update and updateInfo) with
- * appropriate values.
- *
- * @param  aAddon
- *         The AddonInternal representing the add-on
- * @param  aUri
- *         The uri to escape
- * @param  aUpdateType
- *         An optional number representing the type of update, only applicable
- *         when creating a url for retrieving an update manifest
- * @param  aAppVersion
- *         The optional application version to use for %APP_VERSION%
- * @return the appropriately escaped uri.
- */
-function escapeAddonURI(aAddon, aUri, aUpdateType, aAppVersion)
-{
-  var addonStatus = aAddon.userDisabled ? "userDisabled" : "userEnabled";
-
-  if (!aAddon.isCompatible)
-    addonStatus += ",incompatible";
-  if (aAddon.blocklistState > 0)
-    addonStatus += ",blocklisted";
-
-  try {
-    var xpcomABI = Services.appinfo.XPCOMABI;
-  } catch (ex) {
-    xpcomABI = UNKNOWN_XPCOM_ABI;
-  }
-
-  let uri = aUri.replace(/%ITEM_ID%/g, aAddon.id);
-  uri = uri.replace(/%ITEM_VERSION%/g, aAddon.version);
-  uri = uri.replace(/%ITEM_STATUS%/g, addonStatus);
-  uri = uri.replace(/%APP_ID%/g, Services.appinfo.ID);
-  uri = uri.replace(/%APP_VERSION%/g, aAppVersion ? aAppVersion :
-                                                    Services.appinfo.version);
-  uri = uri.replace(/%REQ_VERSION%/g, REQ_VERSION);
-  uri = uri.replace(/%APP_OS%/g, Services.appinfo.OS);
-  uri = uri.replace(/%APP_ABI%/g, xpcomABI);
-  uri = uri.replace(/%APP_LOCALE%/g, getLocale());
-  uri = uri.replace(/%CURRENT_APP_VERSION%/g, Services.appinfo.version);
-
-  // If there is an updateType then replace the UPDATE_TYPE string
-  if (aUpdateType)
-    uri = uri.replace(/%UPDATE_TYPE%/g, aUpdateType);
-
-  // If this add-on has compatibility information for either the current
-  // application or toolkit then replace the ITEM_MAXAPPVERSION with the
-  // maxVersion
-  let app = aAddon.matchingTargetApplication;
-  if (app)
-    var maxVersion = app.maxVersion;
-  else
-    maxVersion = "";
-  uri = uri.replace(/%ITEM_MAXAPPVERSION%/g, maxVersion);
-
-  // Replace custom parameters (names of custom parameters must have at
-  // least 3 characters to prevent lookups for something like %D0%C8)
-  var catMan = null;
-  uri = uri.replace(/%(\w{3,})%/g, function(aMatch, aParam) {
-    if (!catMan) {
-      catMan = Cc["@mozilla.org/categorymanager;1"].
-               getService(Ci.nsICategoryManager);
-    }
-
-    try {
-      var contractID = catMan.getCategoryEntry(CATEGORY_UPDATE_PARAMS, aParam);
-      var paramHandler = Cc[contractID].getService(Ci.nsIPropertyBag2);
-      return paramHandler.getPropertyAsAString(aParam);
-    }
-    catch(e) {
-      return aMatch;
-    }
-  });
-
-  // escape() does not properly encode + symbols in any embedded FVF strings.
-  return uri.replace(/\+/g, "%2B");
-}
-
-/**
- * Copies properties from one object to another. If no target object is passed
- * a new object will be created and returned.
- *
- * @param  aObject
- *         An object to copy from
- * @param  aProperties
- *         An array of properties to be copied
- * @param  aTarget
- *         An optional target object to copy the properties to
- * @return the object that the properties were copied onto
- */
-function copyProperties(aObject, aProperties, aTarget) {
-  if (!aTarget)
-    aTarget = {};
-  aProperties.forEach(function(aProp) {
-    aTarget[aProp] = aObject[aProp];
-  });
-  return aTarget;
-}
-
-/**
- * Copies properties from a mozIStorageRow to an object. If no target object is
- * passed a new object will be created and returned.
- *
- * @param  aRow
- *         A mozIStorageRow to copy from
- * @param  aProperties
- *         An array of properties to be copied
- * @param  aTarget
- *         An optional target object to copy the properties to
- * @return the object that the properties were copied onto
- */
-function copyRowProperties(aRow, aProperties, aTarget) {
-  if (!aTarget)
-    aTarget = {};
-  aProperties.forEach(function(aProp) {
-    aTarget[aProp] = aRow.getResultByName(aProp);
-  });
-  return aTarget;
-}
-
-/**
- * A generator to synchronously return result rows from an mozIStorageStatement.
- *
- * @param  aStatement
- *         The statement to execute
- */
-function resultRows(aStatement) {
-  try {
-    while (aStatement.executeStep())
-      yield aStatement.row;
-  }
-  finally {
-    aStatement.reset();
-  }
-}
-
-/**
- * A helpful wrapper around the prefs service that allows for default values
- * when requested values aren't set.
- */
-var Prefs = {
-  /**
-   * Gets a preference from the default branch ignoring user-set values.
-   *
-   * @param  aName
-   *         The name of the preference
-   * @param  aDefaultValue
-   *         A value to return if the preference does not exist
-   * @return the default value of the preference or aDefaultValue if there is
-   *         none
-   */
-  getDefaultCharPref: function(aName, aDefaultValue) {
-    try {
-      return Services.prefs.getDefaultBranch("").getCharPref(aName);
-    }
-    catch (e) {
-    }
-    return aDefaultValue;
-  },
-
-  /**
-   * Gets a string preference.
-   *
-   * @param  aName
-   *         The name of the preference
-   * @param  aDefaultValue
-   *         A value to return if the preference does not exist
-   * @return the value of the preference or aDefaultValue if there is none
-   */
-  getCharPref: function(aName, aDefaultValue) {
-    try {
-      return Services.prefs.getCharPref(aName);
-    }
-    catch (e) {
-    }
-    return aDefaultValue;
-  },
-
-  /**
-   * Gets a boolean preference.
-   *
-   * @param  aName
-   *         The name of the preference
-   * @param  aDefaultValue
-   *         A value to return if the preference does not exist
-   * @return the value of the preference or aDefaultValue if there is none
-   */
-  getBoolPref: function(aName, aDefaultValue) {
-    try {
-      return Services.prefs.getBoolPref(aName);
-    }
-    catch (e) {
-    }
-    return aDefaultValue;
-  },
-
-  /**
-   * Gets an integer preference.
-   *
-   * @param  aName
-   *         The name of the preference
-   * @param  defaultValue
-   *         A value to return if the preference does not exist
-   * @return the value of the preference or defaultValue if there is none
-   */
-  getIntPref: function(aName, defaultValue) {
-    try {
-      return Services.prefs.getIntPref(aName);
-    }
-    catch (e) {
-    }
-    return defaultValue;
-  }
-}
-
-var XPIProvider = {
-  // An array of known install locations
-  installLocations: null,
-  // A dictionary of known install locations by name
-  installLocationsByName: null,
-  // An array of currently active AddonInstalls
-  installs: null,
-  // The default skin for the application
-  defaultSkin: "classic/1.0",
-  // The currently selected skin or the skin that will be switched to after a
-  // restart
-  selectedSkin: null,
-  // The name of the checkCompatibility preference for the current application
-  // version
-  checkCompatibilityPref: null,
-  // The value of the checkCompatibility preference
-  checkCompatibility: true,
-  // The value of the checkUpdateSecurity preference
-  checkUpdateSecurity: true,
-  // A dictionary of the file descriptors for bootstrappable add-ons by ID
-  bootstrappedAddons: {},
-  // A dictionary of JS scopes of loaded bootstrappable add-ons by ID
-  bootstrapScopes: {},
-  // A string listing the enabled add-ons for annotating crash reports
-  enabledAddons: null,
-
-  /**
-   * Starts the XPI provider initializes the install locations and prefs.
-   */
-  startup: function XPI_startup() {
-    LOG("startup");
-    this.installs = [];
-    this.installLocations = [];
-    this.installLocationsByName = {};
-
-    function addDirectoryInstallLocation(aName, aKey, aPaths, aScope, aLocked) {
-      try {
-        var dir = FileUtils.getDir(aKey, aPaths);
-      }
-      catch (e) {
-        // Some directories aren't defined on some platforms, ignore them
-        LOG("Skipping unavailable install location " + aName);
-        return;
-      }
-
-      try {
-        var location = new DirectoryInstallLocation(aName, dir, aScope, aLocked);
-      }
-      catch (e) {
-        WARN("Failed to add directory install location " + aName + " " + e);
-        return;
-      }
-
-      XPIProvider.installLocations.push(location);
-      XPIProvider.installLocationsByName[location.name] = location;
-    }
-
-    function addRegistryInstallLocation(aName, aRootkey, aScope) {
-      try {
-        var location = new WinRegInstallLocation(aName, aRootkey, aScope);
-      }
-      catch (e) {
-        WARN("Failed to add registry install location " + aName + " " + e);
-        return;
-      }
-
-      XPIProvider.installLocations.push(location);
-      XPIProvider.installLocationsByName[location.name] = location;
-    }
-
-    let hasRegistry = ("nsIWindowsRegKey" in Ci);
-
-    let enabledScopes = Prefs.getIntPref(PREF_EM_ENABLED_SCOPES,
-                                         AddonManager.SCOPE_ALL);
-
-    // These must be in order of priority for processFileChanges etc. to work
-    if (enabledScopes & AddonManager.SCOPE_SYSTEM) {
-      if (hasRegistry) {
-        addRegistryInstallLocation("winreg-app-global",
-                                   Ci.nsIWindowsRegKey.ROOT_KEY_LOCAL_MACHINE,
-                                   AddonManager.SCOPE_SYSTEM);
-      }
-      addDirectoryInstallLocation(KEY_APP_SYSTEM_LOCAL, "XRESysLExtPD",
-                                  [Services.appinfo.ID],
-                                  AddonManager.SCOPE_SYSTEM, true);
-      addDirectoryInstallLocation(KEY_APP_SYSTEM_SHARE, "XRESysSExtPD",
-                                  [Services.appinfo.ID],
-                                  AddonManager.SCOPE_SYSTEM, true);
-    }
-
-    if (enabledScopes & AddonManager.SCOPE_APPLICATION) {
-      addDirectoryInstallLocation(KEY_APP_GLOBAL, KEY_APPDIR,
-                                  [DIR_EXTENSIONS],
-                                  AddonManager.SCOPE_APPLICATION, true);
-    }
-
-    if (enabledScopes & AddonManager.SCOPE_USER) {
-      if (hasRegistry) {
-        addRegistryInstallLocation("winreg-app-user",
-                                   Ci.nsIWindowsRegKey.ROOT_KEY_CURRENT_USER,
-                                   AddonManager.SCOPE_USER);
-      }
-      addDirectoryInstallLocation(KEY_APP_SYSTEM_USER, "XREUSysExt",
-                                  [Services.appinfo.ID],
-                                  AddonManager.SCOPE_USER, true);
-    }
-
-    // The profile location is always enabled
-    addDirectoryInstallLocation(KEY_APP_PROFILE, KEY_PROFILEDIR,
-                                [DIR_EXTENSIONS],
-                                AddonManager.SCOPE_PROFILE, false);
-
-    this.defaultSkin = Prefs.getDefaultCharPref(PREF_GENERAL_SKINS_SELECTEDSKIN,
-                                                "classic/1.0");
-    this.selectedSkin = Prefs.getCharPref(PREF_GENERAL_SKINS_SELECTEDSKIN,
-                                          this.defaultSkin);
-
-    // Tell the Chrome Registry which Skin to select
-    if (Prefs.getBoolPref(PREF_DSS_SWITCHPENDING, false)) {
-      try {
-        this.selectedSkin = Prefs.getCharPref(PREF_DSS_SKIN_TO_SELECT);
-        Services.prefs.setCharPref(PREF_GENERAL_SKINS_SELECTEDSKIN,
-                                   this.selectedSkin);
-        Services.prefs.clearUserPref(PREF_DSS_SKIN_TO_SELECT);
-        LOG("Changed skin to " + this.selectedSkin);
-      }
-      catch (e) {
-        ERROR(e);
-      }
-      Services.prefs.clearUserPref(PREF_DSS_SWITCHPENDING);
-    }
-
-    var version = Services.appinfo.version.replace(BRANCH_REGEXP, "$1");
-    this.checkCompatibilityPref = PREF_EM_CHECK_COMPATIBILITY + "." + version;
-    this.checkCompatibility = Prefs.getBoolPref(this.checkCompatibilityPref,
-                                                true)
-    this.checkUpdateSecurity = Prefs.getBoolPref(PREF_EM_CHECK_UPDATE_SECURITY,
-                                                 true)
-    this.enabledAddons = Prefs.getCharPref(PREF_EM_ENABLED_ADDONS, "");
-
-    if ("nsICrashReporter" in Ci &&
-        Services.appinfo instanceof Ci.nsICrashReporter) {
-      // Annotate the crash report with relevant add-on information.
-      try {
-        Services.appinfo.annotateCrashReport("Theme", this.selectedSkin);
-      } catch (e) { }
-      try {
-        Services.appinfo.annotateCrashReport("EMCheckCompatibility",
-                                             this.checkCompatibility);
-      } catch (e) { }
-      this.addAddonsToCrashReporter();
-    }
-
-    Services.prefs.addObserver(this.checkCompatibilityPref, this, false);
-    Services.prefs.addObserver(PREF_EM_CHECK_UPDATE_SECURITY, this, false);
-  },
-
-  /**
-   * Shuts down the database and releases all references.
-   */
-  shutdown: function XPI_shutdown() {
-    LOG("shutdown");
-
-    Services.prefs.removeObserver(this.checkCompatibilityPref, this);
-    Services.prefs.removeObserver(PREF_EM_CHECK_UPDATE_SECURITY, this);
-
-    if (Prefs.getBoolPref(PREF_PENDING_OPERATIONS, false)) {
-      XPIDatabase.updateActiveAddons();
-      Services.prefs.setBoolPref(PREF_PENDING_OPERATIONS, false);
-    }
-    XPIDatabase.shutdown();
-    this.installs = null;
-
-    this.installLocations = null;
-    this.installLocationsByName = null;
-  },
-
-  /**
-   * Adds a list of currently active add-ons to the next crash report.
-   */
-  addAddonsToCrashReporter: function XPI_addAddonsToCrashReporter() {
-    if (!("nsICrashReporter" in Ci) ||
-        !(Services.appinfo instanceof Ci.nsICrashReporter))
-      return;
-
-    let data = this.enabledAddons;
-    for (let id in this.bootstrappedAddons)
-      data += (data ? "," : "") + id + ":" + this.bootstrappedAddons[id].version;
-
-    try {
-      Services.appinfo.annotateCrashReport("Add-ons", data);
-    }
-    catch (e) { }
-  },
-
-  /**
-   * Gets the add-on states for an install location.
-   *
-   * @param  location
-   *         The install location to retrieve the add-on states for
-   * @return a dictionary mapping add-on IDs to objects with a descriptor
-   *         property which contains the add-ons directory descriptor and an
-   *         mtime property which contains the add-on's last modified time as
-   *         the number of milliseconds since the epoch.
-   */
-  getAddonStates: function XPI_getAddonStates(aLocation) {
-    let addonStates = {};
-    aLocation.addonLocations.forEach(function(dir) {
-      let id = aLocation.getIDForLocation(dir);
-      addonStates[id] = {
-        descriptor: dir.persistentDescriptor,
-        mtime: dir.lastModifiedTime
-      };
-    });
-
-    return addonStates;
-  },
-
-  /**
-   * Gets an array of install location states which uniquely describes all
-   * installed add-ons with the add-on's InstallLocation name and last modified
-   * time.
-   *
-   * @return an array of add-on states for each install location. Each state
-   *         is an object with a name property holding the location's name and
-   *         an addons property holding the add-on states for the location
-   */
-  getInstallLocationStates: function XPI_getInstallLocationStates() {
-    let states = [];
-    this.installLocations.forEach(function(aLocation) {
-      let addons = aLocation.addonLocations;
-      if (addons.length == 0)
-        return;
-
-      let locationState = {
-        name: aLocation.name,
-        addons: this.getAddonStates(aLocation)
-      };
-
-      states.push(locationState);
-    }, this);
-    return states;
-  },
-
-  /**
-   * Check the staging directories of install locations for any add-ons to be
-   * installed or add-ons to be uninstalled.
-   *
-   * @param  aManifests
-   *         A dictionary to add detected install manifests to for the purpose
-   *         of passing through updated compatibility information
-   * @return true if an add-on was installed or uninstalled
-   */
-  processPendingFileChanges: function XPI_processPendingFileChanges(aManifests) {
-    // TODO maybe this should be passed off to the install locations to handle?
-    let changed = false;
-    this.installLocations.forEach(function(aLocation) {
-      aManifests[aLocation.name] = {};
-      // We can't install or uninstall anything in locked locations
-      if (aLocation.locked)
-        return;
-
-      let stagingDir = aLocation.getStagingDir();
-      if (!stagingDir || !stagingDir.exists())
-        return;
-
-      let entries = stagingDir.directoryEntries;
-      while (entries.hasMoreElements()) {
-        let stageDirEntry = entries.getNext().QueryInterface(Ci.nsILocalFile);
-
-        // Only directories are important. Files may be updated manifests.
-        if (!stageDirEntry.isDirectory()) {
-          WARN("Ignoring file: " + stageDirEntry.path);
-          continue;
-        }
-
-        // Check that the directory's name is a valid ID.
-        let id = stageDirEntry.leafName;
-        if (!gIDTest.test(id)) {
-          WARN("Ignoring directory whose name is not a valid add-on ID: " +
-               stageDirEntry.path);
-          continue;
-        }
-
-        // Check if the directory contains an install manifest.
-        let manifest = stageDirEntry.clone();
-        manifest.append(FILE_INSTALL_MANIFEST);
-
-        // If the install manifest doesn't exist uninstall this add-on in this
-        // install location.
-        if (!manifest.exists()) {
-          LOG("Processing uninstall of " + id + " in " + aLocation.name);
-          aLocation.uninstallAddon(id);
-          // The file check later will spot the removal and cleanup the database
-          changed = true;
-          continue;
-        }
-
-        LOG("Processing install of " + id + " in " + aLocation.name);
-        try {
-          var addonInstallDir = aLocation.installAddon(id, stageDirEntry);
-        }
-        catch (e) {
-          ERROR("Failed to install staged add-on " + id + " in " + aLocation.name +
-                ": " + e);
-          continue;
-        }
-
-        aManifests[aLocation.name][id] = null;
-        changed = true;
-
-        // Check for a cached AddonInternal for this add-on, it may contain
-        // updated compatibility information
-        let jsonfile = stagingDir.clone();
-        jsonfile.append(id + ".json");
-        if (jsonfile.exists()) {
-          LOG("Found updated manifest for " + id + " in " + aLocation.name);
-          let fis = Cc["@mozilla.org/network/file-input-stream;1"].
-                       createInstance(Ci.nsIFileInputStream);
-          let json = Cc["@mozilla.org/dom/json;1"].
-                     createInstance(Ci.nsIJSON);
-
-          try {
-            fis.init(jsonfile, -1, 0, 0);
-            aManifests[aLocation.name][id] = json.decodeFromStream(fis,
-                                                                   jsonfile.fileSize);
-            aManifests[aLocation.name][id]._sourceBundle = addonInstallDir;
-          }
-          catch (e) {
-            ERROR("Unable to read add-on manifest for " + id + " in " +
-                  aLocation.name + ": " + e);
-          }
-          finally {
-            fis.close();
-          }
-        }
-      }
-
-      try {
-        stagingDir.remove(true);
-      }
-      catch (e) {
-        // Non-critical, just saves some perf on startup if we clean this up.
-        LOG("Error removing staging dir " + stagingDir.path + ": " + e);
-      }
-    });
-    return changed;
-  },
-
-  /**
-   * Compares the add-ons that are currently installed to those that were
-   * known to be installed when the application last ran and applies any
-   * changes found to the database.
-   *
-   * @param  aState
-   *         The array of current install location states
-   * @param  aManifests
-   *         A dictionary of cached AddonInstalls for add-ons that have been
-   *         installed
-   * @param  aUpdateCompatibility
-   *         true to update add-ons appDisabled property when the application
-   *         version has changed
-   * @return true if a change requiring a restart was detected
-   */
-  processFileChanges: function XPI_processFileChanges(aState, aManifests,
-                                                      aUpdateCompatibility,
-                                                      aMigrateData) {
-    let visibleAddons = {};
-
-    /**
-     * Updates an add-on's metadata and determines if a restart of the
-     * application is necessary. This is called when either the add-on's
-     * install directory path or last modified time has changed.
-     *
-     * @param  aInstallLocation
-     *         The install location containing the add-on
-     * @param  aOldAddon
-     *         The AddonInternal as it appeared the last time the application
-     *         ran
-     * @param  aAddonState
-     *         The new state of the add-on
-     * @return true if restarting the application is required to complete
-     *         changing this add-on
-     */
-    function updateMetadata(aInstallLocation, aOldAddon, aAddonState) {
-      LOG("Add-on " + aOldAddon.id + " modified in " + aInstallLocation.name);
-
-      // Check if there is an updated install manifest for this add-on
-      let newAddon = aManifests[aInstallLocation.name][aOldAddon.id];
-
-      try {
-        // If not load it from the directory
-        if (!newAddon) {
-          let dir = aInstallLocation.getLocationForID(aOldAddon.id);
-          newAddon = loadManifestFromDir(dir);
-        }
-
-        // The ID in the manifest that was loaded must match the ID of the old
-        // add-on.
-        if (newAddon.id != aOldAddon.id)
-          throw new Error("Incorrect id in install manifest");
-      }
-      catch (e) {
-        WARN("Add-on is invalid: " + e);
-        XPIDatabase.removeAddonMetadata(aOldAddon);
-        if (!aInstallLocation.locked)
-          aInstallLocation.uninstallAddon(aOldAddon.id);
-        else
-          WARN("Could not uninstall invalid item from locked install location");
-        // If this was an active add-on then we must force a restart
-        if (aOldAddon.active) {
-          if (aOldAddon.bootstrap)
-            delete XPIProvider.bootstrappedAddons[aOldAddon.id];
-          else
-            return true;
-        }
-
-        return false;
-      }
-
-      // Set the additional properties on the new AddonInternal
-      newAddon._installLocation = aInstallLocation;
-      newAddon.updateDate = aAddonState.mtime;
-      newAddon.visible = !(newAddon.id in visibleAddons);
-
-      // Update the database
-      XPIDatabase.updateAddonMetadata(aOldAddon, newAddon, aAddonState.descriptor);
-      if (newAddon.visible) {
-        visibleAddons[newAddon.id] = newAddon;
-        // If the old version was active and wasn't bootstrapped or the new
-        // version will be active and isn't bootstrapped then we must force a
-        // restart
-        if ((aOldAddon.active && !aOldAddon.bootstrap) ||
-            (newAddon.active && !newAddon.bootstrap)) {
-          return true;
-        }
-      }
-
-      return false;
-    }
-
-    /**
-     * Called when no change has been detected for an add-on's metadata. The
-     * add-on may have become visible due to other add-ons being removed or
-     * the add-on may need to be updated when the application version has
-     * changed.
-     *
-     * @param  aInstallLocation
-     *         The install location containing the add-on
-     * @param  aOldAddon
-     *         The AddonInternal as it appeared the last time the application
-     *         ran
-     * @param  aAddonState
-     *         The new state of the add-on
-     * @return a boolean indicating if restarting the application is required
-     *         to complete changing this add-on
-     */
-    function updateVisibilityAndCompatibility(aInstallLocation, aOldAddon,
-                                              aAddonState) {
-      let changed = false;
-
-      // This add-ons metadata has not changed but it may have become visible
-      if (!(aOldAddon.id in visibleAddons)) {
-        visibleAddons[aOldAddon.id] = aOldAddon;
-
-        if (!aOldAddon.visible) {
-          XPIDatabase.makeAddonVisible(aOldAddon);
-
-          // If the add-on is bootstrappable and it should be active then
-          // mark it as active and add it to the list to be activated.
-          if (aOldAddon.bootstrap && !aOldAddon.appDisabled &&
-              !aOldAddon.userDisabled) {
-            aOldAddon.active = true;
-            XPIDatabase.updateAddonActive(aOldAddon);
-            XPIProvider.bootstrappedAddons[aOldAddon.id] = {
-              version: aOldAddon.version,
-              descriptor: aAddonState.descriptor
-            };
-          }
-          else {
-            // Otherwise a restart is necessary
-            changed = true;
-          }
-        }
-      }
-
-      // App version changed, we may need to update the appDisabled property.
-      if (aUpdateCompatibility) {
-        let appDisabled = !isUsableAddon(aOldAddon);
-
-        // If the property has changed update the database.
-        if (appDisabled != aOldAddon.appDisabled) {
-          LOG("Add-on " + aOldAddon.id + " changed appDisabled state to " +
-              appDisabled);
-          XPIDatabase.setAddonProperties(aOldAddon, {
-            appDisabled: appDisabled
-          });
-
-          // If this is a visible add-on and it isn't userDisabled then we
-          // may need a restart or to update the bootstrap list.
-          if (aOldAddon.visible && !aOldAddon.userDisabled) {
-            if (aOldAddon.bootstrap) {
-              // When visible and not userDisabled, active is the opposite of
-              // appDisabled.
-              aOldAddon.active = !aOldAddon.appDisabled;
-              XPIDatabase.updateAddonActive(aOldAddon);
-              if (aOldAddon.active) {
-                XPIProvider.bootstrappedAddons[aOldAddon.id] = {
-                  version: aOldAddon.version,
-                  descriptor: aAddonState.descriptor
-                };
-              }
-              else {
-                delete XPIProvider.bootstrappedAddons[aOldAddon.id];
-              }
-            }
-            else {
-              changed = true;
-            }
-          }
-        }
-      }
-
-      return changed;
-    }
-
-    /**
-     * Called when an add-on has been removed.
-     *
-     * @param  aInstallLocation
-     *         The install location containing the add-on
-     * @param  aOldAddon
-     *         The AddonInternal as it appeared the last time the application
-     *         ran
-     * @return a boolean indicating if restarting the application is required
-     *         to complete changing this add-on
-     */
-    function removeMetadata(aInstallLocation, aOldAddon) {
-      // This add-on has disappeared
-      LOG("Add-on " + aOldAddon.id + " removed from " + aInstallLocation.name);
-      XPIDatabase.removeAddonMetadata(aOldAddon);
-      if (aOldAddon.active) {
-
-        // Enable the default theme if the previously active theme has been
-        // removed
-        if (aOldAddon.type == "theme")
-          XPIProvider.enableDefaultTheme();
-
-        // If this was an active add-on and bootstrapped we must remove it from
-        // the bootstrapped list, otherwise we need to force a restart.
-        if (!aOldAddon.bootstrap)
-          return true;
-
-        XPIProvider.unloadBootstrapScope(aOldAddon.id);
-      }
-
-      return false;
-    }
-
-    /**
-     * Called when a new add-on has been detected.
-     *
-     * @param  aInstallLocation
-     *         The install location containing the add-on
-     * @param  aId
-     *         The ID of the add-on
-     * @param  aAddonState
-     *         The new state of the add-on
-     * @param  aMigrateData
-     *         If during startup the database had to be upgraded this will
-     *         contain data that used to be held about this add-on
-     * @return a boolean indicating if restarting the application is required
-     *         to complete changing this add-on
-     */
-    function addMetadata(aInstallLocation, aId, aAddonState, aMigrateData) {
-      LOG("New add-on " + aId + " installed in " + aInstallLocation.name);
-
-      // Check the updated manifests lists for a manifest for this add-on
-      let newAddon = aManifests[aInstallLocation.name][aId];
-
-      try {
-        // Otherwise load the manifest from the add-on's directory.
-        if (!newAddon)
-          newAddon = loadManifestFromDir(aInstallLocation.getLocationForID(aId));
-        // The add-on in the manifest should match the add-on ID.
-        if (newAddon.id != aId)
-          throw new Error("Incorrect id in install manifest");
-      }
-      catch (e) {
-        WARN("Add-on is invalid: " + e);
-
-        // Remove the invalid add-on from the install location if the install
-        // location isn't locked, no restart will be necessary
-        if (!aInstallLocation.locked)
-          aInstallLocation.uninstallAddon(aId);
-        else
-          WARN("Could not uninstall invalid item from locked install location");
-        return false;
-      }
-
-      // Update the AddonInternal properties.
-      newAddon._installLocation = aInstallLocation;
-      newAddon.visible = !(newAddon.id in visibleAddons);
-      newAddon.installDate = aAddonState.mtime;
-      newAddon.updateDate = aAddonState.mtime;
-
-      // If there is migration data then apply it.
-      if (aMigrateData) {
-        newAddon.userDisabled = aMigrateData.userDisabled;
-        if ("installDate" in aMigrateData)
-          newAddon.installDate = aMigrateData.installDate;
-        if ("targetApplications" in aMigrateData)
-          newAddon.applyCompatibilityUpdate(aMigrateData, true);
-      }
-
-      // Update the database.
-      XPIDatabase.addAddonMetadata(newAddon, aAddonState.descriptor);
-
-      // Visible bootstrapped add-ons need to have their install method called
-      if (newAddon.visible) {
-        visibleAddons[newAddon.id] = newAddon;
-        if (!newAddon.bootstrap)
-          return true;
-
-        let dir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
-        dir.persistentDescriptor = aAddonState.descriptor;
-        XPIProvider.callBootstrapMethod(newAddon.id, newAddon.version, dir,
-                                        "install",
-                                        BOOTSTRAP_REASONS.ADDON_INSTALL);
-      }
-
-      return false;
-    }
-
-    let changed = false;
-    let knownLocations = XPIDatabase.getInstallLocations();
-
-    // The install locations are iterated in reverse order of priority so when
-    // there are multiple add-ons installed with the same ID the one that
-    // should be visible is the first one encountered.
-    aState.reverse().forEach(function(aSt) {
-
-      // We can't include the install location directly in the state as it has
-      // to be cached as JSON.
-      let installLocation = this.installLocationsByName[aSt.name];
-      let addonStates = aSt.addons;
-
-      // Check if the database knows about any add-ons in this install location.
-      let pos = knownLocations.indexOf(installLocation.name);
-      if (pos >= 0) {
-        knownLocations.splice(pos, 1);
-        let addons = XPIDatabase.getAddonsInLocation(installLocation.name);
-        // Iterate through the add-ons installed the last time the application
-        // ran
-        addons.forEach(function(aOldAddon) {
-          // Check if the add-on is still installed
-          if (aOldAddon.id in addonStates) {
-            let addonState = addonStates[aOldAddon.id];
-            delete addonStates[aOldAddon.id];
-
-            // The add-on has changed if the modification time has changed, or
-            // the directory it is installed in has changed or we have an
-            // updated manifest for it.
-            if (aOldAddon.id in aManifests[installLocation.name] ||
-                aOldAddon.updateDate != addonState.mtime ||
-                aOldAddon._descriptor != addonState.descriptor) {
-              changed = updateMetadata(installLocation, aOldAddon, addonState) ||
-                        changed;
-            }
-            else {
-              changed = updateVisibilityAndCompatibility(installLocation,
-                                                         aOldAddon, addonState) ||
-                        changed;
-            }
-          }
-          else {
-            changed = removeMetadata(installLocation, aOldAddon) || changed;
-          }
-        }, this);
-      }
-
-      // All the remaining add-ons in this install location must be new.
-
-      // Get the migration data for this install location.
-      let locMigrateData = {};
-      if (aMigrateData && installLocation.name in aMigrateData)
-        locMigrateData = aMigrateData[installLocation.name];
-      for (let id in addonStates) {
-        changed = addMetadata(installLocation, id, addonStates[id],
-                              locMigrateData[id]) || changed;
-      }
-    }, this);
-
-    // The remaining locations that had add-ons installed in them no longer
-    // have any add-ons installed in them, or the locations no longer exist.
-    // The metadata for the add-ons that were in them must be removed from the
-    // database.
-    knownLocations.forEach(function(aLocation) {
-      let addons = XPIDatabase.getAddonsInLocation(aLocation);
-      addons.forEach(function(aOldAddon) {
-        changed = removeMetadata(aLocation, aOldAddon) || changed;
-      }, this);
-    }, this);
-
-    // Cache the new install location states
-    cache = JSON.stringify(this.getInstallLocationStates());
-    Services.prefs.setCharPref(PREF_INSTALL_CACHE, cache);
-    return changed;
-  },
-
-  /**
-   * Imports the xpinstall permissions from preferences into the permissions
-   * manager for the user to change later.
-   */
-  importPermissions: function XPI_importPermissions() {
-    function importList(aPrefBranch, aAction) {
-      let list = Services.prefs.getChildList(aPrefBranch, {});
-      list.forEach(function(aPref) {
-        let hosts = Prefs.getCharPref(aPref, "");
-        if (!hosts)
-          return;
-
-        hosts.split(",").forEach(function(aHost) {
-          Services.perms.add(NetUtil.newURI("http://" + aHost), XPI_PERMISSION,
-                             aAction);
-        });
-      });
-    }
-
-    importList(PREF_XPI_WHITELIST_PERMISSIONS,
-               Ci.nsIPermissionManager.ALLOW_ACTION);
-    importList(PREF_XPI_BLACKLIST_PERMISSIONS,
-               Ci.nsIPermissionManager.DENY_ACTION);
-  },
-
-  /**
-   * Checks for any changes that have occurred since the last time the
-   * application was launched.
-   *
-   * @param  aAppChanged
-   *         true if the application has changed version number since the last
-   *         launch
-   * @return true if a change requiring a restart was detected
-   */
-  checkForChanges: function XPI_checkForChanges(aAppChanged) {
-    LOG("checkForChanges");
-
-    // Import the website installation permisisons if the applicatio has changed
-    if (aAppChanged)
-      this.importPermissions();
-
-    // First install any new add-ons into the locations, we'll detect these when
-    // we read the install state
-    let manifests = {};
-    let changed = this.processPendingFileChanges(manifests);
-
-    // We have to hold the DB scheme in prefs so we don't need to load the
-    // database to see if we need to migrate data
-    let schema = Prefs.getIntPref(PREF_DB_SCHEMA, 0);
-
-    let migrateData = null;
-    let cache = null;
-    if (schema != DB_SCHEMA) {
-      // The schema has changed so migrate data from the old schema
-      migrateData = XPIDatabase.migrateData(schema);
-    }
-    else {
-      // If the database exists then the previous file cache can be trusted
-      // otherwise create an empty database
-      let db = FileUtils.getFile(KEY_PROFILEDIR, [FILE_DATABASE], true);
-      if (db.exists()) {
-        cache = Prefs.getCharPref(PREF_INSTALL_CACHE, null);
-      }
-      else {
-        LOG("Database is missing, recreating");
-        XPIDatabase.openConnection();
-        XPIDatabase.createSchema();
-      }
-     }
-
-    // Load the list of bootstrapped add-ons first so processFileChanges can
-    // modify it
-    this.bootstrappedAddons = JSON.parse(Prefs.getCharPref(PREF_BOOTSTRAP_ADDONS,
-                                         "{}"));
-    let state = this.getInstallLocationStates();
-    if (aAppChanged || changed || cache == null ||
-        cache != JSON.stringify(state)) {
-      try {
-        changed = this.processFileChanges(state, manifests, aAppChanged,
-                                          migrateData);
-      }
-      catch (e) {
-        ERROR("Error processing file changes: " + e);
-      }
-    }
-
-    // If the application crashed before completing any pending operations then
-    // we should perform them now.
-    if (changed || Prefs.getBoolPref(PREF_PENDING_OPERATIONS)) {
-      LOG("Restart necessary");
-      XPIDatabase.updateActiveAddons();
-      Services.prefs.setBoolPref(PREF_PENDING_OPERATIONS, false);
-      return true;
-    }
-
-    LOG("No changes found");
-
-    // Check that the add-ons list still exists
-    let addonsList = FileUtils.getFile(KEY_PROFILEDIR, [FILE_XPI_ADDONS_LIST],
-                                       true);
-    if (!addonsList.exists()) {
-      LOG("Add-ons list is missing, recreating");
-      XPIDatabase.writeAddonsList();
-      return true;
-    }
-
-    for (let id in this.bootstrappedAddons) {
-      let dir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
-      dir.persistentDescriptor = this.bootstrappedAddons[id].descriptor;
-      this.callBootstrapMethod(id, this.bootstrappedAddons[id].version, dir,
-                               "startup", BOOTSTRAP_REASONS.APP_STARTUP);
-    }
-
-    // Let these shutdown a little earlier when they still have access to most
-    // of XPCOM
-    Services.obs.addObserver({
-      observe: function(aSubject, aTopic, aData) {
-        Services.prefs.setCharPref(PREF_BOOTSTRAP_ADDONS,
-                                   JSON.stringify(XPIProvider.bootstrappedAddons));
-        for (let id in XPIProvider.bootstrappedAddons) {
-          let dir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
-          dir.persistentDescriptor = XPIProvider.bootstrappedAddons[id].descriptor;
-          XPIProvider.callBootstrapMethod(id, XPIProvider.bootstrappedAddons[id].version,
-                                          dir, "shutdown",
-                                          BOOTSTRAP_REASONS.APP_SHUTDOWN);
-        }
-        Services.obs.removeObserver(this, "quit-application-granted");
-      }
-    }, "quit-application-granted", false);
-
-    return false;
-  },
-
-  /**
-   * Called to test whether this provider supports installing a particular
-   * mimetype.
-   *
-   * @param  aMimetype
-   *         The mimetype to check for
-   * @return true if the mimetype is application/x-xpinstall
-   */
-  supportsMimetype: function XPI_supportsMimetype(aMimetype) {
-    return aMimetype == "application/x-xpinstall";
-  },
-
-  /**
-   * Called to test whether installing XPI add-ons is enabled.
-   *
-   * @return true if installing is enabled
-   */
-  isInstallEnabled: function XPI_isInstallEnabled() {
-    // Default to enabled if the preference does not exist
-    return Prefs.getBoolPref(PREF_XPI_ENABLED, true);
-  },
-
-  /**
-   * Called to test whether installing XPI add-ons from a URI is allowed.
-   *
-   * @param  aUri
-   *         The URI being installed from
-   * @return true if installing is allowed
-   */<