sr=waterson
a=asa


modules/plugin/base/src/nsIPluginInstanceOwner.h
modules/plugin/base/src/nsPluginHostImpl.cpp
modules/plugin/base/src/nsPluginHostImpl.h
modules/plugin/base/src/nsPluginViewer.cpp
modules/oji/src/nsJVMManager.cpp
modules/oji/src/nsJVMManager.h
layout/html/base/src/nsObjectFrame.cpp
xpfe/global/resources/locale/en-US/region.properties


Here's what I did to fix this bug.

I pestered Rick Potts about the problem of
nsIWebBrowserChrome->SetStatus() not being synchronous.  He fixed that
under bug 97227.

Taking advantage of Rick's fix to 97227, I modified
nsIPluginInstanceOwner to have new method, ShowStatus(const PRUnichar
*aStatusMsg).  This is necessary to allow for localized messages to be
posted from the plugin, such as "Starting plugin for type
application/x-java-vm" or "Beginnen steckbar f�r Art
application/x-java-vm".

I modified all the implementations of nsIPluginInstanceOwner:

  layout/html/base/src/nsObjectFrame.cpp
  modules/plugin/base/src/nsPluginViewer.cpp

I inserted a call to nsIPluginInstanceOwner->ShowStatus() at the part
just before the big "whole damn app freezes when starting java" thing
happens.

I also modifed nsJVMManager.cpp ShowJavaConsole() to do the same.  These
are the two places I know of now that can start java.
This commit is contained in:
edburns%acm.org 2001-09-05 03:58:34 +00:00
Родитель f78284509b
Коммит 988c747a4f
9 изменённых файлов: 288 добавлений и 78 удалений

Просмотреть файл

@ -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<nsISupports> 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<nsIDocShellTreeItem> docShellItem(do_QueryInterface(cont));
if (docShellItem)
{
nsCOMPtr<nsIDocShellTreeOwner> treeOwner;
docShellItem->GetTreeOwner(getter_AddRefs(treeOwner));
if(treeOwner)
{
nsCOMPtr<nsIWebBrowserChrome> browserChrome(do_GetInterface(treeOwner));
if(browserChrome)
{
nsAutoString msg; msg.AssignWithConversion(aStatusMsg);
browserChrome->SetStatus(nsIWebBrowserChrome::STATUS_SCRIPT, msg.get());
}
}
}
}
if (!mContext) {
return rv;
}
nsCOMPtr<nsISupports> cont;
nsCOMPtr<nsIDocShellTreeOwner> treeOwner;
rv = mContext->GetContainer(getter_AddRefs(cont));
if (NS_FAILED(rv) || !cont) {
return rv;
}
nsCOMPtr<nsIDocShellTreeItem> 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<nsIWebBrowserChrome> browserChrome(do_GetInterface(treeOwner, &rv));
if (NS_FAILED(rv) || !browserChrome) {
return rv;
}
rv = browserChrome->SetStatus(nsIWebBrowserChrome::STATUS_SCRIPT,
aStatusMsg);
return rv;
}

Просмотреть файл

@ -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<nsISupports> 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<nsIDocShellTreeItem> docShellItem(do_QueryInterface(cont));
if (docShellItem)
{
nsCOMPtr<nsIDocShellTreeOwner> treeOwner;
docShellItem->GetTreeOwner(getter_AddRefs(treeOwner));
if(treeOwner)
{
nsCOMPtr<nsIWebBrowserChrome> browserChrome(do_GetInterface(treeOwner));
if(browserChrome)
{
nsAutoString msg; msg.AssignWithConversion(aStatusMsg);
browserChrome->SetStatus(nsIWebBrowserChrome::STATUS_SCRIPT, msg.get());
}
}
}
}
if (!mContext) {
return rv;
}
nsCOMPtr<nsISupports> cont;
nsCOMPtr<nsIDocShellTreeOwner> treeOwner;
rv = mContext->GetContainer(getter_AddRefs(cont));
if (NS_FAILED(rv) || !cont) {
return rv;
}
nsCOMPtr<nsIDocShellTreeItem> 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<nsIWebBrowserChrome> browserChrome(do_GetInterface(treeOwner, &rv));
if (NS_FAILED(rv) || !browserChrome) {
return rv;
}
rv = browserChrome->SetStatus(nsIWebBrowserChrome::STATUS_SCRIPT,
aStatusMsg);
return rv;
}

Просмотреть файл

@ -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<nsIWebBrowserChrome> chrome;
nsAutoString msg;
if (!fStartupMessagePosted) {
PRUnichar *messageUni;
nsCOMPtr<nsIStringBundleService> strings(do_GetService(kStringBundleServiceCID));
nsCOMPtr<nsIStringBundle> 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<nsIWindowWatcher> windowWatcher;
nsCOMPtr<nsIDOMWindow> domWindow;
nsCOMPtr<nsIDocShell> docShell;
nsCOMPtr<nsIScriptGlobalObject> scriptObject;
nsCOMPtr<nsIPresContext> presContext;
nsCOMPtr<nsIDocShellTreeItem> treeItem;
nsCOMPtr<nsIDocShellTreeOwner> treeOwner;
nsCOMPtr<nsISupports> cont;
nsCOMPtr<nsIWebBrowserChrome> 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)
{

Просмотреть файл

@ -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;
};
/*******************************************************************************

Просмотреть файл

@ -92,6 +92,9 @@ public:
NS_IMETHOD
ShowStatus(const char *aStatusMsg) = 0;
NS_IMETHOD
ShowStatus(const PRUnichar *aStatusMsg) = 0;
/**
* Get the associated document.
*/

Просмотреть файл

@ -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<nsIStringBundle> regionalBundle;
nsCOMPtr<nsIStringBundleService> 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)

Просмотреть файл

@ -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);

Просмотреть файл

@ -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<nsISupports> cont;
rv = mViewer->GetContainer(getter_AddRefs(cont));
if ((NS_OK == rv) && (nsnull != cont))
{
nsCOMPtr<nsIDocShellTreeItem> docShellItem(do_QueryInterface(cont));
if (docShellItem)
{
nsCOMPtr<nsIDocShellTreeOwner> treeOwner;
docShellItem->GetTreeOwner(getter_AddRefs(treeOwner));
if(treeOwner)
{
nsCOMPtr<nsIWebBrowserChrome> 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<nsISupports> cont;
nsCOMPtr<nsIDocShellTreeOwner> treeOwner;
rv = mViewer->GetContainer(getter_AddRefs(cont));
if (NS_FAILED(rv) || !cont) {
return rv;
}
nsCOMPtr<nsIDocShellTreeItem> 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<nsIWebBrowserChrome> browserChrome(do_GetInterface(treeOwner, &rv));
if (NS_FAILED(rv) || !browserChrome) {
return rv;
}
rv = browserChrome->SetStatus(nsIWebBrowserChrome::STATUS_SCRIPT,
aStatusMsg);
return rv;
}

Просмотреть файл

@ -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
#