1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=2 sw=2 et tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
8 #ifndef nsPIDOMWindow_h__
9 #define nsPIDOMWindow_h__
11 #include "nsIDOMWindow.h"
14 #include "nsAutoPtr.h"
16 #include "mozilla/dom/EventTarget.h"
17 #include "js/TypeDecls.h"
19 #define DOM_WINDOW_DESTROYED_TOPIC "dom-window-destroyed"
20 #define DOM_WINDOW_FROZEN_TOPIC "dom-window-frozen"
21 #define DOM_WINDOW_THAWED_TOPIC "dom-window-thawed"
27 class nsIIdleObserver
;
29 class nsIScriptTimeoutHandler
;
33 class nsXBLPrototypeHandler
;
46 // Popup control state enum. The values in this enum must go from most
47 // permissive to least permissive so that it's safe to push state in
48 // all situations. Pushing popup state onto the stack never makes the
49 // current popup state less permissive (see
50 // nsGlobalWindow::PushPopupControlState()).
51 enum PopupControlState
{
52 openAllowed
= 0, // open that window without worries
53 openControlled
, // it's a popup, but allow it
54 openAbused
, // it's a popup. disallow it, but allow domain override.
55 openOverridden
// disallow window open
58 enum UIStateChangeType
60 UIStateChangeType_NoChange
,
61 UIStateChangeType_Set
,
62 UIStateChangeType_Clear
65 #define NS_PIDOMWINDOW_IID \
66 { 0x19fb3019, 0x7b5d, 0x4235, \
67 { 0xa9, 0x59, 0xa2, 0x31, 0xa2, 0xe7, 0x94, 0x79 } }
69 class nsPIDOMWindow
: public nsIDOMWindowInternal
72 NS_DECLARE_STATIC_IID_ACCESSOR(NS_PIDOMWINDOW_IID
)
74 virtual nsPIDOMWindow
* GetPrivateRoot() = 0;
76 // Outer windows only.
77 virtual void ActivateOrDeactivate(bool aActivate
) = 0;
79 // this is called GetTopWindowRoot to avoid conflicts with nsIDOMWindow::GetWindowRoot
80 virtual already_AddRefed
<nsPIWindowRoot
> GetTopWindowRoot() = 0;
82 // Inner windows only.
83 virtual nsresult
RegisterIdleObserver(nsIIdleObserver
* aIdleObserver
) = 0;
84 virtual nsresult
UnregisterIdleObserver(nsIIdleObserver
* aIdleObserver
) = 0;
86 // Outer windows only.
87 virtual void SetActive(bool aActive
)
89 MOZ_ASSERT(IsOuterWindow());
94 MOZ_ASSERT(IsOuterWindow());
98 // Outer windows only.
99 virtual void SetIsBackground(bool aIsBackground
)
101 MOZ_ASSERT(IsOuterWindow());
102 mIsBackground
= aIsBackground
;
106 MOZ_ASSERT(IsOuterWindow());
107 return mIsBackground
;
110 mozilla::dom::EventTarget
* GetChromeEventHandler() const
112 return mChromeEventHandler
;
115 // Outer windows only.
116 virtual void SetChromeEventHandler(mozilla::dom::EventTarget
* aChromeEventHandler
) = 0;
118 mozilla::dom::EventTarget
* GetParentTarget()
120 if (!mParentTarget
) {
121 UpdateParentTarget();
123 return mParentTarget
;
126 bool HasMutationListeners(uint32_t aMutationEventType
) const
128 MOZ_ASSERT(IsInnerWindow());
131 NS_ERROR("HasMutationListeners() called on orphan inner window!");
136 return (mMutationBits
& aMutationEventType
) != 0;
139 void SetMutationListeners(uint32_t aType
)
141 MOZ_ASSERT(IsInnerWindow());
144 NS_ERROR("HasMutationListeners() called on orphan inner window!");
149 mMutationBits
|= aType
;
152 virtual void MaybeUpdateTouchState() {}
153 virtual void UpdateTouchState() {}
155 nsIDocument
* GetExtantDoc() const
159 nsIURI
* GetDocumentURI() const;
160 nsIURI
* GetDocBaseURI() const;
162 nsIDocument
* GetDoc()
170 virtual bool IsRunningTimeout() = 0;
173 bool GetAudioMuted() const;
174 void SetAudioMuted(bool aMuted
);
176 float GetAudioVolume() const;
177 nsresult
SetAudioVolume(float aVolume
);
179 float GetAudioGlobalVolume();
182 // Lazily instantiate an about:blank document if necessary, and if
183 // we have what it takes to do so.
184 void MaybeCreateDoc();
186 float GetAudioGlobalVolumeInternal(float aVolume
);
187 void RefreshMediaElements();
190 // Internal getter/setter for the frame element, this version of the
191 // getter crosses chrome boundaries whereas the public scriptable
192 // one doesn't for security reasons.
193 mozilla::dom::Element
* GetFrameElementInternal() const;
194 void SetFrameElementInternal(mozilla::dom::Element
* aFrameElement
);
196 bool IsLoadingOrRunningTimeout() const
198 const nsPIDOMWindow
* win
= IsInnerWindow() ? this : GetCurrentInnerWindow();
199 return !win
->mIsDocumentLoaded
|| win
->mRunningTimeout
;
202 // Check whether a document is currently loading
203 bool IsLoading() const
205 const nsPIDOMWindow
*win
;
207 if (IsOuterWindow()) {
208 win
= GetCurrentInnerWindow();
211 NS_ERROR("No current inner window available!");
217 NS_ERROR("IsLoading() called on orphan inner window!");
225 return !win
->mIsDocumentLoaded
;
228 bool IsHandlingResizeEvent() const
230 const nsPIDOMWindow
*win
;
232 if (IsOuterWindow()) {
233 win
= GetCurrentInnerWindow();
236 NS_ERROR("No current inner window available!");
242 NS_ERROR("IsHandlingResizeEvent() called on orphan inner window!");
250 return win
->mIsHandlingResizeEvent
;
253 // Set the window up with an about:blank document with the current subject
255 // Outer windows only.
256 virtual void SetInitialPrincipalToSubject() = 0;
258 virtual PopupControlState
PushPopupControlState(PopupControlState aState
,
259 bool aForce
) const = 0;
260 virtual void PopPopupControlState(PopupControlState state
) const = 0;
261 virtual PopupControlState
GetPopupControlState() const = 0;
263 // Returns an object containing the window's state. This also suspends
264 // all running timeouts in the window.
265 virtual already_AddRefed
<nsISupports
> SaveWindowState() = 0;
267 // Restore the window state from aState.
268 virtual nsresult
RestoreWindowState(nsISupports
*aState
) = 0;
270 // Suspend timeouts in this window and in child windows.
271 virtual void SuspendTimeouts(uint32_t aIncrease
= 1,
272 bool aFreezeChildren
= true) = 0;
274 // Resume suspended timeouts in this window and in child windows.
275 virtual nsresult
ResumeTimeouts(bool aThawChildren
= true) = 0;
277 virtual uint32_t TimeoutSuspendCount() = 0;
279 // Fire any DOM notification events related to things that happened while
280 // the window was frozen.
281 virtual nsresult
FireDelayedDOMEvents() = 0;
283 virtual bool IsFrozen() const = 0;
285 // Add a timeout to this window.
286 virtual nsresult
SetTimeoutOrInterval(nsIScriptTimeoutHandler
*aHandler
,
288 bool aIsInterval
, int32_t *aReturn
) = 0;
290 // Clear a timeout from this window.
291 virtual nsresult
ClearTimeoutOrInterval(int32_t aTimerID
) = 0;
293 nsPIDOMWindow
*GetOuterWindow()
295 return mIsInnerWindow
? mOuterWindow
.get() : this;
298 nsPIDOMWindow
*GetCurrentInnerWindow() const
300 MOZ_ASSERT(IsOuterWindow());
304 nsPIDOMWindow
*EnsureInnerWindow()
306 NS_ASSERTION(IsOuterWindow(), "EnsureInnerWindow called on inner window");
307 // GetDoc forces inner window creation if there isn't one already
309 return GetCurrentInnerWindow();
312 bool IsInnerWindow() const
314 return mIsInnerWindow
;
317 // Returns true if this object has an outer window and it is the current inner
318 // window of that outer. Only call this on inner windows.
319 bool IsCurrentInnerWindow() const
321 MOZ_ASSERT(IsInnerWindow(),
322 "It doesn't make sense to call this on outer windows.");
323 return mOuterWindow
&& mOuterWindow
->GetCurrentInnerWindow() == this;
326 // Returns true if the document of this window is the active document. This
327 // is not identical to IsCurrentInnerWindow() because document.open() will
328 // keep the same document active but create a new window.
329 bool HasActiveDocument()
331 MOZ_ASSERT(IsInnerWindow());
332 return IsCurrentInnerWindow() ||
334 mOuterWindow
->GetCurrentInnerWindow() &&
335 mOuterWindow
->GetCurrentInnerWindow()->GetDoc() == mDoc
);
338 bool IsOuterWindow() const
340 return !IsInnerWindow();
343 // Outer windows only.
344 virtual bool WouldReuseInnerWindow(nsIDocument
* aNewDocument
) = 0;
347 * Get the docshell in this window.
349 nsIDocShell
*GetDocShell()
352 return mOuterWindow
->mDocShell
;
359 * Set the docshell in the window. Must not be called with a null docshell
360 * (use DetachFromDocShell for that).
362 virtual void SetDocShell(nsIDocShell
*aDocShell
) = 0;
365 * Detach an outer window from its docshell.
367 virtual void DetachFromDocShell() = 0;
370 * Set a new document in the window. Calling this method will in
371 * most cases create a new inner window. If this method is called on
372 * an inner window the call will be forewarded to the outer window,
373 * if the inner window is not the current inner window an
374 * NS_ERROR_NOT_AVAILABLE error code will be returned. This may be
375 * called with a pointer to the current document, in that case the
376 * document remains unchanged, but a new inner window will be
379 * aDocument must not be null.
381 virtual nsresult
SetNewDocument(nsIDocument
*aDocument
,
383 bool aForceReuseInnerWindow
) = 0;
386 * Set the opener window. aOriginalOpener is true if and only if this is the
387 * original opener for the window. That is, it can only be true at most once
388 * during the life cycle of a window, and then only the first time
389 * SetOpenerWindow is called. It might never be true, of course, if the
390 * window does not have an opener when it's created.
392 virtual void SetOpenerWindow(nsIDOMWindow
* aOpener
,
393 bool aOriginalOpener
) = 0;
395 virtual void EnsureSizeUpToDate() = 0;
398 * Callback for notifying a window about a modal dialog being
399 * opened/closed with the window as a parent.
401 virtual void EnterModalState() = 0;
402 virtual void LeaveModalState() = 0;
404 // Outer windows only.
405 virtual bool CanClose() = 0;
406 virtual void ForceClose() = 0;
408 bool IsModalContentWindow() const
410 return mIsModalContentWindow
;
414 * Call this to indicate that some node (this window, its document,
415 * or content in that document) has a paint event listener.
417 void SetHasPaintEventListeners()
419 mMayHavePaintEventListener
= true;
423 * Call this to check whether some node (this window, its document,
424 * or content in that document) has a paint event listener.
426 bool HasPaintEventListeners()
428 return mMayHavePaintEventListener
;
432 * Call this to indicate that some node (this window, its document,
433 * or content in that document) has a touch event listener.
435 void SetHasTouchEventListeners()
437 mMayHaveTouchEventListener
= true;
438 MaybeUpdateTouchState();
441 bool HasTouchEventListeners()
443 return mMayHaveTouchEventListener
;
447 * Call this to indicate that some node (this window, its document,
448 * or content in that document) has a scroll wheel event listener.
450 void SetHasScrollWheelEventListeners()
452 mMayHaveScrollWheelEventListener
= true;
455 bool HasScrollWheelEventListeners()
457 return mMayHaveScrollWheelEventListener
;
461 * Returns whether or not any event listeners are present that APZ must be
464 bool HasApzAwareEventListeners()
466 return HasTouchEventListeners() || HasScrollWheelEventListeners();
470 * Will be called when touch caret visibility has changed. mMayHaveTouchCaret
471 * is set if that some node (this window, its document, or content in that
472 * document) has a visible touch caret.
474 void SetMayHaveTouchCaret(bool aSetValue
)
476 mMayHaveTouchCaret
= aSetValue
;
479 bool MayHaveTouchCaret()
481 return mMayHaveTouchCaret
;
485 * Moves the top-level window into fullscreen mode if aIsFullScreen is true,
486 * otherwise exits fullscreen. If aRequireTrust is true, this method only
487 * changes window state in a context trusted for write.
489 * If aHMD is not null, the window is made full screen on the given VR HMD
490 * device instead of its currrent display.
492 * Outer windows only.
494 virtual nsresult
SetFullScreenInternal(bool aIsFullScreen
, bool aRequireTrust
,
495 mozilla::gfx::VRHMDInfo
*aHMD
= nullptr) = 0;
498 * Call this to check whether some node (this window, its document,
499 * or content in that document) has a mouseenter/leave event listener.
501 bool HasMouseEnterLeaveEventListeners()
503 return mMayHaveMouseEnterLeaveEventListener
;
507 * Call this to indicate that some node (this window, its document,
508 * or content in that document) has a mouseenter/leave event listener.
510 void SetHasMouseEnterLeaveEventListeners()
512 mMayHaveMouseEnterLeaveEventListener
= true;
516 * Call this to check whether some node (this window, its document,
517 * or content in that document) has a Pointerenter/leave event listener.
519 bool HasPointerEnterLeaveEventListeners()
521 return mMayHavePointerEnterLeaveEventListener
;
525 * Call this to indicate that some node (this window, its document,
526 * or content in that document) has a Pointerenter/leave event listener.
528 void SetHasPointerEnterLeaveEventListeners()
530 mMayHavePointerEnterLeaveEventListener
= true;
534 virtual JSObject
* GetCachedXBLPrototypeHandler(nsXBLPrototypeHandler
* aKey
) = 0;
535 virtual void CacheXBLPrototypeHandler(nsXBLPrototypeHandler
* aKey
,
536 JS::Handle
<JSObject
*> aHandler
) = 0;
539 * Get and set the currently focused element within the document. If
540 * aNeedsFocus is true, then set mNeedsFocus to true to indicate that a
541 * document focus event is needed.
543 * DO NOT CALL EITHER OF THESE METHODS DIRECTLY. USE THE FOCUS MANAGER
546 nsIContent
* GetFocusedNode()
548 if (IsOuterWindow()) {
549 return mInnerWindow
? mInnerWindow
->mFocusedNode
.get() : nullptr;
553 virtual void SetFocusedNode(nsIContent
* aNode
,
554 uint32_t aFocusMethod
= 0,
555 bool aNeedsFocus
= false) = 0;
558 * Retrieves the method that was used to focus the current node.
560 virtual uint32_t GetFocusMethod() = 0;
563 * Tells the window that it now has focus or has lost focus, based on the
564 * state of aFocus. If this method returns true, then the document loaded
565 * in the window has never received a focus event and expects to receive
566 * one. If false is returned, the document has received a focus event before
567 * and should only receive one if the window is being focused.
569 * aFocusMethod may be set to one of the focus method constants in
570 * nsIFocusManager to indicate how focus was set.
572 virtual bool TakeFocus(bool aFocus
, uint32_t aFocusMethod
) = 0;
575 * Indicates that the window may now accept a document focus event. This
576 * should be called once a document has been loaded into the window.
578 virtual void SetReadyForFocus() = 0;
581 * Whether the focused content within the window should show a focus ring.
583 virtual bool ShouldShowFocusRing() = 0;
586 * Set the keyboard indicator state for accelerators and focus rings.
588 virtual void SetKeyboardIndicators(UIStateChangeType aShowAccelerators
,
589 UIStateChangeType aShowFocusRings
) = 0;
592 * Get the keyboard indicator state for accelerators and focus rings.
594 virtual void GetKeyboardIndicators(bool* aShowAccelerators
,
595 bool* aShowFocusRings
) = 0;
598 * Indicates that the page in the window has been hidden. This is used to
599 * reset the focus state.
601 virtual void PageHidden() = 0;
604 * Instructs this window to asynchronously dispatch a hashchange event. This
605 * method must be called on an inner window.
607 virtual nsresult
DispatchAsyncHashchange(nsIURI
*aOldURI
,
608 nsIURI
*aNewURI
) = 0;
611 * Instructs this window to synchronously dispatch a popState event.
613 virtual nsresult
DispatchSyncPopState() = 0;
616 * Tell this window that it should listen for sensor changes of the given
619 * Inner windows only.
621 virtual void EnableDeviceSensor(uint32_t aType
) = 0;
624 * Tell this window that it should remove itself from sensor change
627 * Inner windows only.
629 virtual void DisableDeviceSensor(uint32_t aType
) = 0;
631 virtual void EnableTimeChangeNotifications() = 0;
632 virtual void DisableTimeChangeNotifications() = 0;
636 * Tell the window that it should start to listen to the network event of the
639 * Inner windows only.
641 virtual void EnableNetworkEvent(uint32_t aType
) = 0;
644 * Tell the window that it should stop to listen to the network event of the
647 * Inner windows only.
649 virtual void DisableNetworkEvent(uint32_t aType
) = 0;
653 * Tell this window that there is an observer for gamepad input
655 * Inner windows only.
657 virtual void SetHasGamepadEventListener(bool aHasGamepad
= true) = 0;
660 * Set a arguments for this window. This will be set on the window
661 * right away (if there's an existing document) and it will also be
662 * installed on the window when the next document is loaded.
664 * This function serves double-duty for passing both |arguments| and
665 * |dialogArguments| back from nsWindowWatcher to nsGlobalWindow. For the
666 * latter, the array is an array of length 0 whose only element is a
667 * DialogArgumentsHolder representing the JS value passed to showModalDialog.
669 * Outer windows only.
671 virtual nsresult
SetArguments(nsIArray
*aArguments
) = 0;
674 * NOTE! This function *will* be called on multiple threads so the
675 * implementation must not do any AddRef/Release or other actions that will
676 * mutate internal state.
678 virtual uint32_t GetSerial() = 0;
681 * Return the window id of this window
683 uint64_t WindowID() const { return mWindowID
; }
686 * Dispatch a custom event with name aEventName targeted at this window.
687 * Returns whether the default action should be performed.
689 * Outer windows only.
691 virtual bool DispatchCustomEvent(const nsAString
& aEventName
) = 0;
694 * Call when the document principal may have changed and the compartment
695 * principal needs to be updated.
697 * Inner windows only.
699 virtual void RefreshCompartmentPrincipal() = 0;
702 * Like nsIDOMWindow::Open, except that we don't navigate to the given URL.
704 * Outer windows only.
707 OpenNoNavigate(const nsAString
& aUrl
, const nsAString
& aName
,
708 const nsAString
& aOptions
, nsIDOMWindow
**_retval
) = 0;
711 * Fire a popup blocked event on the document.
714 FirePopupBlockedEvent(nsIDocument
* aDoc
,
716 const nsAString
& aPopupWindowName
,
717 const nsAString
& aPopupWindowFeatures
) = 0;
719 // Inner windows only.
720 void AddAudioContext(mozilla::dom::AudioContext
* aAudioContext
);
721 void RemoveAudioContext(mozilla::dom::AudioContext
* aAudioContext
);
722 void MuteAudioContexts();
723 void UnmuteAudioContexts();
725 // Given an inner window, return its outer if the inner is the current inner.
726 // Otherwise (argument null or not an inner or not current) return null.
727 static nsPIDOMWindow
* GetOuterFromCurrentInner(nsPIDOMWindow
* aInner
)
733 nsPIDOMWindow
* outer
= aInner
->GetOuterWindow();
734 if (!outer
|| outer
->GetCurrentInnerWindow() != aInner
) {
742 nsPerformance
* GetPerformance();
744 void MarkUncollectableForCCGeneration(uint32_t aGeneration
)
746 mMarkedCCGeneration
= aGeneration
;
749 uint32_t GetMarkedCCGeneration()
751 return mMarkedCCGeneration
;
754 // Sets the condition that we send an NS_AFTER_REMOTE_PAINT message just before the next
755 // composite. Used in non-e10s implementations.
756 void SetRequestNotifyAfterRemotePaint()
758 mSendAfterRemotePaint
= true;
761 // Sends an NS_AFTER_REMOTE_PAINT message if requested by
762 // SetRequestNotifyAfterRemotePaint().
763 void SendAfterRemotePaintIfRequested();
766 // The nsPIDOMWindow constructor. The aOuterWindow argument should
767 // be null if and only if the created window itself is an outer
768 // window. In all other cases aOuterWindow should be the outer
769 // window for the inner window that is being created.
770 explicit nsPIDOMWindow(nsPIDOMWindow
*aOuterWindow
);
774 void SetChromeEventHandlerInternal(mozilla::dom::EventTarget
* aChromeEventHandler
) {
775 mChromeEventHandler
= aChromeEventHandler
;
776 // mParentTarget will be set when the next event is dispatched.
777 mParentTarget
= nullptr;
780 virtual void UpdateParentTarget() = 0;
782 // Helper for creating performance objects.
783 // Inner windows only.
784 void CreatePerformanceObjectIfNeeded();
786 // These two variables are special in that they're set to the same
787 // value on both the outer window and the current inner window. Make
788 // sure you keep them in sync!
789 nsCOMPtr
<mozilla::dom::EventTarget
> mChromeEventHandler
; // strong
790 nsCOMPtr
<nsIDocument
> mDoc
; // strong
791 // Cache the URI when mDoc is cleared.
792 nsCOMPtr
<nsIURI
> mDocumentURI
; // strong
793 nsCOMPtr
<nsIURI
> mDocBaseURI
; // strong
795 nsCOMPtr
<mozilla::dom::EventTarget
> mParentTarget
; // strong
797 // These members are only used on outer windows.
798 nsCOMPtr
<mozilla::dom::Element
> mFrameElement
;
799 nsIDocShell
*mDocShell
; // Weak Reference
801 // mPerformance is only used on inner windows.
802 nsRefPtr
<nsPerformance
> mPerformance
;
804 uint32_t mModalStateDepth
;
806 // These variables are only used on inner windows.
807 nsTimeout
*mRunningTimeout
;
809 uint32_t mMutationBits
;
811 bool mIsDocumentLoaded
;
812 bool mIsHandlingResizeEvent
;
814 bool mMayHavePaintEventListener
;
815 bool mMayHaveTouchEventListener
;
816 bool mMayHaveTouchCaret
;
817 bool mMayHaveScrollWheelEventListener
;
818 bool mMayHaveMouseEnterLeaveEventListener
;
819 bool mMayHavePointerEnterLeaveEventListener
;
821 // This variable is used on both inner and outer windows (and they
823 bool mIsModalContentWindow
;
825 // Tracks activation state that's used for :-moz-window-inactive.
826 // Only used on outer windows.
829 // Tracks whether our docshell is active. If it is, mIsBackground
830 // is false. Too bad we have so many different concepts of
831 // "active". Only used on outer windows.
837 // And these are the references between inner and outer windows.
838 nsPIDOMWindow
*mInnerWindow
;
839 nsCOMPtr
<nsPIDOMWindow
> mOuterWindow
;
841 // the element within the document that is currently focused when this
843 nsCOMPtr
<nsIContent
> mFocusedNode
;
845 // The AudioContexts created for the current document, if any.
846 nsTArray
<mozilla::dom::AudioContext
*> mAudioContexts
; // Weak
848 // A unique (as long as our 64-bit counter doesn't roll over) id for
852 // This is only used by the inner window. Set to true once we've sent
853 // the (chrome|content)-document-global-created notification.
854 bool mHasNotifiedGlobalCreated
;
856 uint32_t mMarkedCCGeneration
;
858 // If true, send an NS_AFTER_REMOTE_PAINT message before compositing in a
859 // non-e10s implementation.
860 bool mSendAfterRemotePaint
;
864 NS_DEFINE_STATIC_IID_ACCESSOR(nsPIDOMWindow
, NS_PIDOMWINDOW_IID
)
866 #ifdef MOZILLA_INTERNAL_API
868 PushPopupControlState(PopupControlState aState
, bool aForce
);
871 PopPopupControlState(PopupControlState aState
);
873 #define NS_AUTO_POPUP_STATE_PUSHER nsAutoPopupStatePusherInternal
875 #define NS_AUTO_POPUP_STATE_PUSHER nsAutoPopupStatePusherExternal
878 // Helper class that helps with pushing and popping popup control
879 // state. Note that this class looks different from within code that's
880 // part of the layout library than it does in code outside the layout
881 // library. We give the two object layouts different names so the symbols
882 // don't conflict, but code should always use the name
883 // |nsAutoPopupStatePusher|.
884 class NS_AUTO_POPUP_STATE_PUSHER
887 #ifdef MOZILLA_INTERNAL_API
888 explicit NS_AUTO_POPUP_STATE_PUSHER(PopupControlState aState
, bool aForce
= false)
889 : mOldState(::PushPopupControlState(aState
, aForce
))
893 ~NS_AUTO_POPUP_STATE_PUSHER()
895 PopPopupControlState(mOldState
);
898 NS_AUTO_POPUP_STATE_PUSHER(nsPIDOMWindow
*aWindow
, PopupControlState aState
)
899 : mWindow(aWindow
), mOldState(openAbused
)
902 mOldState
= aWindow
->PushPopupControlState(aState
, false);
906 ~NS_AUTO_POPUP_STATE_PUSHER()
909 mWindow
->PopPopupControlState(mOldState
);
915 #ifndef MOZILLA_INTERNAL_API
916 nsCOMPtr
<nsPIDOMWindow
> mWindow
;
918 PopupControlState mOldState
;
921 // Hide so that this class can only be stack-allocated
922 static void* operator new(size_t /*size*/) CPP_THROW_NEW
{ return nullptr; }
923 static void operator delete(void* /*memory*/) {}
926 #define nsAutoPopupStatePusher NS_AUTO_POPUP_STATE_PUSHER
928 #endif // nsPIDOMWindow_h__