diff --git a/mozilla/docshell/base/nsDocShell.cpp b/mozilla/docshell/base/nsDocShell.cpp index cd7d277abea..daccd9c687e 100644 --- a/mozilla/docshell/base/nsDocShell.cpp +++ b/mozilla/docshell/base/nsDocShell.cpp @@ -715,6 +715,8 @@ NS_IMETHODIMP nsDocShell::GetTreeOwner(nsIDocShellTreeOwner** aTreeOwner) NS_IMETHODIMP nsDocShell::SetTreeOwner(nsIDocShellTreeOwner* aTreeOwner) { mTreeOwner = aTreeOwner; // Weak reference per API + nsCOMPtr progressListener(do_QueryInterface(aTreeOwner)); + mOwnerProgressListener = progressListener; // Weak reference per API PRInt32 i, n = mChildren.Count(); for(i = 0; i < n; i++) @@ -2296,6 +2298,7 @@ NS_IMETHODIMP nsDocShell::OnLoadingSite(nsIURI* aURI) void nsDocShell::SetCurrentURI(nsIURI* aURI) { mCurrentURI = aURI; //This assignment addrefs + FireOnLocationChange(aURI); } void nsDocShell::SetReferrerURI(nsIURI* aURI) @@ -2324,8 +2327,11 @@ NS_IMETHODIMP nsDocShell::ShouldAddToSessionHistory(nsIURI* aURI, NS_IMETHODIMP nsDocShell::ShouldPersistInSessionHistory(nsIURI* aURI, PRBool* aShouldAdd) { + *aShouldAdd = PR_TRUE; + // XXXTAB Do testing here if there are some things that shouldn't stay in // session history + return NS_OK; } @@ -2334,8 +2340,18 @@ NS_IMETHODIMP nsDocShell::AddToSessionHistory(nsIURI* aURI) PRBool shouldPersist = PR_FALSE; ShouldPersistInSessionHistory(aURI, &shouldPersist); - // XXXTAB - //NS_ERROR("Haven't Implemented this yet"); + nsCOMPtr entry(do_CreateInstance(NS_SHENTRY_PROGID)); + NS_ENSURE_TRUE(entry, NS_ERROR_FAILURE); + + nsCOMPtr inputStream; + nsCOMPtr layoutState; + + NS_ENSURE_SUCCESS(entry->Create(aURI, mTitle.GetUnicode(), nsnull, + inputStream, layoutState), NS_ERROR_FAILURE); + + NS_ENSURE_SUCCESS(mSessionHistory->AddEntry(entry, shouldPersist), + NS_ERROR_FAILURE); + return NS_OK; } @@ -2406,6 +2422,136 @@ NS_IMETHODIMP nsDocShell::UpdateCurrentGlobalHistory() return NS_OK; } +//***************************************************************************** +// nsDocShell: WebProgressListener Firing +//***************************************************************************** + +NS_IMETHODIMP nsDocShell::EnsureWebProgressListener() +{ + //XXXTAB + NS_ERROR("Not yet IMplemented"); + return NS_OK; +} + +NS_IMETHODIMP nsDocShell::FireOnProgressChange(nsIChannel* aChannel, + PRInt32 aCurSelfProgress, PRInt32 aMaxSelfProgress, + PRInt32 aCurTotalProgress, PRInt32 aMaxTotalProgress) +{ + if(mOwnerProgressListener) + mOwnerProgressListener->OnProgressChange(aChannel, aCurSelfProgress, + aMaxSelfProgress, aCurTotalProgress, aMaxTotalProgress); + + if(!mWebProgressListenerList) + return NS_OK; + + PRUint32 count = 0; + mWebProgressListenerList->Count(&count); + for(PRUint32 x = 0; x < count; x++) + { + nsCOMPtr element; + mWebProgressListenerList->GetElementAt(x, getter_AddRefs(element)); + nsCOMPtr listener(do_QueryInterface(element)); + if(!listener) + continue; + listener->OnProgressChange(aChannel, aCurSelfProgress, aMaxSelfProgress, + aCurTotalProgress, aMaxTotalProgress); + } + return NS_OK; +} + +NS_IMETHODIMP nsDocShell::FireOnChildProgressChange(nsIChannel* aChannel, + PRInt32 aCurChildProgress, PRInt32 aMaxChildProgress) +{ + if(mOwnerProgressListener) + mOwnerProgressListener->OnChildProgressChange(aChannel, aCurChildProgress, + aMaxChildProgress); + + if(!mWebProgressListenerList) + return NS_OK; + + PRUint32 count = 0; + mWebProgressListenerList->Count(&count); + for(PRUint32 x = 0; x < count; x++) + { + nsCOMPtr element; + mWebProgressListenerList->GetElementAt(x, getter_AddRefs(element)); + nsCOMPtr listener(do_QueryInterface(element)); + if(!listener) + continue; + listener->OnChildProgressChange(aChannel, aCurChildProgress, + aMaxChildProgress); + } + return NS_OK; +} + +NS_IMETHODIMP nsDocShell::FireOnStatusChange(nsIChannel* aChannel, + PRInt32 aProgressStatusFlags) +{ + if(mOwnerProgressListener) + mOwnerProgressListener->OnStatusChange(aChannel, aProgressStatusFlags); + + if(!mWebProgressListenerList) + return NS_OK; + + PRUint32 count = 0; + mWebProgressListenerList->Count(&count); + for(PRUint32 x = 0; x < count; x++) + { + nsCOMPtr element; + mWebProgressListenerList->GetElementAt(x, getter_AddRefs(element)); + nsCOMPtr listener(do_QueryInterface(element)); + if(!listener) + continue; + listener->OnStatusChange(aChannel, aProgressStatusFlags); + } + return NS_OK; +} + +NS_IMETHODIMP nsDocShell::FireOnChildStatusChange(nsIChannel* aChannel, + PRInt32 aProgressStatusFlags) +{ + if(mOwnerProgressListener) + mOwnerProgressListener->OnStatusChange(aChannel, aProgressStatusFlags); + + if(!mWebProgressListenerList) + return NS_OK; + + PRUint32 count = 0; + mWebProgressListenerList->Count(&count); + for(PRUint32 x = 0; x < count; x++) + { + nsCOMPtr element; + mWebProgressListenerList->GetElementAt(x, getter_AddRefs(element)); + nsCOMPtr listener(do_QueryInterface(element)); + if(!listener) + continue; + listener->OnChildStatusChange(aChannel, aProgressStatusFlags); + } + return NS_OK; +} + +NS_IMETHODIMP nsDocShell::FireOnLocationChange(nsIURI* aURI) +{ + if(mOwnerProgressListener) + mOwnerProgressListener->OnLocationChange(aURI); + + if(!mWebProgressListenerList) + return NS_OK; + + PRUint32 count = 0; + mWebProgressListenerList->Count(&count); + for(PRUint32 x = 0; x < count; x++) + { + nsCOMPtr element; + mWebProgressListenerList->GetElementAt(x, getter_AddRefs(element)); + nsCOMPtr listener(do_QueryInterface(element)); + if(!listener) + continue; + listener->OnLocationChange(aURI); + } + return NS_OK; +} + //***************************************************************************** // nsDocShell: Helper Routines //***************************************************************************** diff --git a/mozilla/docshell/base/nsDocShell.h b/mozilla/docshell/base/nsDocShell.h index 749370047e0..e313caf835e 100644 --- a/mozilla/docshell/base/nsDocShell.h +++ b/mozilla/docshell/base/nsDocShell.h @@ -47,9 +47,13 @@ #include "nsIScriptGlobalObjectOwner.h" #include "nsIInterfaceRequestor.h" -#include "nsDSURIContentListener.h" #include "nsPoint.h" // mCurrent/mDefaultScrollbarPreferences + +// Local Includes +#include "nsDSURIContentListener.h" +#include "nsDSWebProgressListener.h" + // Interfaces Needed #include "nsISupportsArray.h" #include "nsISHistory.h" @@ -81,6 +85,7 @@ class nsDocShell : public nsIDocShell, public nsIScriptGlobalObjectOwner { friend class nsDSURIContentListener; +friend class nsDSWebProgressListener; public: NS_DECL_ISUPPORTS @@ -157,6 +162,19 @@ protected: NS_IMETHOD AddToGlobalHistory(nsIURI* aURI); NS_IMETHOD UpdateCurrentGlobalHistory(); + // WebProgressListener Management + NS_IMETHOD EnsureWebProgressListener(); + + NS_IMETHOD FireOnProgressChange(nsIChannel* aChannel, + PRInt32 aCurSelfProgress, PRInt32 aMaxSelfProgress, + PRInt32 aCurTotalProgress, PRInt32 aMaxTotalProgress); + NS_IMETHOD FireOnChildProgressChange(nsIChannel* aChannel, + PRInt32 aCurSelfProgress, PRInt32 aMaxSelfProgress); + NS_IMETHOD FireOnStatusChange(nsIChannel* aChannel, PRInt32 aProgressStatusFlags); + NS_IMETHOD FireOnChildStatusChange(nsIChannel* aChannel, + PRInt32 aProgressStatusFlags); + NS_IMETHOD FireOnLocationChange(nsIURI* aURI); + // Helper Routines nsDocShellInitInfo* InitInfo(); NS_IMETHOD GetChildOffset(nsIDOMNode* aChild, nsIDOMNode* aParent, @@ -217,6 +235,7 @@ protected: For that reasons don't use nsCOMPtr.*/ nsIDocShellTreeItem* mParent; // Weak Reference nsIDocShellTreeOwner* mTreeOwner; // Weak Reference + nsIWebProgressListener* mOwnerProgressListener; // Weak Reference nsIChromeEventHandler* mChromeEventHandler; //Weak Reference };