diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
commit | 36d22d82aa202bb199967e9512281e9a53db42c9 (patch) | |
tree | 105e8c98ddea1c1e4784a60a5a6410fa416be2de /dom/base/PopupBlocker.h | |
parent | Initial commit. (diff) | |
download | firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.tar.xz firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.zip |
Adding upstream version 115.7.0esr.upstream/115.7.0esrupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'dom/base/PopupBlocker.h')
-rw-r--r-- | dom/base/PopupBlocker.h | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/dom/base/PopupBlocker.h b/dom/base/PopupBlocker.h new file mode 100644 index 0000000000..bc6a5daf97 --- /dev/null +++ b/dom/base/PopupBlocker.h @@ -0,0 +1,117 @@ +/* -*- 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 mozilla_dom_PopupBlocker_h +#define mozilla_dom_PopupBlocker_h + +#include <stdint.h> +#include "mozilla/Attributes.h" +#include "mozilla/TimeStamp.h" + +class AutoPopupStatePusherInternal; +class nsIPrincipal; + +namespace mozilla { +class WidgetEvent; +namespace dom { +class Event; + +class PopupBlocker final { + public: + // Popup control state enum. The values in this enum must go from most + // permissive to least permissive so that it's safe to push state in + // all situations. Pushing popup state onto the stack never makes the + // current popup state less permissive. + // Keep this in sync with PopupBlockerState webidl dictionary! + enum PopupControlState { + openAllowed = 0, // open that window without worries + openControlled, // it's a popup, but allow it + openBlocked, // it's a popup, but not from an allowed event + openAbused, // it's a popup. disallow it, but allow domain override. + openOverridden // disallow window open + }; + + static PopupControlState PushPopupControlState(PopupControlState aState, + bool aForce); + + static void PopPopupControlState(PopupControlState aState); + + static PopupControlState GetPopupControlState(); + + static void PopupStatePusherCreated(); + static void PopupStatePusherDestroyed(); + + static uint32_t GetPopupPermission(nsIPrincipal* aPrincipal); + + static PopupBlocker::PopupControlState GetEventPopupControlState( + WidgetEvent* aEvent, Event* aDOMEvent = nullptr); + + // Returns if a external protocol iframe is allowed. + static bool ConsumeTimerTokenForExternalProtocolIframe(); + + // Returns when the last external protocol iframe has been allowed. + static TimeStamp WhenLastExternalProtocolIframeAllowed(); + + // Reset the last external protocol iframe timestamp. + static void ResetLastExternalProtocolIframeAllowed(); + + // These method track the number of popup which is considered as a spam popup. + static void RegisterOpenPopupSpam(); + static void UnregisterOpenPopupSpam(); + static uint32_t GetOpenPopupSpamCount(); + + static void Initialize(); + static void Shutdown(); +}; + +} // namespace dom +} // namespace mozilla + +#ifdef MOZILLA_INTERNAL_API +# define AUTO_POPUP_STATE_PUSHER AutoPopupStatePusherInternal +#else +# define AUTO_POPUP_STATE_PUSHER AutoPopupStatePusherExternal +#endif + +// Helper class that helps with pushing and popping popup control +// state. Note that this class looks different from within code that's +// part of the layout library than it does in code outside the layout +// library. We give the two object layouts different names so the symbols +// don't conflict, but code should always use the name +// |AutoPopupStatePusher|. +class MOZ_RAII AUTO_POPUP_STATE_PUSHER final { + public: +#ifdef MOZILLA_INTERNAL_API + explicit AUTO_POPUP_STATE_PUSHER( + mozilla::dom::PopupBlocker::PopupControlState aState, + bool aForce = false); + ~AUTO_POPUP_STATE_PUSHER(); +#else + AUTO_POPUP_STATE_PUSHER(nsPIDOMWindowOuter* aWindow, + mozilla::dom::PopupBlocker::PopupControlState aState) + : mWindow(aWindow), mOldState(openAbused) { + if (aWindow) { + mOldState = PopupBlocker::PushPopupControlState(aState, false); + } + } + + ~AUTO_POPUP_STATE_PUSHER() { + if (mWindow) { + PopupBlocker::PopPopupControlState(mOldState); + } + } +#endif + + protected: +#ifndef MOZILLA_INTERNAL_API + nsCOMPtr<nsPIDOMWindowOuter> mWindow; +#endif + mozilla::dom::PopupBlocker::PopupControlState mOldState; +}; + +#define AutoPopupStatePusher AUTO_POPUP_STATE_PUSHER + +#endif // mozilla_PopupBlocker_h |