diff options
Diffstat (limited to 'docshell/base/BrowsingContextWebProgress.h')
-rw-r--r-- | docshell/base/BrowsingContextWebProgress.h | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/docshell/base/BrowsingContextWebProgress.h b/docshell/base/BrowsingContextWebProgress.h new file mode 100644 index 0000000000..8085da715b --- /dev/null +++ b/docshell/base/BrowsingContextWebProgress.h @@ -0,0 +1,68 @@ +/* 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 mozilla_dom_BrowsingContextWebProgress_h +#define mozilla_dom_BrowsingContextWebProgress_h + +#include "nsIWebProgress.h" +#include "nsIWebProgressListener.h" +#include "nsTObserverArray.h" +#include "nsWeakReference.h" + +namespace mozilla { +namespace dom { + +class BrowsingContextWebProgress final : public nsIWebProgress, + public nsIWebProgressListener { + public: + NS_DECL_ISUPPORTS + NS_DECL_NSIWEBPROGRESS + NS_DECL_NSIWEBPROGRESSLISTENER + + BrowsingContextWebProgress() = default; + + struct ListenerInfo { + ListenerInfo(nsIWeakReference* aListener, unsigned long aNotifyMask) + : mWeakListener(aListener), mNotifyMask(aNotifyMask) {} + + bool operator==(const ListenerInfo& aOther) const { + return mWeakListener == aOther.mWeakListener; + } + bool operator==(const nsWeakPtr& aOther) const { + return mWeakListener == aOther; + } + + // Weak pointer for the nsIWebProgressListener... + nsWeakPtr mWeakListener; + + // Mask indicating which notifications the listener wants to receive. + unsigned long mNotifyMask; + }; + + private: + virtual ~BrowsingContextWebProgress() = default; + + void UpdateAndNotifyListeners( + uint32_t aFlag, + const std::function<void(nsIWebProgressListener*)>& aCallback); + + using ListenerArray = nsAutoTObserverArray<ListenerInfo, 4>; + ListenerArray mListenerInfoList; + + // This indicates whether we are currently suspending onStateChange top level + // STATE_START events for a document. We start suspending whenever we receive + // the first STATE_START event with the matching flags (see + // ::RecvOnStateChange for details), until we get a corresponding STATE_STOP + // event. In the meantime, if there other onStateChange events, this flag does + // not affect them. We do this to avoid duplicate onStateChange STATE_START + // events that happen during process switch. With this flag, we allow + // onStateChange STATE_START event from the old BrowserParent, but not the + // same event from the new BrowserParent during a process switch. + bool mSuspendOnStateStartChangeEvents = false; +}; + +} // namespace dom +} // namespace mozilla + +#endif // mozilla_dom_BrowsingContextWebProgress_h |