diff --git a/xpcom/glue/nsCategoryCache.cpp b/xpcom/glue/nsCategoryCache.cpp --- a/xpcom/glue/nsCategoryCache.cpp +++ b/xpcom/glue/nsCategoryCache.cpp @@ -58,51 +58,53 @@ nsCategoryObserver::nsCategoryObserver(c do_GetService(NS_CATEGORYMANAGER_CONTRACTID); if (!catMan) return; nsCOMPtr enumerator; nsresult rv = catMan->EnumerateCategory(aCategory, getter_AddRefs(enumerator)); if (NS_FAILED(rv)) return; + nsTArray entries; nsCOMPtr entry; while (NS_SUCCEEDED(enumerator->GetNext(getter_AddRefs(entry)))) { nsCOMPtr entryName = do_QueryInterface(entry, &rv); if (NS_SUCCEEDED(rv)) { nsCAutoString categoryEntry; rv = entryName->GetData(categoryEntry); nsCString entryValue; catMan->GetCategoryEntry(aCategory, categoryEntry.get(), getter_Copies(entryValue)); if (NS_SUCCEEDED(rv)) { mHash.Put(categoryEntry, entryValue); - mListener->EntryAdded(entryValue); + entries.AppendElement(entryValue); } } } // Now, listen for changes nsCOMPtr serv = do_GetService(NS_OBSERVERSERVICE_CONTRACTID); - if (!serv) - return; + if (serv) { + serv->AddObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID, PR_FALSE); + serv->AddObserver(this, NS_XPCOM_CATEGORY_ENTRY_ADDED_OBSERVER_ID, PR_FALSE); + serv->AddObserver(this, NS_XPCOM_CATEGORY_ENTRY_REMOVED_OBSERVER_ID, PR_FALSE); + serv->AddObserver(this, NS_XPCOM_CATEGORY_CLEARED_OBSERVER_ID, PR_FALSE); + } - serv->AddObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID, PR_FALSE); - - serv->AddObserver(this, NS_XPCOM_CATEGORY_ENTRY_ADDED_OBSERVER_ID, PR_FALSE); - serv->AddObserver(this, NS_XPCOM_CATEGORY_ENTRY_REMOVED_OBSERVER_ID, PR_FALSE); - serv->AddObserver(this, NS_XPCOM_CATEGORY_CLEARED_OBSERVER_ID, PR_FALSE); + for (PRUint32 entries.Length(); i-- > 0; ) + mListener->EntryAdded(entryValue); } nsCategoryObserver::~nsCategoryObserver() { } NS_IMPL_ISUPPORTS1(nsCategoryObserver, nsIObserver) void nsCategoryObserver::ListenerDied() { mListener = nsnull;