diff --git a/layout/generic/nsObjectFrame.cpp b/layout/generic/nsObjectFrame.cpp index e601f932ea2..d7124e8027d 100644 --- a/layout/generic/nsObjectFrame.cpp +++ b/layout/generic/nsObjectFrame.cpp @@ -145,6 +145,8 @@ public: PRUint32 aHeadersDataLen); NS_IMETHOD ShowStatus(const char *aStatusMsg); + + NS_IMETHOD ShowStatus(const PRUnichar *aStatusMsg); NS_IMETHOD GetDocument(nsIDocument* *aDocument); @@ -2063,34 +2065,43 @@ NS_IMETHODIMP nsPluginInstanceOwner::GetURL(const char *aURL, const char *aTarge NS_IMETHODIMP nsPluginInstanceOwner::ShowStatus(const char *aStatusMsg) { nsresult rv = NS_ERROR_FAILURE; + + rv = this->ShowStatus(NS_ConvertUTF8toUCS2(aStatusMsg).get()); + + return rv; +} - if (nsnull != mContext) - { - nsCOMPtr cont; +NS_IMETHODIMP nsPluginInstanceOwner::ShowStatus(const PRUnichar *aStatusMsg) +{ + nsresult rv = NS_ERROR_FAILURE; - rv = mContext->GetContainer(getter_AddRefs(cont)); - - if ((NS_OK == rv) && (nsnull != cont)) - { - nsCOMPtr docShellItem(do_QueryInterface(cont)); - if (docShellItem) - { - nsCOMPtr treeOwner; - docShellItem->GetTreeOwner(getter_AddRefs(treeOwner)); - - if(treeOwner) - { - nsCOMPtr browserChrome(do_GetInterface(treeOwner)); - - if(browserChrome) - { - nsAutoString msg; msg.AssignWithConversion(aStatusMsg); - browserChrome->SetStatus(nsIWebBrowserChrome::STATUS_SCRIPT, msg.get()); - } - } - } - } + if (!mContext) { + return rv; } + nsCOMPtr cont; + nsCOMPtr treeOwner; + + rv = mContext->GetContainer(getter_AddRefs(cont)); + if (NS_FAILED(rv) || !cont) { + return rv; + } + + nsCOMPtr docShellItem(do_QueryInterface(cont, &rv)); + if (NS_FAILED(rv) || !docShellItem) { + return rv; + } + + rv = docShellItem->GetTreeOwner(getter_AddRefs(treeOwner)); + if (NS_FAILED(rv) || !treeOwner) { + return rv; + } + + nsCOMPtr browserChrome(do_GetInterface(treeOwner, &rv)); + if (NS_FAILED(rv) || !browserChrome) { + return rv; + } + rv = browserChrome->SetStatus(nsIWebBrowserChrome::STATUS_SCRIPT, + aStatusMsg); return rv; } diff --git a/layout/html/base/src/nsObjectFrame.cpp b/layout/html/base/src/nsObjectFrame.cpp index e601f932ea2..d7124e8027d 100644 --- a/layout/html/base/src/nsObjectFrame.cpp +++ b/layout/html/base/src/nsObjectFrame.cpp @@ -145,6 +145,8 @@ public: PRUint32 aHeadersDataLen); NS_IMETHOD ShowStatus(const char *aStatusMsg); + + NS_IMETHOD ShowStatus(const PRUnichar *aStatusMsg); NS_IMETHOD GetDocument(nsIDocument* *aDocument); @@ -2063,34 +2065,43 @@ NS_IMETHODIMP nsPluginInstanceOwner::GetURL(const char *aURL, const char *aTarge NS_IMETHODIMP nsPluginInstanceOwner::ShowStatus(const char *aStatusMsg) { nsresult rv = NS_ERROR_FAILURE; + + rv = this->ShowStatus(NS_ConvertUTF8toUCS2(aStatusMsg).get()); + + return rv; +} - if (nsnull != mContext) - { - nsCOMPtr cont; +NS_IMETHODIMP nsPluginInstanceOwner::ShowStatus(const PRUnichar *aStatusMsg) +{ + nsresult rv = NS_ERROR_FAILURE; - rv = mContext->GetContainer(getter_AddRefs(cont)); - - if ((NS_OK == rv) && (nsnull != cont)) - { - nsCOMPtr docShellItem(do_QueryInterface(cont)); - if (docShellItem) - { - nsCOMPtr treeOwner; - docShellItem->GetTreeOwner(getter_AddRefs(treeOwner)); - - if(treeOwner) - { - nsCOMPtr browserChrome(do_GetInterface(treeOwner)); - - if(browserChrome) - { - nsAutoString msg; msg.AssignWithConversion(aStatusMsg); - browserChrome->SetStatus(nsIWebBrowserChrome::STATUS_SCRIPT, msg.get()); - } - } - } - } + if (!mContext) { + return rv; } + nsCOMPtr cont; + nsCOMPtr treeOwner; + + rv = mContext->GetContainer(getter_AddRefs(cont)); + if (NS_FAILED(rv) || !cont) { + return rv; + } + + nsCOMPtr docShellItem(do_QueryInterface(cont, &rv)); + if (NS_FAILED(rv) || !docShellItem) { + return rv; + } + + rv = docShellItem->GetTreeOwner(getter_AddRefs(treeOwner)); + if (NS_FAILED(rv) || !treeOwner) { + return rv; + } + + nsCOMPtr browserChrome(do_GetInterface(treeOwner, &rv)); + if (NS_FAILED(rv) || !browserChrome) { + return rv; + } + rv = browserChrome->SetStatus(nsIWebBrowserChrome::STATUS_SCRIPT, + aStatusMsg); return rv; } diff --git a/modules/oji/src/nsJVMManager.cpp b/modules/oji/src/nsJVMManager.cpp index d3e21ea8999..69344240455 100644 --- a/modules/oji/src/nsJVMManager.cpp +++ b/modules/oji/src/nsJVMManager.cpp @@ -45,6 +45,23 @@ #include "nsIPluginHost.h" #include "nsIServiceManager.h" #include "nsIEventQueueService.h" + +// All these interfaces are necessary just to get the damn +// nsIWebBrowserChrome to send the "Starting Java" message to the status +// bar. +#include "nsIWindowWatcher.h" +#include "nsIDOMWindow.h" +#include "nsIScriptGlobalObject.h" +#include "nsIPresContext.h" +#include "nsIPresContext.h" +#include "nsIDocShell.h" +#include "nsIDocShellTreeItem.h" +#include "nsIDocShellTreeOwner.h" +#include "nsIWebBrowserChrome.h" +#include "nsIInterfaceRequestor.h" + +#include "nsIStringBundle.h" + #include "nsIPref.h" #include "lcglue.h" @@ -67,6 +84,8 @@ extern "C" int XP_JAVA_GENERAL_FAILURE; extern "C" int XP_JAVA_STARTUP_FAILED; extern "C" int XP_JAVA_DEBUGGER_FAILED; +static NS_DEFINE_CID(kStringBundleServiceCID, NS_STRINGBUNDLESERVICE_CID); + static NS_DEFINE_CID(kPrefCID, NS_PREF_CID); static NS_DEFINE_CID(kJVMManagerCID, NS_JVMMANAGER_CID); @@ -95,6 +114,7 @@ static NS_DEFINE_IID(kIPluginIID, NS_IPLUGIN_IID); static NS_DEFINE_IID(kISymantecDebugManagerIID, NS_ISYMANTECDEBUGMANAGER_IID); static NS_DEFINE_IID(kIPluginManagerIID, NS_IPLUGINMANAGER_IID); +#define PLUGIN_REGIONAL_URL "chrome://global-region/locale/region.properties" //////////////////////////////////////////////////////////////////////////////// @@ -158,7 +178,47 @@ nsJVMManager::GetJavaEnabled(PRBool* outEnabled) NS_METHOD nsJVMManager::ShowJavaConsole(void) { + nsresult rv; + nsCOMPtr chrome; + nsAutoString msg; + + if (!fStartupMessagePosted) { + PRUnichar *messageUni; + nsCOMPtr strings(do_GetService(kStringBundleServiceCID)); + nsCOMPtr regionalBundle; + + rv = this->GetChrome(getter_AddRefs(chrome)); + if (NS_SUCCEEDED(rv) && chrome && strings) { + rv = strings->CreateBundle(PLUGIN_REGIONAL_URL, + getter_AddRefs(regionalBundle)); + if (NS_SUCCEEDED(rv) && regionalBundle) { + // pluginStartupMessage is something like "Starting + // plugin for type" + rv = regionalBundle->GetStringFromName(NS_LITERAL_STRING("pluginStartupMessage").get(), + &messageUni); + if (NS_SUCCEEDED(rv) && messageUni) { + msg = messageUni; + nsMemory::Free((void *)messageUni); + + msg.AppendWithConversion(" ", 1); + msg.AppendWithConversion("application/x-java-vm", + PL_strlen("application/x-java-vm")); + chrome->SetStatus(nsIWebBrowserChrome::STATUS_SCRIPT, + msg.get()); + } + } + } + } // !fStartupMessagePosted + JVM_ShowConsole(); + // clear the startup message, if one was posted + if (!fStartupMessagePosted && chrome) { + msg.Truncate(); + chrome->SetStatus(nsIWebBrowserChrome::STATUS_SCRIPT, + msg.get()); + fStartupMessagePosted = PR_TRUE; + } + return NS_OK; } @@ -302,7 +362,8 @@ nsJVMManager::Create(nsISupports* outer, const nsIID& aIID, void* *aInstancePtr) nsJVMManager::nsJVMManager(nsISupports* outer) : fJVM(NULL), fStatus(nsJVMStatus_Enabled), fRegisteredJavaPrefChanged(PR_FALSE), fDebugManager(NULL), fJSJavaVM(NULL), - fClassPathAdditions(new nsVoidArray()), fClassPathAdditionsString(NULL) + fClassPathAdditions(new nsVoidArray()), fClassPathAdditionsString(NULL), + fStartupMessagePosted(PR_FALSE) { NS_INIT_AGGREGATED(outer); } @@ -765,6 +826,61 @@ nsJVMManager::EnsurePrefCallbackRegistered(void) } } +nsresult +nsJVMManager::GetChrome(nsIWebBrowserChrome **theChrome) +{ + NS_ENSURE_ARG_POINTER(theChrome); + + nsresult rv = NS_ERROR_FAILURE; + nsCOMPtr windowWatcher; + nsCOMPtr domWindow; + nsCOMPtr docShell; + nsCOMPtr scriptObject; + nsCOMPtr presContext; + nsCOMPtr treeItem; + nsCOMPtr treeOwner; + nsCOMPtr cont; + nsCOMPtr chrome; + + windowWatcher = + do_GetService("@mozilla.org/embedcomp/window-watcher;1", &rv); + if (!windowWatcher) { + return rv; + } + rv = windowWatcher->GetActiveWindow(getter_AddRefs(domWindow)); + if (!domWindow) { + return rv; + } + scriptObject = do_QueryInterface(domWindow, &rv); + if (!scriptObject) { + return rv; + } + rv = scriptObject->GetDocShell(getter_AddRefs(docShell)); + if (!docShell) { + return rv; + } + rv = docShell->GetPresContext(getter_AddRefs(presContext)); + if (!presContext) { + return rv; + } + rv = presContext->GetContainer(getter_AddRefs(cont)); + if (!cont) { + return rv; + } + treeItem = do_QueryInterface(cont, &rv); + if (!treeItem) { + return rv; + } + rv = treeItem->GetTreeOwner(getter_AddRefs(treeOwner)); + if (!treeOwner) { + return rv; + } + chrome = do_GetInterface(treeOwner, &rv); + *theChrome = (nsIWebBrowserChrome *) chrome.get(); + NS_IF_ADDREF(*theChrome); + return rv; +} + nsJVMStatus nsJVMManager::GetJVMStatus(void) { diff --git a/modules/oji/src/nsJVMManager.h b/modules/oji/src/nsJVMManager.h index 3fc91525193..a75ec9c212c 100644 --- a/modules/oji/src/nsJVMManager.h +++ b/modules/oji/src/nsJVMManager.h @@ -39,6 +39,7 @@ #include "nsILiveConnectManager.h" class nsSymantecDebugManager; +class nsIWebBrowserChrome; /******************************************************************************* @@ -197,6 +198,15 @@ public: protected: void EnsurePrefCallbackRegistered(void); + + /** + + * @return conjure up THE nsIWebBrowserChrome instance from thin + * air! + + */ + + nsresult GetChrome(nsIWebBrowserChrome **theChrome); const char* GetJavaErrorString(JRIEnv* env); nsIJVMPlugin* fJVM; @@ -206,6 +216,7 @@ protected: JSJavaVM * fJSJavaVM; nsVoidArray* fClassPathAdditions; char* fClassPathAdditionsString; + PRBool fStartupMessagePosted; }; /******************************************************************************* diff --git a/modules/plugin/base/src/nsIPluginInstanceOwner.h b/modules/plugin/base/src/nsIPluginInstanceOwner.h index 1faf42c6023..08ea4c2bf2a 100644 --- a/modules/plugin/base/src/nsIPluginInstanceOwner.h +++ b/modules/plugin/base/src/nsIPluginInstanceOwner.h @@ -92,6 +92,9 @@ public: NS_IMETHOD ShowStatus(const char *aStatusMsg) = 0; + NS_IMETHOD + ShowStatus(const PRUnichar *aStatusMsg) = 0; + /** * Get the associated document. */ diff --git a/modules/plugin/base/src/nsPluginHostImpl.cpp b/modules/plugin/base/src/nsPluginHostImpl.cpp index d8bd7cda4d0..1148e04256a 100644 --- a/modules/plugin/base/src/nsPluginHostImpl.cpp +++ b/modules/plugin/base/src/nsPluginHostImpl.cpp @@ -3541,6 +3541,7 @@ NS_IMETHODIMP nsPluginHostImpl::SetUpPluginInstance(const char *aMimeType, } } #endif + this->PostStartupMessageForType(aMimeType, aOwner); result = plugin->CreateInstance(NULL, kIPluginInstanceIID, (void **)&instance); #ifdef XP_WIN @@ -4004,6 +4005,49 @@ nsPluginHostImpl::FindPluginEnabledForType(const char* aMimeType, return NS_ERROR_FAILURE; } +nsresult +nsPluginHostImpl::PostStartupMessageForType(const char* aMimeType, + nsIPluginInstanceOwner* aOwner) +{ + nsresult rv; + NS_ASSERTION(aOwner && aMimeType, + "PostStartupMessageForType: invalid arguments"); + + PRUnichar *messageUni = nsnull; + nsAutoString msg; + nsCOMPtr regionalBundle; + nsCOMPtr strings(do_GetService(kStringBundleServiceCID, + &rv)); + if (!strings) { + return rv; + } + rv = strings->CreateBundle(PLUGIN_REGIONAL_URL, + getter_AddRefs(regionalBundle)); + if (NS_FAILED(rv)) { + return rv; + } + rv = regionalBundle->GetStringFromName(NS_LITERAL_STRING("pluginStartupMessage").get(), + &messageUni); + if (NS_FAILED(rv)){ + return rv; + } + msg = messageUni; + nsMemory::Free((void *)messageUni); + + msg.AppendWithConversion(" ", 1); + msg.AppendWithConversion(aMimeType, PL_strlen(aMimeType)); +#ifdef PLUGIN_LOGGING + PR_LOG(nsPluginLogging::gPluginLog, PLUGIN_LOG_ALWAYS, + ("nsPluginHostImpl::PostStartupMessageForType(aMimeType=%s)\n", + aMimeType)); + + PR_LogFlush(); +#endif + + rv = aOwner->ShowStatus(msg.get()); + + return rv; +} //////////////////////////////////////////////////////////////////////// NS_IMETHODIMP nsPluginHostImpl::GetPluginFactory(const char *aMimeType, nsIPlugin** aPlugin) diff --git a/modules/plugin/base/src/nsPluginHostImpl.h b/modules/plugin/base/src/nsPluginHostImpl.h index 75f15e60cbf..f746450cb39 100644 --- a/modules/plugin/base/src/nsPluginHostImpl.h +++ b/modules/plugin/base/src/nsPluginHostImpl.h @@ -397,6 +397,10 @@ private: nsresult FindPluginEnabledForType(const char* aMimeType, nsPluginTag* &aPlugin); + nsresult + PostStartupMessageForType(const char* aMimeType, + nsIPluginInstanceOwner* aOwner); + nsresult FindStoppedPluginForURL(nsIURI* aURL, nsIPluginInstanceOwner *aOwner); diff --git a/modules/plugin/base/src/nsPluginViewer.cpp b/modules/plugin/base/src/nsPluginViewer.cpp index 0445cc945b4..84cf0b1ca8e 100644 --- a/modules/plugin/base/src/nsPluginViewer.cpp +++ b/modules/plugin/base/src/nsPluginViewer.cpp @@ -111,6 +111,8 @@ public: NS_IMETHOD ShowStatus(const char *aStatusMsg); + NS_IMETHOD ShowStatus(const PRUnichar *aStatusMsg); + NS_IMETHOD GetDocument(nsIDocument* *aDocument); NS_IMETHOD InvalidateRect(nsPluginRect *invalidRect); @@ -1049,36 +1051,43 @@ NS_IMETHODIMP pluginInstanceOwner :: GetURL(const char *aURL, const char *aTarge NS_IMETHODIMP pluginInstanceOwner :: ShowStatus(const char *aStatusMsg) { nsresult rv = NS_ERROR_FAILURE; + + rv = this->ShowStatus(NS_ConvertUTF8toUCS2(aStatusMsg).get()); + + return rv; +} - if (nsnull != mViewer) - { - nsCOMPtr cont; - - rv = mViewer->GetContainer(getter_AddRefs(cont)); - - if ((NS_OK == rv) && (nsnull != cont)) - { - nsCOMPtr docShellItem(do_QueryInterface(cont)); - - if (docShellItem) - { - nsCOMPtr treeOwner; - docShellItem->GetTreeOwner(getter_AddRefs(treeOwner)); - - if(treeOwner) - { - nsCOMPtr browserChrome(do_GetInterface(treeOwner)); - - if(browserChrome) - { - nsAutoString msg; msg.AssignWithConversion(aStatusMsg); - browserChrome->SetStatus(nsIWebBrowserChrome::STATUS_SCRIPT, msg.get()); - } - } - } - } +NS_IMETHODIMP pluginInstanceOwner::ShowStatus(const PRUnichar *aStatusMsg) +{ + nsresult rv = NS_ERROR_FAILURE; + + if (!mViewer) { + return rv; + } + nsCOMPtr cont; + nsCOMPtr treeOwner; + + rv = mViewer->GetContainer(getter_AddRefs(cont)); + if (NS_FAILED(rv) || !cont) { + return rv; } + nsCOMPtr docShellItem(do_QueryInterface(cont, &rv)); + if (NS_FAILED(rv) || !docShellItem) { + return rv; + } + + rv = docShellItem->GetTreeOwner(getter_AddRefs(treeOwner)); + if (NS_FAILED(rv) || !treeOwner) { + return rv; + } + + nsCOMPtr browserChrome(do_GetInterface(treeOwner, &rv)); + if (NS_FAILED(rv) || !browserChrome) { + return rv; + } + rv = browserChrome->SetStatus(nsIWebBrowserChrome::STATUS_SCRIPT, + aStatusMsg); return rv; } diff --git a/xpfe/global/resources/locale/en-US/region.properties b/xpfe/global/resources/locale/en-US/region.properties index bdcdcbd9485..91b56217b67 100644 --- a/xpfe/global/resources/locale/en-US/region.properties +++ b/xpfe/global/resources/locale/en-US/region.properties @@ -2,6 +2,7 @@ # Localizable URLs # noDefaultPluginMessage=Netscape cannot find the Plugin Downloader Plugin. Without the Plugin Downloader Plugin, you cannot automatically download and install plugins. Please visit http://www.netscape.com/ to install the Plugin Downloader Plugin. +pluginStartupMessage=Starting Plugin for type # # brand.properties #