Adding url listener support

This commit is contained in:
law%netscape.com 1999-03-13 03:31:55 +00:00
parent 04835cc791
commit 58a7aafc0f
3 changed files with 155 additions and 18 deletions

View File

@ -17,6 +17,7 @@
* Netscape Communications Corporation. All Rights Reserved.
*/
#include "nsIWebShell.h"
#include "nsIURLListener.h"
#include "nsIDocumentLoader.h"
#include "nsIContentViewer.h"
#include "nsIDocumentViewer.h"
@ -159,7 +160,9 @@ public:
NS_IMETHOD Repaint(PRBool aForce);
NS_IMETHOD SetContentViewer(nsIContentViewer* aViewer);
NS_IMETHOD SetContainer(nsIWebShellContainer* aContainer);
NS_IMETHOD SetURLListener(nsIURLListener * aURLListener);
NS_IMETHOD GetContainer(nsIWebShellContainer*& aResult);
NS_IMETHOD GetURLListener(nsIURLListener*& aResult);
NS_IMETHOD SetObserver(nsIStreamObserver* anObserver);
NS_IMETHOD GetObserver(nsIStreamObserver*& aResult);
NS_IMETHOD SetPrefs(nsIPref* aPrefs);
@ -309,6 +312,7 @@ protected:
nsIScriptGlobalObject *mScriptGlobal;
nsIScriptContext* mScriptContext;
nsIURLListener * mURLListener;
nsIWebShellContainer* mContainer;
nsIContentViewer* mContentViewer;
nsIDeviceContext* mDeviceContext;
@ -454,6 +458,7 @@ nsWebShell::nsWebShell()
mScrollPref = nsScrollPreference_kAuto;
mScriptGlobal = nsnull;
mScriptContext = nsnull;
mURLListener = nsnull;
InitFrameData();
mIsFrame = PR_FALSE;
}
@ -475,6 +480,7 @@ nsWebShell::~nsWebShell()
NS_IF_RELEASE(mContentViewer);
NS_IF_RELEASE(mDeviceContext);
NS_IF_RELEASE(mPrefs);
NS_IF_RELEASE(mURLListener);
NS_IF_RELEASE(mContainer);
NS_IF_RELEASE(mObserver);
NS_IF_RELEASE(mNetSupport);
@ -810,6 +816,7 @@ nsWebShell::Destroy()
// Stop any URLs that are currently being loaded...
Stop();
SetURLListener(nsnull);
SetContainer(nsnull);
SetObserver(nsnull);
@ -959,6 +966,15 @@ nsWebShell::SetContentViewer(nsIContentViewer* aViewer)
return NS_OK;
}
NS_IMETHODIMP
nsWebShell::SetURLListener(nsIURLListener* aURLListener)
{
NS_IF_RELEASE(mURLListener);
mURLListener = aURLListener;
NS_IF_ADDREF(aURLListener);
return NS_OK;
}
NS_IMETHODIMP
nsWebShell::SetContainer(nsIWebShellContainer* aContainer)
{
@ -968,6 +984,14 @@ nsWebShell::SetContainer(nsIWebShellContainer* aContainer)
return NS_OK;
}
NS_IMETHODIMP
nsWebShell::GetURLListener(nsIURLListener *& aResult)
{
aResult = mURLListener;
NS_IF_ADDREF(mURLListener);
return NS_OK;
}
NS_IMETHODIMP
nsWebShell::GetContainer(nsIWebShellContainer*& aResult)
{
@ -1309,6 +1333,13 @@ nsWebShell::DoLoadURL(const nsString& aUrlSpec,
return rv;
}
}
// Tell URL listener we are loading a new url.
if (nsnull != mURLListener) {
nsresult rv = mURLListener->BeginLoadURL(this, aUrlSpec);
if (NS_FAILED(rv)) {
return rv;
}
}
return mDocLoader->LoadDocument(aUrlSpec, // URL string
aCommand, // Command
@ -1373,6 +1404,13 @@ nsWebShell::LoadURL(const PRUnichar *aURLSpec,
return rv;
}
}
// Give URL listener right of refusal.
if (nsnull != mURLListener) {
rv = mURLListener->WillLoadURL(this, urlSpec, nsLoadURL);
if (NS_FAILED(rv)) {
return rv;
}
}
nsString* url = new nsString(urlSpec);
if (aModifyHistory) {
@ -1480,6 +1518,13 @@ nsWebShell::GoTo(PRInt32 aHistoryIndex)
return rv;
}
}
// Give URL listener right of refusal
if (nsnull != mURLListener) {
rv = mURLListener->WillLoadURL(this, urlSpec, nsLoadHistory);
if (NS_FAILED(rv)) {
return rv;
}
}
printf("Goto %d\n", aHistoryIndex);
mHistoryIndex = aHistoryIndex;
@ -1584,10 +1629,14 @@ nsWebShell::GetTitle(const PRUnichar** aResult)
NS_IMETHODIMP
nsWebShell::WillLoadURL(nsIWebShell* aShell, const PRUnichar* aURL, nsLoadType aReason)
{
nsresult rv = NS_OK;
if (nsnull != mContainer) {
return mContainer->WillLoadURL(aShell, aURL, aReason);
rv = mContainer->WillLoadURL(aShell, aURL, aReason);
}
return NS_OK;
if (NS_SUCCEEDED(rv) && nsnull != mURLListener) {
rv = mURLListener->WillLoadURL(aShell, aURL, aReason);
}
return rv;
}
NS_IMETHODIMP
@ -1606,20 +1655,29 @@ nsWebShell::ProgressLoadURL(nsIWebShell* aShell,
PRInt32 aProgress,
PRInt32 aProgressMax)
{
nsresult rv = NS_OK;
if (nsnull != mContainer) {
return mContainer->ProgressLoadURL(aShell, aURL, aProgress, aProgressMax);
rv = mContainer->ProgressLoadURL(aShell, aURL, aProgress, aProgressMax);
}
return NS_OK;
if (NS_SUCCEEDED(rv) && nsnull != mURLListener) {
rv = mURLListener->ProgressLoadURL(aShell, aURL, aProgress, aProgressMax);
}
return rv;
}
NS_IMETHODIMP
nsWebShell::EndLoadURL(nsIWebShell* aShell, const PRUnichar* aURL, PRInt32 aStatus)
{
nsresult rv = NS_OK;
if (nsnull != mContainer) {
// XXX: do not propagate this notification up from any frames...
return mContainer->EndLoadURL(aShell, aURL, aStatus);
}
return NS_OK;
if (NS_SUCCEEDED(rv) && nsnull != mURLListener) {
// XXX: do not propagate this notification up from any frames...
rv = mURLListener->EndLoadURL(aShell, aURL, aStatus);
}
return rv;
}
NS_IMETHODIMP
@ -2033,7 +2091,7 @@ nsWebShell::OnConnectionsComplete()
/*
*Fire the EndLoadURL(...) notification...
*/
if ((nsnull != mContainer) && (nsnull != mContentViewer)) {
if (((nsnull != mURLListener) || (nsnull != mContainer)) && (nsnull != mContentViewer)) {
nsIDocument* document;
rv = mContentViewer->QueryInterface(kIDocumentViewerIID, (void**)&docViewer);
@ -2051,7 +2109,12 @@ nsWebShell::OnConnectionsComplete()
/* XXX: The load status needs to be passed in... */
if (NS_SUCCEEDED(rv)) {
urlString = spec;
rv = mContainer->EndLoadURL(this, urlString, /* XXX */ 0 );
if (nsnull != mContainer) {
rv = mContainer->EndLoadURL(this, urlString, /* XXX */ 0 );
}
if (NS_SUCCEEDED(rv) && nsnull != mURLListener) {
rv = mURLListener->EndLoadURL(this, urlString, /* XXX */ 0 );
}
}
NS_RELEASE(url);
}
@ -2206,12 +2269,12 @@ nsWebShell::OnProgress(nsIURL* aURL, PRUint32 aProgress, PRUint32 aProgressMax)
rv = mObserver->OnProgress(aURL, aProgress, aProgressMax);
}
if (nsnull != mContainer) {
if (nsnull != mURLListener) {
const char* spec;
(void)aURL->GetSpec(&spec);
nsAutoString urlString(spec);
rv = mContainer->ProgressLoadURL(this, urlString, aProgress, aProgressMax);
rv = mURLListener->ProgressLoadURL(this, urlString, aProgress, aProgressMax);
}
// Pass status messages out to the nsIBrowserWindow...

View File

@ -33,6 +33,7 @@ class nsIDocumentLoader;
class nsIWebShell;
class nsIWebShellContainer;
class nsIPref;
class nsIURLListener;
// Interface ID for nsIWebShell
#define NS_IWEB_SHELL_IID \
@ -179,11 +180,21 @@ public:
*/
NS_IMETHOD SetContainer(nsIWebShellContainer* aContainer) = 0;
/**
* Set the nsIURLListener for the WebShell.
*/
NS_IMETHOD SetURLListener(nsIURLListener* anUrlListener) = 0;
/**
* Return the current nsIWebShellContainer.
*/
NS_IMETHOD GetContainer(nsIWebShellContainer*& aResult) = 0;
/**
* Return the current nsIURLListener.
*/
NS_IMETHOD GetURLListener(nsIURLListener*& aResult) = 0;
/**
* Set the nsIStreamObserver which receives all notifications from URLs
* loaded by the document.

View File

@ -17,6 +17,7 @@
* Netscape Communications Corporation. All Rights Reserved.
*/
#include "nsIWebShell.h"
#include "nsIURLListener.h"
#include "nsIDocumentLoader.h"
#include "nsIContentViewer.h"
#include "nsIDocumentViewer.h"
@ -159,7 +160,9 @@ public:
NS_IMETHOD Repaint(PRBool aForce);
NS_IMETHOD SetContentViewer(nsIContentViewer* aViewer);
NS_IMETHOD SetContainer(nsIWebShellContainer* aContainer);
NS_IMETHOD SetURLListener(nsIURLListener * aURLListener);
NS_IMETHOD GetContainer(nsIWebShellContainer*& aResult);
NS_IMETHOD GetURLListener(nsIURLListener*& aResult);
NS_IMETHOD SetObserver(nsIStreamObserver* anObserver);
NS_IMETHOD GetObserver(nsIStreamObserver*& aResult);
NS_IMETHOD SetPrefs(nsIPref* aPrefs);
@ -309,6 +312,7 @@ protected:
nsIScriptGlobalObject *mScriptGlobal;
nsIScriptContext* mScriptContext;
nsIURLListener * mURLListener;
nsIWebShellContainer* mContainer;
nsIContentViewer* mContentViewer;
nsIDeviceContext* mDeviceContext;
@ -454,6 +458,7 @@ nsWebShell::nsWebShell()
mScrollPref = nsScrollPreference_kAuto;
mScriptGlobal = nsnull;
mScriptContext = nsnull;
mURLListener = nsnull;
InitFrameData();
mIsFrame = PR_FALSE;
}
@ -475,6 +480,7 @@ nsWebShell::~nsWebShell()
NS_IF_RELEASE(mContentViewer);
NS_IF_RELEASE(mDeviceContext);
NS_IF_RELEASE(mPrefs);
NS_IF_RELEASE(mURLListener);
NS_IF_RELEASE(mContainer);
NS_IF_RELEASE(mObserver);
NS_IF_RELEASE(mNetSupport);
@ -810,6 +816,7 @@ nsWebShell::Destroy()
// Stop any URLs that are currently being loaded...
Stop();
SetURLListener(nsnull);
SetContainer(nsnull);
SetObserver(nsnull);
@ -959,6 +966,15 @@ nsWebShell::SetContentViewer(nsIContentViewer* aViewer)
return NS_OK;
}
NS_IMETHODIMP
nsWebShell::SetURLListener(nsIURLListener* aURLListener)
{
NS_IF_RELEASE(mURLListener);
mURLListener = aURLListener;
NS_IF_ADDREF(aURLListener);
return NS_OK;
}
NS_IMETHODIMP
nsWebShell::SetContainer(nsIWebShellContainer* aContainer)
{
@ -968,6 +984,14 @@ nsWebShell::SetContainer(nsIWebShellContainer* aContainer)
return NS_OK;
}
NS_IMETHODIMP
nsWebShell::GetURLListener(nsIURLListener *& aResult)
{
aResult = mURLListener;
NS_IF_ADDREF(mURLListener);
return NS_OK;
}
NS_IMETHODIMP
nsWebShell::GetContainer(nsIWebShellContainer*& aResult)
{
@ -1309,6 +1333,13 @@ nsWebShell::DoLoadURL(const nsString& aUrlSpec,
return rv;
}
}
// Tell URL listener we are loading a new url.
if (nsnull != mURLListener) {
nsresult rv = mURLListener->BeginLoadURL(this, aUrlSpec);
if (NS_FAILED(rv)) {
return rv;
}
}
return mDocLoader->LoadDocument(aUrlSpec, // URL string
aCommand, // Command
@ -1373,6 +1404,13 @@ nsWebShell::LoadURL(const PRUnichar *aURLSpec,
return rv;
}
}
// Give URL listener right of refusal.
if (nsnull != mURLListener) {
rv = mURLListener->WillLoadURL(this, urlSpec, nsLoadURL);
if (NS_FAILED(rv)) {
return rv;
}
}
nsString* url = new nsString(urlSpec);
if (aModifyHistory) {
@ -1480,6 +1518,13 @@ nsWebShell::GoTo(PRInt32 aHistoryIndex)
return rv;
}
}
// Give URL listener right of refusal
if (nsnull != mURLListener) {
rv = mURLListener->WillLoadURL(this, urlSpec, nsLoadHistory);
if (NS_FAILED(rv)) {
return rv;
}
}
printf("Goto %d\n", aHistoryIndex);
mHistoryIndex = aHistoryIndex;
@ -1584,10 +1629,14 @@ nsWebShell::GetTitle(const PRUnichar** aResult)
NS_IMETHODIMP
nsWebShell::WillLoadURL(nsIWebShell* aShell, const PRUnichar* aURL, nsLoadType aReason)
{
nsresult rv = NS_OK;
if (nsnull != mContainer) {
return mContainer->WillLoadURL(aShell, aURL, aReason);
rv = mContainer->WillLoadURL(aShell, aURL, aReason);
}
return NS_OK;
if (NS_SUCCEEDED(rv) && nsnull != mURLListener) {
rv = mURLListener->WillLoadURL(aShell, aURL, aReason);
}
return rv;
}
NS_IMETHODIMP
@ -1606,20 +1655,29 @@ nsWebShell::ProgressLoadURL(nsIWebShell* aShell,
PRInt32 aProgress,
PRInt32 aProgressMax)
{
nsresult rv = NS_OK;
if (nsnull != mContainer) {
return mContainer->ProgressLoadURL(aShell, aURL, aProgress, aProgressMax);
rv = mContainer->ProgressLoadURL(aShell, aURL, aProgress, aProgressMax);
}
return NS_OK;
if (NS_SUCCEEDED(rv) && nsnull != mURLListener) {
rv = mURLListener->ProgressLoadURL(aShell, aURL, aProgress, aProgressMax);
}
return rv;
}
NS_IMETHODIMP
nsWebShell::EndLoadURL(nsIWebShell* aShell, const PRUnichar* aURL, PRInt32 aStatus)
{
nsresult rv = NS_OK;
if (nsnull != mContainer) {
// XXX: do not propagate this notification up from any frames...
return mContainer->EndLoadURL(aShell, aURL, aStatus);
}
return NS_OK;
if (NS_SUCCEEDED(rv) && nsnull != mURLListener) {
// XXX: do not propagate this notification up from any frames...
rv = mURLListener->EndLoadURL(aShell, aURL, aStatus);
}
return rv;
}
NS_IMETHODIMP
@ -2033,7 +2091,7 @@ nsWebShell::OnConnectionsComplete()
/*
*Fire the EndLoadURL(...) notification...
*/
if ((nsnull != mContainer) && (nsnull != mContentViewer)) {
if (((nsnull != mURLListener) || (nsnull != mContainer)) && (nsnull != mContentViewer)) {
nsIDocument* document;
rv = mContentViewer->QueryInterface(kIDocumentViewerIID, (void**)&docViewer);
@ -2051,7 +2109,12 @@ nsWebShell::OnConnectionsComplete()
/* XXX: The load status needs to be passed in... */
if (NS_SUCCEEDED(rv)) {
urlString = spec;
rv = mContainer->EndLoadURL(this, urlString, /* XXX */ 0 );
if (nsnull != mContainer) {
rv = mContainer->EndLoadURL(this, urlString, /* XXX */ 0 );
}
if (NS_SUCCEEDED(rv) && nsnull != mURLListener) {
rv = mURLListener->EndLoadURL(this, urlString, /* XXX */ 0 );
}
}
NS_RELEASE(url);
}
@ -2206,12 +2269,12 @@ nsWebShell::OnProgress(nsIURL* aURL, PRUint32 aProgress, PRUint32 aProgressMax)
rv = mObserver->OnProgress(aURL, aProgress, aProgressMax);
}
if (nsnull != mContainer) {
if (nsnull != mURLListener) {
const char* spec;
(void)aURL->GetSpec(&spec);
nsAutoString urlString(spec);
rv = mContainer->ProgressLoadURL(this, urlString, aProgress, aProgressMax);
rv = mURLListener->ProgressLoadURL(this, urlString, aProgress, aProgressMax);
}
// Pass status messages out to the nsIBrowserWindow...