From a6b1d01e92e634174de74fd258a2594f156d90f0 Mon Sep 17 00:00:00 2001 From: Benjamin Smedberg Date: Wed, 23 Jun 2010 12:18:32 -0400 Subject: [PATCH] Bug 568691 - Register extension components/chrome again. This doesn't remove the EM restart yet, because there's some weirdness about reading default prefs from extensions that needs to be solved first. --- chrome/public/nsIToolkitChromeRegistry.idl | 10 -- toolkit/xre/nsXREDirProvider.cpp | 146 +++++---------------- toolkit/xre/nsXREDirProvider.h | 8 +- 3 files changed, 34 insertions(+), 130 deletions(-) diff --git a/chrome/public/nsIToolkitChromeRegistry.idl b/chrome/public/nsIToolkitChromeRegistry.idl index bc8da74d02a..d1b9010305a 100644 --- a/chrome/public/nsIToolkitChromeRegistry.idl +++ b/chrome/public/nsIToolkitChromeRegistry.idl @@ -59,13 +59,3 @@ interface nsIToolkitChromeRegistry : nsIXULChromeRegistry */ nsIUTF8StringEnumerator getLocalesForPackage(in AUTF8String aPackage); }; - -/** - * The chrome registry will ask the directory service for this file list and - * process each file as a manifest. Skin manifests may contain only skin - * and style overlays. - */ -%{ C++ -#define NS_CHROME_MANIFESTS_FILE_LIST "ChromeML" -#define NS_SKIN_MANIFESTS_FILE_LIST "SkinML" -%} diff --git a/toolkit/xre/nsXREDirProvider.cpp b/toolkit/xre/nsXREDirProvider.cpp index f9c8c603155..f43029a877f 100644 --- a/toolkit/xre/nsXREDirProvider.cpp +++ b/toolkit/xre/nsXREDirProvider.cpp @@ -103,11 +103,20 @@ #define PREF_OVERRIDE_DIRNAME "preferences" +static already_AddRefed +CloneAndAppend(nsIFile* aFile, const char* name) +{ + nsCOMPtr file; + aFile->Clone(getter_AddRefs(file)); + nsCOMPtr lfile = do_QueryInterface(file); + lfile->AppendNative(nsDependentCString(name)); + return lfile.forget(); +} + nsXREDirProvider* gDirServiceProvider = nsnull; nsXREDirProvider::nsXREDirProvider() : - mProfileNotified(PR_FALSE), - mExtensionsLoaded(PR_FALSE) + mProfileNotified(PR_FALSE) { gDirServiceProvider = this; } @@ -139,6 +148,7 @@ nsXREDirProvider::Initialize(nsIFile *aXULAppDir, } } + LoadAppBundleDirs(); return NS_OK; } @@ -407,37 +417,6 @@ nsXREDirProvider::GetFile(const char* aProperty, PRBool* aPersistent, return NS_OK; } -static void -LoadPlatformDirectory(nsIFile* aBundleDirectory, - nsCOMArray &aDirectories) -{ - nsCOMPtr platformDir; - nsresult rv = aBundleDirectory->Clone(getter_AddRefs(platformDir)); - if (NS_FAILED(rv)) - return; - - platformDir->AppendNative(NS_LITERAL_CSTRING("platform")); - -#ifdef TARGET_OS_ABI - nsCOMPtr platformABIDir; - rv = platformDir->Clone(getter_AddRefs(platformABIDir)); - if (NS_FAILED(rv)) - return; -#endif - - platformDir->AppendNative(NS_LITERAL_CSTRING(OS_TARGET)); - - PRBool exists; - if (NS_SUCCEEDED(platformDir->Exists(&exists)) && exists) - aDirectories.AppendObject(platformDir); - -#ifdef TARGET_OS_ABI - platformABIDir->AppendNative(NS_LITERAL_CSTRING(TARGET_OS_ABI)); - if (NS_SUCCEEDED(platformABIDir->Exists(&exists)) && exists) - aDirectories.AppendObject(platformABIDir); -#endif -} - static void LoadAppDirIntoArray(nsIFile* aXULAppDir, const char *const *aAppendList, @@ -523,7 +502,8 @@ nsXREDirProvider::GetFiles(const char* aProperty, nsISimpleEnumerator** aResult) static void LoadExtensionDirectories(nsINIParser &parser, const char *aSection, - nsCOMArray &aDirectories) + nsCOMArray &aDirectories, + NSLocationType aType) { nsresult rv; PRInt32 i = 0; @@ -545,24 +525,17 @@ LoadExtensionDirectories(nsINIParser &parser, continue; aDirectories.AppendObject(dir); - LoadPlatformDirectory(dir, aDirectories); + + nsCOMPtr manifest = + CloneAndAppend(dir, "chrome.manifest"); + XRE_AddComponentLocation(aType, manifest); } while (PR_TRUE); } void -nsXREDirProvider::LoadBundleDirectories() +nsXREDirProvider::LoadExtensionBundleDirectories() { - if (mExtensionsLoaded) - return; - - mExtensionsLoaded = PR_TRUE; - - // first load distribution/bundles - LoadPlatformDirectory(mXULAppDir, mAppBundleDirectories); - - LoadAppBundleDirs(); - if (mProfileDir && !gSafeMode) { nsCOMPtr extensionsINI; mProfileDir->Clone(getter_AddRefs(extensionsINI)); @@ -581,8 +554,10 @@ nsXREDirProvider::LoadBundleDirectories() if (NS_FAILED(rv)) return; - LoadExtensionDirectories(parser, "ExtensionDirs", mExtensionDirectories); - LoadExtensionDirectories(parser, "ThemeDirs", mThemeDirectories); + LoadExtensionDirectories(parser, "ExtensionDirs", mExtensionDirectories, + NS_COMPONENT_LOCATION); + LoadExtensionDirectories(parser, "ThemeDirs", mThemeDirectories, + NS_SKIN_LOCATION); } } @@ -597,10 +572,6 @@ nsXREDirProvider::LoadAppBundleDirs() dir->AppendNative(NS_LITERAL_CSTRING("distribution")); dir->AppendNative(NS_LITERAL_CSTRING("bundles")); - PRBool exists; - if (NS_FAILED(dir->Exists(&exists)) || !exists) - return; - nsCOMPtr e; rv = dir->GetDirectoryEntries(getter_AddRefs(e)); if (NS_FAILED(rv)) @@ -613,7 +584,10 @@ nsXREDirProvider::LoadAppBundleDirs() nsCOMPtr subdir; while (NS_SUCCEEDED(files->GetNextFile(getter_AddRefs(subdir))) && subdir) { mAppBundleDirectories.AppendObject(subdir); - LoadPlatformDirectory(subdir, mAppBundleDirectories); + + nsCOMPtr manifest = + CloneAndAppend(subdir, "chrome.manifest"); + XRE_AddComponentLocation(NS_COMPONENT_LOCATION, manifest); } } @@ -646,7 +620,6 @@ nsXREDirProvider::GetFilesInternal(const char* aProperty, static const char *const kAppendNothing[] = { nsnull }; - LoadBundleDirectories(); LoadDirsIntoArray(mAppBundleDirectories, kAppendNothing, directories); LoadDirsIntoArray(mExtensionDirectories, @@ -654,25 +627,9 @@ nsXREDirProvider::GetFilesInternal(const char* aProperty, rv = NS_NewArrayEnumerator(aResult, directories); } -#if 0 - else if (!strcmp(aProperty, NS_XPCOM_COMPONENT_DIR_LIST)) { - static const char *const kAppendCompDir[] = { "components", nsnull }; - nsCOMArray directories; - - LoadBundleDirectories(); - LoadDirsIntoArray(mAppBundleDirectories, - kAppendCompDir, directories); - LoadDirsIntoArray(mExtensionDirectories, - kAppendCompDir, directories); - - rv = NS_NewArrayEnumerator(aResult, directories); - } -#endif else if (!strcmp(aProperty, NS_APP_PREFS_DEFAULTS_DIR_LIST)) { nsCOMArray directories; - LoadBundleDirectories(); - LoadAppDirIntoArray(mXULAppDir, kAppendPrefDir, directories); LoadDirsIntoArray(mAppBundleDirectories, kAppendPrefDir, directories); @@ -682,7 +639,6 @@ nsXREDirProvider::GetFilesInternal(const char* aProperty, else if (!strcmp(aProperty, NS_EXT_PREFS_DEFAULTS_DIR_LIST)) { nsCOMArray directories; - LoadBundleDirectories(); LoadDirsIntoArray(mExtensionDirectories, kAppendPrefDir, directories); @@ -698,56 +654,12 @@ nsXREDirProvider::GetFilesInternal(const char* aProperty, rv = NS_NewArrayEnumerator(aResult, directories); } - else if (!strcmp(aProperty, NS_CHROME_MANIFESTS_FILE_LIST)) { - nsCOMArray manifests; - -#ifdef MOZ_OMNIJAR - if (!mozilla::OmnijarPath()) { -#endif - nsCOMPtr manifest; - mGREDir->Clone(getter_AddRefs(manifest)); - manifest->AppendNative(NS_LITERAL_CSTRING("chrome")); - manifests.AppendObject(manifest); -#ifdef MOZ_OMNIJAR - } -#endif - - PRBool eq; - if (NS_SUCCEEDED(mXULAppDir->Equals(mGREDir, &eq)) && !eq) { - nsCOMPtr file; - mXULAppDir->Clone(getter_AddRefs(file)); - file->AppendNative(NS_LITERAL_CSTRING("chrome")); - PRBool exists; - if (NS_SUCCEEDED(file->Exists(&exists)) && exists) - manifests.AppendObject(file); - } - - LoadBundleDirectories(); - LoadDirsIntoArray(mAppBundleDirectories, - kAppendChromeManifests, - manifests); - LoadDirsIntoArray(mExtensionDirectories, - kAppendChromeManifests, - manifests); - - rv = NS_NewArrayEnumerator(aResult, manifests); - } - else if (!strcmp(aProperty, NS_SKIN_MANIFESTS_FILE_LIST)) { - nsCOMArray manifests; - - LoadBundleDirectories(); - LoadDirsIntoArray(mThemeDirectories, - kAppendChromeManifests, manifests); - - rv = NS_NewArrayEnumerator(aResult, manifests); - } else if (!strcmp(aProperty, NS_APP_CHROME_DIR_LIST)) { // NS_APP_CHROME_DIR_LIST is only used to get default (native) icons // for OS window decoration. static const char *const kAppendChromeDir[] = { "chrome", nsnull }; nsCOMArray directories; - LoadBundleDirectories(); LoadAppDirIntoArray(mXULAppDir, kAppendChromeDir, directories); @@ -766,7 +678,6 @@ nsXREDirProvider::GetFilesInternal(const char* aProperty, // The root dirserviceprovider does quite a bit for us: we're mainly // interested in xulapp and extension-provided plugins. - LoadBundleDirectories(); LoadDirsIntoArray(mAppBundleDirectories, kAppendPlugins, directories); @@ -816,6 +727,9 @@ nsXREDirProvider::DoStartup() // Init the Extension Manager nsCOMPtr em = do_GetService("@mozilla.org/addons/integration;1"); em->Observe(nsnull, "addons-startup", nsnull); + + LoadExtensionBundleDirectories(); + obsSvc->NotifyObservers(nsnull, "profile-after-change", kStartup); // Any component that has registered for the profile-after-change category diff --git a/toolkit/xre/nsXREDirProvider.h b/toolkit/xre/nsXREDirProvider.h index dd25e0ef41b..1b0db5de47f 100644 --- a/toolkit/xre/nsXREDirProvider.h +++ b/toolkit/xre/nsXREDirProvider.h @@ -134,9 +134,10 @@ protected: // delimiters. static inline nsresult AppendProfileString(nsIFile* aFile, const char* aPath); - // Calculate all bundle directories, including distribution bundles, - // extensions, and themes - void LoadBundleDirectories(); + // Calculate and register extension and theme bundle directories. + void LoadExtensionBundleDirectories(); + + // Calculate and register app-bundled extension directories. void LoadAppBundleDirs(); void Append(nsIFile* aDirectory); @@ -147,7 +148,6 @@ protected: nsCOMPtr mProfileDir; nsCOMPtr mProfileLocalDir; PRPackedBool mProfileNotified; - PRPackedBool mExtensionsLoaded; nsCOMArray mAppBundleDirectories; nsCOMArray mExtensionDirectories; nsCOMArray mThemeDirectories;