diff --git a/mozilla/dom/src/base/nsGlobalWindow.cpp b/mozilla/dom/src/base/nsGlobalWindow.cpp index 3189f8df887..8814ebdc1ab 100644 --- a/mozilla/dom/src/base/nsGlobalWindow.cpp +++ b/mozilla/dom/src/base/nsGlobalWindow.cpp @@ -428,6 +428,8 @@ NS_IMETHODIMP GlobalWindowImpl::SetDocShell(nsIDocShell* aDocShell) if (mLocation) mLocation->SetDocShell(aDocShell); + if (mNavigator) + mNavigator->SetDocShell(aDocShell); if (mHistory) mHistory->SetDocShell(aDocShell); if (mFrames) @@ -680,7 +682,7 @@ NS_IMETHODIMP GlobalWindowImpl::GetSelf(nsIDOMWindowInternal** aWindow) NS_IMETHODIMP GlobalWindowImpl::GetNavigator(nsIDOMNavigator** aNavigator) { if (!mNavigator) { - mNavigator = new NavigatorImpl(); + mNavigator = new NavigatorImpl(mDocShell); NS_ENSURE_TRUE(mNavigator, NS_ERROR_OUT_OF_MEMORY); NS_ADDREF(mNavigator); } @@ -4499,8 +4501,11 @@ extern //*** NavigatorImpl: Object Management //***************************************************************************** -NavigatorImpl::NavigatorImpl():mScriptObject(nsnull), mMimeTypes(nsnull), -mPlugins(nsnull) +NavigatorImpl::NavigatorImpl(nsIDocShell *aDocShell) : + mScriptObject(nsnull), + mMimeTypes(nsnull), + mPlugins(nsnull), + mDocShell(aDocShell) { NS_INIT_REFCNT(); } @@ -4551,6 +4556,14 @@ NS_IMETHODIMP NavigatorImpl::GetScriptObject(nsIScriptContext *aContext, return res; } + +void NavigatorImpl::SetDocShell(nsIDocShell *aDocShell) +{ + mDocShell = aDocShell; + if (mPlugins) + mPlugins->SetDocShell(aDocShell); +} + //***************************************************************************** // NavigatorImpl::nsIDOMNavigator //***************************************************************************** @@ -4764,7 +4777,7 @@ NS_IMETHODIMP NavigatorImpl::GetMimeTypes(nsIDOMMimeTypeArray **aMimeTypes) NS_IMETHODIMP NavigatorImpl::GetPlugins(nsIDOMPluginArray **aPlugins) { if (!mPlugins) { - mPlugins = new PluginArrayImpl(this); + mPlugins = new PluginArrayImpl(this, mDocShell); NS_IF_ADDREF(mPlugins); } diff --git a/mozilla/dom/src/base/nsGlobalWindow.h b/mozilla/dom/src/base/nsGlobalWindow.h index a209acf96c0..d7ff5f707f4 100644 --- a/mozilla/dom/src/base/nsGlobalWindow.h +++ b/mozilla/dom/src/base/nsGlobalWindow.h @@ -53,6 +53,7 @@ #include "nsIDOMPkcs11.h" #include "nsISidebar.h" #include "nsIPrincipal.h" +#include "nsPluginArray.h" #define DEFAULT_HOME_PAGE "www.mozilla.org" #define PREF_BROWSER_STARTUP_HOMEPAGE "browser.startup.homepage" @@ -302,7 +303,7 @@ struct nsTimeoutImpl { class NavigatorImpl : public nsIScriptObjectOwner, public nsIDOMNavigator { public: - NavigatorImpl(); + NavigatorImpl(nsIDocShell *aDocShell); virtual ~NavigatorImpl(); NS_DECL_ISUPPORTS @@ -312,10 +313,13 @@ public: NS_IMETHOD GetScriptObject(nsIScriptContext *aContext, void** aScriptObject); NS_IMETHOD SetScriptObject(void *aScriptObject); + void SetDocShell(nsIDocShell *aDocShell); + protected: void *mScriptObject; nsIDOMMimeTypeArray* mMimeTypes; - nsIDOMPluginArray* mPlugins; + PluginArrayImpl* mPlugins; + nsIDocShell* mDocShell; // weak reference }; class nsIURI; diff --git a/mozilla/dom/src/base/nsPluginArray.cpp b/mozilla/dom/src/base/nsPluginArray.cpp index e4857da0c03..3f29f2e6e8f 100644 --- a/mozilla/dom/src/base/nsPluginArray.cpp +++ b/mozilla/dom/src/base/nsPluginArray.cpp @@ -28,11 +28,14 @@ #include "nsIDOMMimeType.h" #include "nsIServiceManager.h" #include "nsIPluginHost.h" +#include "nsIDocShell.h" + +#include "nsIWebNavigation.h" static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); static NS_DEFINE_CID(kPluginManagerCID, NS_PLUGINMANAGER_CID); -PluginArrayImpl::PluginArrayImpl(nsIDOMNavigator* navigator) +PluginArrayImpl::PluginArrayImpl(nsIDOMNavigator* navigator, nsIDocShell *aDocShell) { NS_INIT_ISUPPORTS(); mScriptObject = nsnull; @@ -46,6 +49,7 @@ PluginArrayImpl::PluginArrayImpl(nsIDOMNavigator* navigator) mPluginCount = 0; mPluginArray = nsnull; + mDocShell = aDocShell; } PluginArrayImpl::~PluginArrayImpl() @@ -168,24 +172,50 @@ PluginArrayImpl::NamedItem(const nsAReadableString& aName, return NS_OK; } +void +PluginArrayImpl::SetDocShell(nsIDocShell* aDocShell) +{ + mDocShell = aDocShell; +} + NS_IMETHODIMP PluginArrayImpl::Refresh(PRBool aReloadDocuments) { - if(mPluginHost == nsnull) - return NS_ERROR_FAILURE; - nsresult res = NS_OK; - res = nsServiceManager::GetService(kPluginManagerCID, NS_GET_IID(nsIPluginHost), (nsISupports**)&mPluginHost); + if (mPluginArray != nsnull) + { + for (PRUint32 i = 0; i < mPluginCount; i++) + NS_IF_RELEASE(mPluginArray[i]); + + delete[] mPluginArray; + } + + mPluginCount = 0; + mPluginArray = nsnull; + + if (mPluginHost == nsnull) + res = nsServiceManager::GetService(kPluginManagerCID, NS_GET_IID(nsIPluginHost), (nsISupports**)&mPluginHost); if(NS_FAILED(res)) + { + mPluginHost = nsnull; return res; + } - nsCOMPtr pm = do_QueryInterface(mPluginHost); + nsCOMPtr pm(do_QueryInterface(mPluginHost)); if(pm) pm->ReloadPlugins(aReloadDocuments); + if (aReloadDocuments && mDocShell) + { + nsCOMPtr webNav(do_QueryInterface(mDocShell)); + + if (webNav) + webNav->Reload(nsIWebNavigation::LOAD_FLAGS_NONE); + } + return res; } diff --git a/mozilla/dom/src/base/nsPluginArray.h b/mozilla/dom/src/base/nsPluginArray.h index 4ffa2cb8fd5..75cc7f0acd7 100644 --- a/mozilla/dom/src/base/nsPluginArray.h +++ b/mozilla/dom/src/base/nsPluginArray.h @@ -28,11 +28,12 @@ #include "nsIDOMPlugin.h" class nsIDOMNavigator; +class nsIDocShell; struct nsIPluginHost; class PluginArrayImpl : public nsIScriptObjectOwner, public nsIDOMPluginArray { public: - PluginArrayImpl(nsIDOMNavigator* navigator); + PluginArrayImpl(nsIDOMNavigator* navigator, nsIDocShell *aDocShell); virtual ~PluginArrayImpl(); NS_DECL_ISUPPORTS @@ -48,12 +49,16 @@ public: private: nsresult GetPlugins(); +public: + void SetDocShell(nsIDocShell* aDocShell); + protected: void *mScriptObject; nsIDOMNavigator* mNavigator; nsIPluginHost* mPluginHost; PRUint32 mPluginCount; nsIDOMPlugin** mPluginArray; + nsIDocShell* mDocShell; // weak reference }; class PluginElementImpl : public nsIScriptObjectOwner, public nsIDOMPlugin {