summaryrefslogtreecommitdiffstats
path: root/docshell/base/BrowsingContextWebProgress.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--docshell/base/BrowsingContextWebProgress.h68
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