diff options
Diffstat (limited to 'docshell/shistory/nsSHistory.h')
-rw-r--r-- | docshell/shistory/nsSHistory.h | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/docshell/shistory/nsSHistory.h b/docshell/shistory/nsSHistory.h new file mode 100644 index 000000000..cddc27269 --- /dev/null +++ b/docshell/shistory/nsSHistory.h @@ -0,0 +1,133 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef nsSHistory_h +#define nsSHistory_h + +#include "nsCOMPtr.h" +#include "nsISHistory.h" +#include "nsISHistoryInternal.h" +#include "nsIWebNavigation.h" +#include "nsISimpleEnumerator.h" +#include "nsTObserverArray.h" +#include "nsWeakPtr.h" +#include "nsIPartialSHistoryListener.h" + +#include "prclist.h" + +class nsIDocShell; +class nsSHEnumerator; +class nsSHistoryObserver; +class nsISHEntry; +class nsISHTransaction; + +class nsSHistory final : public PRCList, + public nsISHistory, + public nsISHistoryInternal, + public nsIWebNavigation +{ +public: + nsSHistory(); + NS_DECL_ISUPPORTS + NS_DECL_NSISHISTORY + NS_DECL_NSISHISTORYINTERNAL + NS_DECL_NSIWEBNAVIGATION + + // One time initialization method called upon docshell module construction + static nsresult Startup(); + static void Shutdown(); + static void UpdatePrefs(); + + // Max number of total cached content viewers. If the pref + // browser.sessionhistory.max_total_viewers is negative, then + // this value is calculated based on the total amount of memory. + // Otherwise, it comes straight from the pref. + static uint32_t GetMaxTotalViewers() { return sHistoryMaxTotalViewers; } + +private: + virtual ~nsSHistory(); + friend class nsSHEnumerator; + friend class nsSHistoryObserver; + + // Could become part of nsIWebNavigation + NS_IMETHOD GetTransactionAtIndex(int32_t aIndex, nsISHTransaction** aResult); + nsresult LoadDifferingEntries(nsISHEntry* aPrevEntry, nsISHEntry* aNextEntry, + nsIDocShell* aRootDocShell, long aLoadType, + bool& aDifferenceFound); + nsresult InitiateLoad(nsISHEntry* aFrameEntry, nsIDocShell* aFrameDS, + long aLoadType); + + NS_IMETHOD LoadEntry(int32_t aIndex, long aLoadType, uint32_t aHistCmd); + +#ifdef DEBUG + nsresult PrintHistory(); +#endif + + // Evict content viewers in this window which don't lie in the "safe" range + // around aIndex. + void EvictOutOfRangeWindowContentViewers(int32_t aIndex); + static void GloballyEvictContentViewers(); + static void GloballyEvictAllContentViewers(); + + // Calculates a max number of total + // content viewers to cache, based on amount of total memory + static uint32_t CalcMaxTotalViewers(); + + void RemoveDynEntries(int32_t aOldIndex, int32_t aNewIndex); + + nsresult LoadNextPossibleEntry(int32_t aNewIndex, long aLoadType, + uint32_t aHistCmd); + + // aIndex is the index of the transaction which may be removed. + // If aKeepNext is true, aIndex is compared to aIndex + 1, + // otherwise comparison is done to aIndex - 1. + bool RemoveDuplicate(int32_t aIndex, bool aKeepNext); + + nsCOMPtr<nsISHTransaction> mListRoot; + int32_t mIndex; + int32_t mLength; + int32_t mRequestedIndex; + + // Set to true if attached to a grouped session history. + bool mIsPartial; + + // The number of entries before this session history object. + int32_t mGlobalIndexOffset; + + // The number of entries after this session history object. + int32_t mEntriesInFollowingPartialHistories; + + // Session History listeners + nsAutoTObserverArray<nsWeakPtr, 2> mListeners; + + // Partial session history listener + nsWeakPtr mPartialHistoryListener; + + // Weak reference. Do not refcount this. + nsIDocShell* mRootDocShell; + + // Max viewers allowed total, across all SHistory objects + static int32_t sHistoryMaxTotalViewers; +}; + +class nsSHEnumerator : public nsISimpleEnumerator +{ +public: + NS_DECL_ISUPPORTS + NS_DECL_NSISIMPLEENUMERATOR + + explicit nsSHEnumerator(nsSHistory* aHistory); + +protected: + friend class nsSHistory; + virtual ~nsSHEnumerator(); + +private: + int32_t mIndex; + nsSHistory* mSHistory; +}; + +#endif /* nsSHistory */ |