diff --git a/mozilla/docshell/base/nsDocShell.cpp b/mozilla/docshell/base/nsDocShell.cpp index bd98068a098..cc00dbbc289 100644 --- a/mozilla/docshell/base/nsDocShell.cpp +++ b/mozilla/docshell/base/nsDocShell.cpp @@ -125,6 +125,8 @@ // for embedding #include "nsIWebBrowserChromeFocus.h" +#include "nsPluginError.h" + static NS_DEFINE_IID(kDeviceContextCID, NS_DEVICE_CONTEXT_CID); static NS_DEFINE_CID(kSimpleURICID, NS_SIMPLEURI_CID); static NS_DEFINE_CID(kDocumentCharsetInfoCID, NS_DOCUMENTCHARSETINFO_CID); @@ -4183,14 +4185,15 @@ nsDocShell::NewContentViewerObj(const char *aContentType, docLoaderFactory(do_CreateInstance(contractId.get())); if (!docLoaderFactory) { // try again after loading plugins - nsresult err; - nsCOMPtr pluginHost = - do_GetService(kPluginManagerCID, &err); - - if (NS_FAILED(err)) + nsCOMPtr pluginManager = do_GetService(kPluginManagerCID); + if (!pluginManager) return NS_ERROR_FAILURE; - pluginHost->LoadPlugins(); + // no need to do anything if plugins have not been changed + // PR_FALSE will ensure that currently running plugins will not be shut down + // but the plugin list will still be updated with newly installed plugins + if (NS_ERROR_PLUGINS_PLUGINSNOTCHANGED == pluginManager->ReloadPlugins(PR_FALSE)) + return NS_ERROR_FAILURE; docLoaderFactory = do_CreateInstance(contractId.get()); diff --git a/mozilla/dom/src/base/nsPluginArray.cpp b/mozilla/dom/src/base/nsPluginArray.cpp index 56a0265e616..82164df05ed 100644 --- a/mozilla/dom/src/base/nsPluginArray.cpp +++ b/mozilla/dom/src/base/nsPluginArray.cpp @@ -49,6 +49,7 @@ #include "nsIWebNavigation.h" #include "nsDOMClassInfo.h" #include "nsPluginError.h" +#include "nsIComponentRegistrar.h" static NS_DEFINE_CID(kPluginManagerCID, NS_PLUGINMANAGER_CID); @@ -175,17 +176,12 @@ PluginArrayImpl::Refresh(PRBool aReloadDocuments) { nsresult res = NS_OK; - nsCOMPtr webNav = do_QueryInterface(mDocShell); - - if (mPluginArray != nsnull) { - for (PRUint32 i = 0; i < mPluginCount; i++) - NS_IF_RELEASE(mPluginArray[i]); - - delete[] mPluginArray; - } - - mPluginCount = 0; - mPluginArray = nsnull; + // refresh the component registry first, see bug 87913 + nsCOMPtr servManager; + NS_GetServiceManager(getter_AddRefs(servManager)); + nsCOMPtr registrar = do_QueryInterface(servManager); + if (registrar) + registrar->AutoRegister(nsnull); if (!mPluginHost) { mPluginHost = do_GetService(kPluginManagerCID, &res); @@ -208,6 +204,18 @@ PluginArrayImpl::Refresh(PRBool aReloadDocuments) if(pluginsNotChanged) return res; + nsCOMPtr webNav = do_QueryInterface(mDocShell); + + if (mPluginArray != nsnull) { + for (PRUint32 i = 0; i < mPluginCount; i++) + NS_IF_RELEASE(mPluginArray[i]); + + delete[] mPluginArray; + } + + mPluginCount = 0; + mPluginArray = nsnull; + if (mNavigator) mNavigator->RefreshMIMEArray();