diff --git a/xpfe/AppCores/src/nsBrowserAppCore.cpp b/xpfe/AppCores/src/nsBrowserAppCore.cpp index 33b75cf3178..c22de73bfd7 100644 --- a/xpfe/AppCores/src/nsBrowserAppCore.cpp +++ b/xpfe/AppCores/src/nsBrowserAppCore.cpp @@ -92,7 +92,6 @@ NS_DEFINE_IID(kNetServiceCID, NS_NETSERVICE_CID); // Stuff to implement find/findnext #include "nsIFindComponent.h" - static NS_DEFINE_IID(kIDocumentViewerIID, NS_IDOCUMENT_VIEWER_IID); @@ -151,6 +150,8 @@ nsBrowserAppCore::nsBrowserAppCore() nsBrowserAppCore::~nsBrowserAppCore() { + EndObserving(); + NS_IF_RELEASE(mToolbarWindow); NS_IF_RELEASE(mToolbarScriptContext); NS_IF_RELEASE(mContentWindow); @@ -197,6 +198,11 @@ nsBrowserAppCore::QueryInterface(REFNSIID aIID,void** aInstancePtr) NS_ADDREF_THIS(); return NS_OK; } + if (aIID.Equals( nsIObserver::GetIID())) { + *aInstancePtr = (void*) ((nsIObserver*)this); + NS_ADDREF_THIS(); + return NS_OK; + } return nsBaseAppCore::QueryInterface(aIID, aInstancePtr); } @@ -270,6 +276,8 @@ nsBrowserAppCore::Init(const nsString& aId) nsServiceManager::GetService(kCGlobalHistoryCID, kIGlobalHistoryIID, (nsISupports **)&mGHistory); + BeginObserving(); + return rv; } @@ -1392,3 +1400,84 @@ FindNamedXULElement(nsIWebShell * aShell, } return rv; } + +static const char *prefix = "component://netscape/appshell/component/browser/window"; + +void +nsBrowserAppCore::BeginObserving() { + // Get observer service. + nsIObserverService *svc = 0; + nsresult rv = nsServiceManager::GetService( NS_OBSERVERSERVICE_PROGID, + nsIObserverService::GetIID(), + (nsISupports**)&svc ); + if ( NS_SUCCEEDED( rv ) && svc ) { + // Add/Remove object as observer of web shell window topics. + nsString topic1 = prefix; + topic1 += ";status"; + nsString topic2 = prefix; + topic2 += ";progress"; + rv = svc->AddObserver( this, topic1.GetUnicode() ); + rv = svc->AddObserver( this, topic2.GetUnicode() ); + // Release the service. + nsServiceManager::ReleaseService( NS_OBSERVERSERVICE_PROGID, svc ); + } + + return; +} + +void +nsBrowserAppCore::EndObserving() { + // Get observer service. + nsIObserverService *svc = 0; + nsresult rv = nsServiceManager::GetService( NS_OBSERVERSERVICE_PROGID, + nsIObserverService::GetIID(), + (nsISupports**)&svc ); + if ( NS_SUCCEEDED( rv ) && svc ) { + // Add/Remove object as observer of web shell window topics. + nsString topic1 = prefix; + topic1 += ";status"; + nsString topic2 = prefix; + topic2 += ";progress"; + rv = svc->RemoveObserver( this, topic1.GetUnicode() ); + rv = svc->RemoveObserver( this, topic2.GetUnicode() ); + // Release the service. + nsServiceManager::ReleaseService( NS_OBSERVERSERVICE_PROGID, svc ); + } + + return; +} + +NS_IMETHODIMP +nsBrowserAppCore::Observe( nsISupports *aSubject, + const PRUnichar *aTopic, + const PRUnichar *someData ) { + nsresult rv = NS_OK; + + // We only are interested if aSubject is our web shell window. + if ( aSubject && mWebShellWin ) { + nsIWebShellWindow *window = 0; + rv = aSubject->QueryInterface( nsIWebShellWindow::GetIID(), (void**)&window ); + if ( NS_SUCCEEDED( rv ) && window ) { + nsString topic1 = prefix; + topic1 += ";status"; + nsString topic2 = prefix; + topic2 += ";progress"; + // Compare to our window. + if ( window == mWebShellWin ) { + // Get topic substring. + if ( topic1 == aTopic ) { + // Update status text. + rv = setAttribute( mWebShell, "Browser:Status", "value", someData ); + } else if ( topic2 == aTopic ) { + // We don't process this, yet. + } + } else { + // Not for this app core. + } + // Release the window. + window->Release(); + } + } + + return rv; +} diff --git a/xpfe/AppCores/src/nsBrowserAppCore.h b/xpfe/AppCores/src/nsBrowserAppCore.h index f01cfde997d..a95902f3d50 100644 --- a/xpfe/AppCores/src/nsBrowserAppCore.h +++ b/xpfe/AppCores/src/nsBrowserAppCore.h @@ -29,6 +29,7 @@ #include "nsINetSupport.h" #include "nsIStreamObserver.h" #include "nsIDocumentLoaderObserver.h" +#include "nsIObserver.h" class nsIBrowserWindow; class nsIWebShell; @@ -48,7 +49,8 @@ class nsBrowserAppCore : public nsBaseAppCore, public nsIDOMBrowserAppCore, public nsINetSupport, // public nsIStreamObserver, - public nsIDocumentLoaderObserver + public nsIDocumentLoaderObserver, + public nsIObserver { public: @@ -118,11 +120,16 @@ class nsBrowserAppCore : public nsBaseAppCore, NS_IMETHOD_(PRBool) PromptPassword(const nsString &aText, nsString &aPassword); + // nsIObserver + NS_DECL_IOBSERVER + protected: NS_IMETHOD DoDialog(); NS_IMETHOD ExecuteScript(nsIScriptContext * aContext, const nsString& aScript); void SetButtonImage(nsIDOMNode * aParentNode, PRInt32 aBtnNum, const nsString &aResName); - void InitializeSearch(nsIFindComponent*); + void InitializeSearch(nsIFindComponent*); + void BeginObserving(); + void EndObserving(); nsIScriptContext *mToolbarScriptContext; nsIScriptContext *mContentScriptContext; diff --git a/xpfe/appshell/src/nsWebShellWindow.cpp b/xpfe/appshell/src/nsWebShellWindow.cpp index 7210925721a..e61693dd8e3 100644 --- a/xpfe/appshell/src/nsWebShellWindow.cpp +++ b/xpfe/appshell/src/nsWebShellWindow.cpp @@ -74,6 +74,8 @@ #include "nsIDOMNode.h" #include "nsIDOMElement.h" #include "nsIDocumentLoader.h" +#include "nsIObserverService.h" +#include "prprf.h" //#include "nsIDOMHTMLInputElement.h" //#include "nsIDOMHTMLImageElement.h" @@ -2301,21 +2303,69 @@ NS_IMETHODIMP nsWebShellWindow::GetTitle(const PRUnichar** aResult) // no, we didn't store the title for you. why so nosy? return NS_ERROR_FAILURE; } + +// This should rightfully be somebody's PROGID? +// Will switch when the "app shell browser component" arrives. +static const char *prefix = "component://netscape/appshell/component/browser/window"; + +nsresult +nsWebShellWindow::NotifyObservers( const nsString &aTopic, const nsString &someData ) { + nsresult rv = NS_OK; + // Get observer service. + nsIObserverService *svc = 0; + rv = nsServiceManager::GetService( NS_OBSERVERSERVICE_PROGID, + nsIObserverService::GetIID(), + (nsISupports**)&svc ); + if ( NS_SUCCEEDED( rv ) && svc ) { + // Notify observers as instructed; the subject is "this" web shell window. + nsString topic = prefix; + topic += ";"; + topic += aTopic; + rv = svc->Notify( (nsIWebShellWindow*)this, topic.GetUnicode(), someData.GetUnicode() ); + // Release the service. + nsServiceManager::ReleaseService( NS_OBSERVERSERVICE_PROGID, svc ); + } else { + } + return rv; +} NS_IMETHODIMP nsWebShellWindow::SetStatus(const PRUnichar* aStatus) { - // yup. got it. - return NS_OK; + nsresult rv = NS_OK; + // Store status text. + mStatus = aStatus; + // Broadcast status text change to interested parties. + rv = NotifyObservers( "status", aStatus ); + return rv; } NS_IMETHODIMP nsWebShellWindow::GetStatus(const PRUnichar** aResult) { - // didn't store the status string, either. - return NS_ERROR_FAILURE; + nsresult rv = NS_OK; + if ( aResult ) { + // Semantics are ill-defined: How to allocate? Who frees it? + *aResult = mStatus.ToNewUnicode(); + } else { + rv = NS_ERROR_NULL_POINTER; + } + return rv; } NS_IMETHODIMP nsWebShellWindow::SetProgress(PRInt32 aProgress, PRInt32 aProgressMax) { - // oh yeah. we're on it. - return NS_OK; + nsresult rv = NS_OK; + + // Encode progress report in topic (there is no GetProgress for observers + // to query it). + char topic[32]; + PR_snprintf( topic, + sizeof topic, + "%ld %ld", + (long)aProgress, + (long)aProgressMax ); + + // Broadcast progress info to interested parties. + rv = NotifyObservers( "progress", topic ); + + return rv; } diff --git a/xpfe/appshell/src/nsWebShellWindow.h b/xpfe/appshell/src/nsWebShellWindow.h index edfbeb7d284..45f1f251013 100644 --- a/xpfe/appshell/src/nsWebShellWindow.h +++ b/xpfe/appshell/src/nsWebShellWindow.h @@ -250,6 +250,8 @@ protected: NS_IMETHODIMP ShowModalInternal(); void ExitModalLoop() { mContinueModalLoop = PR_FALSE; } + nsresult NotifyObservers( const nsString &aTopic, const nsString &someData ); + nsIWidget* mWindow; nsIWebShell* mWebShell; nsIXULWindowCallbacks* mCallbacks; @@ -264,6 +266,8 @@ protected: // created as the XUL file for this window loads. nsIDOMNode * contextMenuTest; + + nsString mStatus; private: static void * HandleModalDialogEvent(PLEvent *aEvent); diff --git a/xpfe/browser/src/navigator.js b/xpfe/browser/src/navigator.js index 67a723e75dc..6f8d08d48f9 100644 --- a/xpfe/browser/src/navigator.js +++ b/xpfe/browser/src/navigator.js @@ -1,5 +1,7 @@ var appCore = null; var appCoreName = ""; + var defaultStatus = "default status text"; + function Startup() { dump("Doing Startup...\n"); @@ -699,6 +701,9 @@ var status = document.getElementById("Browser:Status"); if ( status ) { var text = status.getAttribute("value"); + if ( text == "" ) { + text = defaultStatus; + } var statusText = document.getElementById("statusText"); if ( statusText ) { statusText.setAttribute( "value", text ); @@ -764,6 +769,7 @@ var msg = "Document: Done (" + elapsed + " secs)"; dump( msg + "\n" ); status.setAttribute("value",msg); + defaultStatus = msg; } startTime = 0; }