Blame widget/nsBaseWidget.h

Packit f0b94e
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
Packit f0b94e
/* This Source Code Form is subject to the terms of the Mozilla Public
Packit f0b94e
 * License, v. 2.0. If a copy of the MPL was not distributed with this
Packit f0b94e
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
Packit f0b94e
#ifndef nsBaseWidget_h__
Packit f0b94e
#define nsBaseWidget_h__
Packit f0b94e
Packit f0b94e
#include "InputData.h"
Packit f0b94e
#include "mozilla/EventForwards.h"
Packit f0b94e
#include "mozilla/Mutex.h"
Packit f0b94e
#include "mozilla/RefPtr.h"
Packit f0b94e
#include "mozilla/UniquePtr.h"
Packit f0b94e
#include "mozilla/WidgetUtils.h"
Packit f0b94e
#include "mozilla/layers/APZCCallbackHelper.h"
Packit f0b94e
#include "mozilla/layers/CompositorOptions.h"
Packit f0b94e
#include "nsRect.h"
Packit f0b94e
#include "nsIWidget.h"
Packit f0b94e
#include "nsWidgetsCID.h"
Packit f0b94e
#include "nsIFile.h"
Packit f0b94e
#include "nsString.h"
Packit f0b94e
#include "nsCOMPtr.h"
Packit f0b94e
#include "nsIRollupListener.h"
Packit f0b94e
#include "nsIObserver.h"
Packit f0b94e
#include "nsIWidgetListener.h"
Packit f0b94e
#include "nsPIDOMWindow.h"
Packit f0b94e
#include "nsWeakReference.h"
Packit f0b94e
#include <algorithm>
Packit f0b94e
Packit f0b94e
#if defined(XP_WIN)
Packit f0b94e
// Scroll capture constants
Packit f0b94e
const uint32_t kScrollCaptureFillColor = 0xFFa0a0a0;  // gray
Packit f0b94e
const mozilla::gfx::SurfaceFormat kScrollCaptureFormat =
Packit f0b94e
    mozilla::gfx::SurfaceFormat::X8R8G8B8_UINT32;
Packit f0b94e
#endif
Packit f0b94e
Packit f0b94e
class nsIContent;
Packit f0b94e
class gfxContext;
Packit f0b94e
Packit f0b94e
namespace mozilla {
Packit f0b94e
class CompositorVsyncDispatcher;
Packit f0b94e
class LiveResizeListener;
Packit f0b94e
Packit f0b94e
#ifdef ACCESSIBILITY
Packit f0b94e
namespace a11y {
Packit f0b94e
class Accessible;
Packit f0b94e
}
Packit f0b94e
#endif
Packit f0b94e
Packit f0b94e
namespace gfx {
Packit f0b94e
class DrawTarget;
Packit f0b94e
class SourceSurface;
Packit f0b94e
}  // namespace gfx
Packit f0b94e
Packit f0b94e
namespace layers {
Packit f0b94e
class BasicLayerManager;
Packit f0b94e
class CompositorBridgeChild;
Packit f0b94e
class CompositorBridgeParent;
Packit f0b94e
class IAPZCTreeManager;
Packit f0b94e
class GeckoContentController;
Packit f0b94e
class APZEventState;
Packit f0b94e
class CompositorSession;
Packit f0b94e
class ImageContainer;
Packit f0b94e
struct ScrollableLayerGuid;
Packit f0b94e
class RemoteCompositorSession;
Packit f0b94e
}  // namespace layers
Packit f0b94e
Packit f0b94e
namespace widget {
Packit f0b94e
class CompositorWidgetDelegate;
Packit f0b94e
class InProcessCompositorWidget;
Packit f0b94e
class WidgetRenderingContext;
Packit f0b94e
}  // namespace widget
Packit f0b94e
Packit f0b94e
class CompositorVsyncDispatcher;
Packit f0b94e
}  // namespace mozilla
Packit f0b94e
Packit f0b94e
namespace base {
Packit f0b94e
class Thread;
Packit f0b94e
}  // namespace base
Packit f0b94e
Packit f0b94e
// Windows specific constant indicating the maximum number of touch points the
Packit f0b94e
// inject api will allow. This also sets the maximum numerical value for touch
Packit f0b94e
// ids we can use when injecting touch points on Windows.
Packit f0b94e
#define TOUCH_INJECT_MAX_POINTS 256
Packit f0b94e
Packit f0b94e
class nsBaseWidget;
Packit f0b94e
Packit f0b94e
// Helper class used in shutting down gfx related code.
Packit f0b94e
class WidgetShutdownObserver final : public nsIObserver {
Packit f0b94e
  ~WidgetShutdownObserver();
Packit f0b94e
Packit f0b94e
 public:
Packit f0b94e
  explicit WidgetShutdownObserver(nsBaseWidget* aWidget);
Packit f0b94e
Packit f0b94e
  NS_DECL_ISUPPORTS
Packit f0b94e
  NS_DECL_NSIOBSERVER
Packit f0b94e
Packit f0b94e
  void Register();
Packit f0b94e
  void Unregister();
Packit f0b94e
Packit f0b94e
  nsBaseWidget* mWidget;
Packit f0b94e
  bool mRegistered;
Packit f0b94e
};
Packit f0b94e
Packit f0b94e
/**
Packit f0b94e
 * Common widget implementation used as base class for native
Packit f0b94e
 * or crossplatform implementations of Widgets.
Packit f0b94e
 * All cross-platform behavior that all widgets need to implement
Packit f0b94e
 * should be placed in this class.
Packit f0b94e
 * (Note: widget implementations are not required to use this
Packit f0b94e
 * class, but it gives them a head start.)
Packit f0b94e
 */
Packit f0b94e
Packit f0b94e
class nsBaseWidget : public nsIWidget, public nsSupportsWeakReference {
Packit f0b94e
  friend class DispatchWheelEventOnMainThread;
Packit f0b94e
  friend class mozilla::widget::InProcessCompositorWidget;
Packit f0b94e
  friend class mozilla::layers::RemoteCompositorSession;
Packit f0b94e
Packit f0b94e
 protected:
Packit f0b94e
  typedef base::Thread Thread;
Packit f0b94e
  typedef mozilla::gfx::DrawTarget DrawTarget;
Packit f0b94e
  typedef mozilla::gfx::SourceSurface SourceSurface;
Packit f0b94e
  typedef mozilla::layers::BasicLayerManager BasicLayerManager;
Packit f0b94e
  typedef mozilla::layers::BufferMode BufferMode;
Packit f0b94e
  typedef mozilla::layers::CompositorBridgeChild CompositorBridgeChild;
Packit f0b94e
  typedef mozilla::layers::CompositorBridgeParent CompositorBridgeParent;
Packit f0b94e
  typedef mozilla::layers::IAPZCTreeManager IAPZCTreeManager;
Packit f0b94e
  typedef mozilla::layers::GeckoContentController GeckoContentController;
Packit f0b94e
  typedef mozilla::layers::ScrollableLayerGuid ScrollableLayerGuid;
Packit f0b94e
  typedef mozilla::layers::APZEventState APZEventState;
Packit f0b94e
  typedef mozilla::layers::SetAllowedTouchBehaviorCallback
Packit f0b94e
      SetAllowedTouchBehaviorCallback;
Packit f0b94e
  typedef mozilla::CSSIntRect CSSIntRect;
Packit f0b94e
  typedef mozilla::CSSRect CSSRect;
Packit f0b94e
  typedef mozilla::ScreenRotation ScreenRotation;
Packit f0b94e
  typedef mozilla::widget::CompositorWidgetDelegate CompositorWidgetDelegate;
Packit f0b94e
  typedef mozilla::layers::CompositorSession CompositorSession;
Packit f0b94e
  typedef mozilla::layers::ImageContainer ImageContainer;
Packit f0b94e
Packit f0b94e
  virtual ~nsBaseWidget();
Packit f0b94e
Packit f0b94e
 public:
Packit f0b94e
  nsBaseWidget();
Packit f0b94e
Packit f0b94e
  NS_DECL_ISUPPORTS
Packit f0b94e
Packit f0b94e
  // nsIWidget interface
Packit f0b94e
  virtual void CaptureMouse(bool aCapture) override {}
Packit f0b94e
  virtual void CaptureRollupEvents(nsIRollupListener* aListener,
Packit f0b94e
                                   bool aDoCapture) override {}
Packit f0b94e
  virtual nsIWidgetListener* GetWidgetListener() override;
Packit f0b94e
  virtual void SetWidgetListener(nsIWidgetListener* alistener) override;
Packit f0b94e
  virtual void Destroy() override;
Packit f0b94e
  virtual void SetParent(nsIWidget* aNewParent) override{};
Packit f0b94e
  virtual nsIWidget* GetParent(void) override;
Packit f0b94e
  virtual nsIWidget* GetTopLevelWidget() override;
Packit f0b94e
  virtual nsIWidget* GetSheetWindowParent(void) override;
Packit f0b94e
  virtual float GetDPI() override;
Packit f0b94e
  virtual void AddChild(nsIWidget* aChild) override;
Packit f0b94e
  virtual void RemoveChild(nsIWidget* aChild) override;
Packit f0b94e
Packit f0b94e
  void SetZIndex(int32_t aZIndex) override;
Packit f0b94e
  virtual void PlaceBehind(nsTopLevelWidgetZPlacement aPlacement,
Packit f0b94e
                           nsIWidget* aWidget, bool aActivate) override {}
Packit f0b94e
Packit f0b94e
  virtual void SetSizeMode(nsSizeMode aMode) override;
Packit f0b94e
  virtual nsSizeMode SizeMode() override { return mSizeMode; }
Packit f0b94e
Packit f0b94e
  virtual bool IsFullyOccluded() const override { return mIsFullyOccluded; }
Packit f0b94e
Packit f0b94e
  virtual void SetCursor(nsCursor aCursor) override;
Packit f0b94e
  virtual nsresult SetCursor(imgIContainer* aCursor, uint32_t aHotspotX,
Packit f0b94e
                             uint32_t aHotspotY) override;
Packit f0b94e
  virtual void ClearCachedCursor() override { mUpdateCursor = true; }
Packit f0b94e
  virtual void SetTransparencyMode(nsTransparencyMode aMode) override;
Packit f0b94e
  virtual nsTransparencyMode GetTransparencyMode() override;
Packit f0b94e
  virtual void GetWindowClipRegion(
Packit f0b94e
      nsTArray<LayoutDeviceIntRect>* aRects) override;
Packit f0b94e
  virtual void SetWindowShadowStyle(int32_t aStyle) override {}
Packit f0b94e
  virtual void SetShowsToolbarButton(bool aShow) override {}
Packit f0b94e
  virtual void SetShowsFullScreenButton(bool aShow) override {}
Packit f0b94e
  virtual void SetWindowAnimationType(WindowAnimationType aType) override {}
Packit f0b94e
  virtual void HideWindowChrome(bool aShouldHide) override {}
Packit f0b94e
  virtual bool PrepareForFullscreenTransition(nsISupports** aData) override {
Packit f0b94e
    return false;
Packit f0b94e
  }
Packit f0b94e
  virtual void PerformFullscreenTransition(FullscreenTransitionStage aStage,
Packit f0b94e
                                           uint16_t aDuration,
Packit f0b94e
                                           nsISupports* aData,
Packit f0b94e
                                           nsIRunnable* aCallback) override;
Packit f0b94e
  virtual void CleanupFullscreenTransition() override{};
Packit f0b94e
  virtual already_AddRefed<nsIScreen> GetWidgetScreen() override;
Packit f0b94e
  virtual nsresult MakeFullScreen(bool aFullScreen,
Packit f0b94e
                                  nsIScreen* aScreen = nullptr) override;
Packit f0b94e
  void InfallibleMakeFullScreen(bool aFullScreen, nsIScreen* aScreen = nullptr);
Packit f0b94e
Packit f0b94e
  virtual LayerManager* GetLayerManager(
Packit f0b94e
      PLayerTransactionChild* aShadowManager = nullptr,
Packit f0b94e
      LayersBackend aBackendHint = mozilla::layers::LayersBackend::LAYERS_NONE,
Packit f0b94e
      LayerManagerPersistence aPersistence = LAYER_MANAGER_CURRENT) override;
Packit f0b94e
Packit f0b94e
  // A remote compositor session tied to this window has been lost and IPC
Packit f0b94e
  // messages will no longer work. The widget must clean up any lingering
Packit f0b94e
  // resources and possibly schedule another paint.
Packit f0b94e
  //
Packit f0b94e
  // A reference to the session object is held until this function has
Packit f0b94e
  // returned.
Packit f0b94e
  void NotifyCompositorSessionLost(
Packit f0b94e
      mozilla::layers::CompositorSession* aSession);
Packit f0b94e
Packit f0b94e
  already_AddRefed<mozilla::CompositorVsyncDispatcher>
Packit f0b94e
  GetCompositorVsyncDispatcher();
Packit f0b94e
  void CreateCompositorVsyncDispatcher();
Packit f0b94e
  virtual void CreateCompositor();
Packit f0b94e
  virtual void CreateCompositor(int aWidth, int aHeight);
Packit f0b94e
  virtual void SetCompositorWidgetDelegate(CompositorWidgetDelegate* delegate) {
Packit f0b94e
  }
Packit f0b94e
  virtual void PrepareWindowEffects() override {}
Packit f0b94e
  virtual void UpdateThemeGeometries(
Packit f0b94e
      const nsTArray<ThemeGeometry>& aThemeGeometries) override {}
Packit f0b94e
  virtual void SetModal(bool aModal) override {}
Packit f0b94e
  virtual uint32_t GetMaxTouchPoints() const override;
Packit f0b94e
  virtual void SetWindowClass(const nsAString& xulWinType) override {}
Packit f0b94e
  virtual nsresult SetWindowClipRegion(
Packit f0b94e
      const nsTArray<LayoutDeviceIntRect>& aRects,
Packit f0b94e
      bool aIntersectWithExisting) override;
Packit f0b94e
  // Return whether this widget interprets parameters to Move and Resize APIs
Packit f0b94e
  // as "desktop pixels" rather than "device pixels", and therefore
Packit f0b94e
  // applies its GetDefaultScale() value to them before using them as mBounds
Packit f0b94e
  // etc (which are always stored in device pixels).
Packit f0b94e
  // Note that APIs that -get- the widget's position/size/bounds, rather than
Packit f0b94e
  // -setting- them (i.e. moving or resizing the widget) will always return
Packit f0b94e
  // values in the widget's device pixels.
Packit f0b94e
  bool BoundsUseDesktopPixels() const {
Packit f0b94e
    return mWindowType <= eWindowType_popup;
Packit f0b94e
  }
Packit f0b94e
  // Default implementation, to be overridden by platforms where desktop coords
Packit f0b94e
  // are virtualized and may not correspond to device pixels on the screen.
Packit f0b94e
  mozilla::DesktopToLayoutDeviceScale GetDesktopToDeviceScale() override {
Packit f0b94e
    return mozilla::DesktopToLayoutDeviceScale(1.0);
Packit f0b94e
  }
Packit f0b94e
  virtual void ConstrainPosition(bool aAllowSlop, int32_t* aX,
Packit f0b94e
                                 int32_t* aY) override {}
Packit f0b94e
  virtual void MoveClient(double aX, double aY) override;
Packit f0b94e
  virtual void ResizeClient(double aWidth, double aHeight,
Packit f0b94e
                            bool aRepaint) override;
Packit f0b94e
  virtual void ResizeClient(double aX, double aY, double aWidth, double aHeight,
Packit f0b94e
                            bool aRepaint) override;
Packit f0b94e
  virtual LayoutDeviceIntRect GetBounds() override;
Packit f0b94e
  virtual LayoutDeviceIntRect GetClientBounds() override;
Packit f0b94e
  virtual LayoutDeviceIntRect GetScreenBounds() override;
Packit f0b94e
  virtual MOZ_MUST_USE nsresult
Packit f0b94e
  GetRestoredBounds(LayoutDeviceIntRect& aRect) override;
Packit f0b94e
  virtual nsresult SetNonClientMargins(
Packit f0b94e
      LayoutDeviceIntMargin& aMargins) override;
Packit f0b94e
  virtual LayoutDeviceIntPoint GetClientOffset() override;
Packit f0b94e
  virtual void EnableDragDrop(bool aEnable) override{};
Packit f0b94e
  virtual nsresult AsyncEnableDragDrop(bool aEnable) override;
Packit f0b94e
  virtual MOZ_MUST_USE nsresult GetAttention(int32_t aCycleCount) override {
Packit f0b94e
    return NS_OK;
Packit f0b94e
  }
Packit f0b94e
  virtual bool HasPendingInputEvent() override;
Packit f0b94e
  virtual void SetIcon(const nsAString& aIconSpec) override {}
Packit f0b94e
  virtual void SetWindowTitlebarColor(nscolor aColor, bool aActive) override {}
Packit f0b94e
  virtual void SetDrawsInTitlebar(bool aState) override {}
Packit f0b94e
  virtual bool ShowsResizeIndicator(LayoutDeviceIntRect* aResizerRect) override;
Packit f0b94e
  virtual void FreeNativeData(void* data, uint32_t aDataType) override {}
Packit f0b94e
  virtual MOZ_MUST_USE nsresult BeginResizeDrag(mozilla::WidgetGUIEvent* aEvent,
Packit f0b94e
                                                int32_t aHorizontal,
Packit f0b94e
                                                int32_t aVertical) override {
Packit f0b94e
    return NS_ERROR_NOT_IMPLEMENTED;
Packit f0b94e
  }
Packit f0b94e
  virtual MOZ_MUST_USE nsresult
Packit f0b94e
  BeginMoveDrag(mozilla::WidgetMouseEvent* aEvent) override {
Packit f0b94e
    return NS_ERROR_NOT_IMPLEMENTED;
Packit f0b94e
  }
Packit f0b94e
  virtual nsresult ActivateNativeMenuItemAt(
Packit f0b94e
      const nsAString& indexString) override {
Packit f0b94e
    return NS_ERROR_NOT_IMPLEMENTED;
Packit f0b94e
  }
Packit f0b94e
  virtual nsresult ForceUpdateNativeMenuAt(
Packit f0b94e
      const nsAString& indexString) override {
Packit f0b94e
    return NS_ERROR_NOT_IMPLEMENTED;
Packit f0b94e
  }
Packit f0b94e
  nsresult NotifyIME(const IMENotification& aIMENotification) final;
Packit f0b94e
  virtual MOZ_MUST_USE nsresult StartPluginIME(
Packit f0b94e
      const mozilla::WidgetKeyboardEvent& aKeyboardEvent, int32_t aPanelX,
Packit f0b94e
      int32_t aPanelY, nsString& aCommitted) override {
Packit f0b94e
    return NS_ERROR_NOT_IMPLEMENTED;
Packit f0b94e
  }
Packit f0b94e
  virtual void SetPluginFocused(bool& aFocused) override {}
Packit f0b94e
  virtual void SetCandidateWindowForPlugin(
Packit f0b94e
      const mozilla::widget::CandidateWindowPosition& aPosition) override {}
Packit f0b94e
  virtual void DefaultProcOfPluginEvent(
Packit f0b94e
      const mozilla::WidgetPluginEvent& aEvent) override {}
Packit f0b94e
  virtual MOZ_MUST_USE nsresult
Packit f0b94e
  AttachNativeKeyEvent(mozilla::WidgetKeyboardEvent& aEvent) override {
Packit f0b94e
    return NS_ERROR_NOT_IMPLEMENTED;
Packit f0b94e
  }
Packit f0b94e
  bool ComputeShouldAccelerate();
Packit f0b94e
  virtual bool WidgetTypeSupportsAcceleration() { return true; }
Packit f0b94e
  virtual MOZ_MUST_USE nsresult
Packit f0b94e
  OnDefaultButtonLoaded(const LayoutDeviceIntRect& aButtonRect) override {
Packit f0b94e
    return NS_ERROR_NOT_IMPLEMENTED;
Packit f0b94e
  }
Packit f0b94e
  virtual already_AddRefed<nsIWidget> CreateChild(
Packit f0b94e
      const LayoutDeviceIntRect& aRect, nsWidgetInitData* aInitData = nullptr,
Packit f0b94e
      bool aForceUseIWidgetParent = false) override;
Packit f0b94e
  virtual void AttachViewToTopLevel(bool aUseAttachedEvents) override;
Packit f0b94e
  virtual nsIWidgetListener* GetAttachedWidgetListener() override;
Packit f0b94e
  virtual void SetAttachedWidgetListener(nsIWidgetListener* aListener) override;
Packit f0b94e
  virtual nsIWidgetListener* GetPreviouslyAttachedWidgetListener() override;
Packit f0b94e
  virtual void SetPreviouslyAttachedWidgetListener(
Packit f0b94e
      nsIWidgetListener* aListener) override;
Packit f0b94e
  TextEventDispatcher* GetTextEventDispatcher() final;
Packit f0b94e
  virtual TextEventDispatcherListener* GetNativeTextEventDispatcherListener()
Packit f0b94e
      override;
Packit f0b94e
  virtual void ZoomToRect(const uint32_t& aPresShellId,
Packit f0b94e
                          const FrameMetrics::ViewID& aViewId,
Packit f0b94e
                          const CSSRect& aRect,
Packit f0b94e
                          const uint32_t& aFlags) override;
Packit f0b94e
  // Dispatch an event that must be first be routed through APZ.
Packit f0b94e
  nsEventStatus DispatchInputEvent(mozilla::WidgetInputEvent* aEvent) override;
Packit f0b94e
  void DispatchEventToAPZOnly(mozilla::WidgetInputEvent* aEvent) override;
Packit f0b94e
Packit f0b94e
  void SetConfirmedTargetAPZC(
Packit f0b94e
      uint64_t aInputBlockId,
Packit f0b94e
      const nsTArray<ScrollableLayerGuid>& aTargets) const override;
Packit f0b94e
Packit f0b94e
  void UpdateZoomConstraints(
Packit f0b94e
      const uint32_t& aPresShellId, const FrameMetrics::ViewID& aViewId,
Packit f0b94e
      const mozilla::Maybe<ZoomConstraints>& aConstraints) override;
Packit f0b94e
Packit f0b94e
  bool AsyncPanZoomEnabled() const override;
Packit f0b94e
Packit f0b94e
  void NotifyWindowDestroyed();
Packit f0b94e
  void NotifySizeMoveDone();
Packit f0b94e
  void NotifyWindowMoved(int32_t aX, int32_t aY);
Packit f0b94e
Packit f0b94e
  // Register plugin windows for remote updates from the compositor
Packit f0b94e
  virtual void RegisterPluginWindowForRemoteUpdates() override;
Packit f0b94e
  virtual void UnregisterPluginWindowForRemoteUpdates() override;
Packit f0b94e
Packit f0b94e
  virtual void SetNativeData(uint32_t aDataType, uintptr_t aVal) override{};
Packit f0b94e
Packit f0b94e
  // Should be called by derived implementations to notify on system color and
Packit f0b94e
  // theme changes.
Packit f0b94e
  void NotifySysColorChanged();
Packit f0b94e
  void NotifyThemeChanged();
Packit f0b94e
  void NotifyUIStateChanged(UIStateChangeType aShowAccelerators,
Packit f0b94e
                            UIStateChangeType aShowFocusRings);
Packit f0b94e
Packit f0b94e
#ifdef ACCESSIBILITY
Packit f0b94e
  // Get the accessible for the window.
Packit f0b94e
  mozilla::a11y::Accessible* GetRootAccessible();
Packit f0b94e
#endif
Packit f0b94e
Packit f0b94e
  // Return true if this is a simple widget (that is typically not worth
Packit f0b94e
  // accelerating)
Packit f0b94e
  bool IsSmallPopup() const;
Packit f0b94e
Packit f0b94e
  nsPopupLevel PopupLevel() { return mPopupLevel; }
Packit f0b94e
Packit f0b94e
  virtual LayoutDeviceIntSize ClientToWindowSize(
Packit f0b94e
      const LayoutDeviceIntSize& aClientSize) override {
Packit f0b94e
    return aClientSize;
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  // return true if this is a popup widget with a native titlebar
Packit f0b94e
  bool IsPopupWithTitleBar() const {
Packit f0b94e
    return (mWindowType == eWindowType_popup &&
Packit f0b94e
            mBorderStyle != eBorderStyle_default &&
Packit f0b94e
            mBorderStyle & eBorderStyle_title);
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  virtual void ReparentNativeWidget(nsIWidget* aNewParent) override {}
Packit f0b94e
Packit f0b94e
  virtual const SizeConstraints GetSizeConstraints() override;
Packit f0b94e
  virtual void SetSizeConstraints(const SizeConstraints& aConstraints) override;
Packit f0b94e
Packit f0b94e
  virtual void StartAsyncScrollbarDrag(
Packit f0b94e
      const AsyncDragMetrics& aDragMetrics) override;
Packit f0b94e
Packit f0b94e
  virtual bool StartAsyncAutoscroll(const ScreenPoint& aAnchorLocation,
Packit f0b94e
                                    const ScrollableLayerGuid& aGuid) override;
Packit f0b94e
Packit f0b94e
  virtual void StopAsyncAutoscroll(const ScrollableLayerGuid& aGuid) override;
Packit f0b94e
Packit f0b94e
  /**
Packit f0b94e
   * Use this when GetLayerManager() returns a BasicLayerManager
Packit f0b94e
   * (nsBaseWidget::GetLayerManager() does). This sets up the widget's
Packit f0b94e
   * layer manager to temporarily render into aTarget.
Packit f0b94e
   *
Packit f0b94e
   * |aNaturalWidgetBounds| is the un-rotated bounds of |aWidget|.
Packit f0b94e
   * |aRotation| is the "virtual rotation" to apply when rendering to
Packit f0b94e
   * the target.  When |aRotation| is ROTATION_0,
Packit f0b94e
   * |aNaturalWidgetBounds| is not used.
Packit f0b94e
   */
Packit f0b94e
  class AutoLayerManagerSetup {
Packit f0b94e
   public:
Packit f0b94e
    AutoLayerManagerSetup(nsBaseWidget* aWidget, gfxContext* aTarget,
Packit f0b94e
                          BufferMode aDoubleBuffering,
Packit f0b94e
                          ScreenRotation aRotation = mozilla::ROTATION_0);
Packit f0b94e
    ~AutoLayerManagerSetup();
Packit f0b94e
Packit f0b94e
   private:
Packit f0b94e
    nsBaseWidget* mWidget;
Packit f0b94e
    RefPtr<BasicLayerManager> mLayerManager;
Packit f0b94e
  };
Packit f0b94e
  friend class AutoLayerManagerSetup;
Packit f0b94e
Packit f0b94e
  virtual bool ShouldUseOffMainThreadCompositing();
Packit f0b94e
Packit f0b94e
  static nsIRollupListener* GetActiveRollupListener();
Packit f0b94e
Packit f0b94e
  void Shutdown();
Packit f0b94e
Packit f0b94e
#if defined(XP_WIN)
Packit f0b94e
  uint64_t CreateScrollCaptureContainer() override;
Packit f0b94e
#endif
Packit f0b94e
Packit f0b94e
  // These functions should be called at the start and end of a "live" widget
Packit f0b94e
  // resize (i.e. when the window contents are repainting during the resize,
Packit f0b94e
  // such as when the user drags a window border). It will suppress the
Packit f0b94e
  // displayport during the live resize to avoid unneccessary overpainting.
Packit f0b94e
  void NotifyLiveResizeStarted();
Packit f0b94e
  void NotifyLiveResizeStopped();
Packit f0b94e
Packit f0b94e
#if defined(MOZ_WIDGET_ANDROID)
Packit f0b94e
  void RecvToolbarAnimatorMessageFromCompositor(int32_t) override{};
Packit f0b94e
  void UpdateRootFrameMetrics(const ScreenPoint& aScrollOffset,
Packit f0b94e
                              const CSSToScreenScale& aZoom) override{};
Packit f0b94e
  void RecvScreenPixels(mozilla::ipc::Shmem&& aMem,
Packit f0b94e
                        const ScreenIntSize& aSize) override{};
Packit f0b94e
#endif
Packit f0b94e
Packit f0b94e
  /**
Packit f0b94e
   * Whether context menus should only appear on mouseup instead of mousedown,
Packit f0b94e
   * on OSes where they normally appear on mousedown (macOS, *nix).
Packit f0b94e
   */
Packit f0b94e
  static bool ShowContextMenuAfterMouseUp();
Packit f0b94e
Packit f0b94e
 protected:
Packit f0b94e
  // These are methods for CompositorWidgetWrapper, and should only be
Packit f0b94e
  // accessed from that class. Derived widgets can choose which methods to
Packit f0b94e
  // implement, or none if supporting out-of-process compositing.
Packit f0b94e
  virtual bool PreRender(mozilla::widget::WidgetRenderingContext* aContext) {
Packit f0b94e
    return true;
Packit f0b94e
  }
Packit f0b94e
  virtual void PostRender(mozilla::widget::WidgetRenderingContext* aContext) {}
Packit f0b94e
  virtual void DrawWindowUnderlay(
Packit f0b94e
      mozilla::widget::WidgetRenderingContext* aContext,
Packit f0b94e
      LayoutDeviceIntRect aRect) {}
Packit f0b94e
  virtual void DrawWindowOverlay(
Packit f0b94e
      mozilla::widget::WidgetRenderingContext* aContext,
Packit f0b94e
      LayoutDeviceIntRect aRect) {}
Packit f0b94e
  virtual already_AddRefed<DrawTarget> StartRemoteDrawing();
Packit f0b94e
  virtual already_AddRefed<DrawTarget> StartRemoteDrawingInRegion(
Packit f0b94e
      LayoutDeviceIntRegion& aInvalidRegion, BufferMode* aBufferMode) {
Packit f0b94e
    return StartRemoteDrawing();
Packit f0b94e
  }
Packit f0b94e
  virtual void EndRemoteDrawing() {}
Packit f0b94e
  virtual void EndRemoteDrawingInRegion(DrawTarget* aDrawTarget,
Packit f0b94e
                                        LayoutDeviceIntRegion& aInvalidRegion) {
Packit f0b94e
    EndRemoteDrawing();
Packit f0b94e
  }
Packit f0b94e
  virtual void CleanupRemoteDrawing() {}
Packit f0b94e
  virtual void CleanupWindowEffects() {}
Packit f0b94e
  virtual bool InitCompositor(mozilla::layers::Compositor* aCompositor) {
Packit f0b94e
    return true;
Packit f0b94e
  }
Packit f0b94e
  virtual uint32_t GetGLFrameBufferFormat();
Packit f0b94e
Packit f0b94e
 protected:
Packit f0b94e
  void ResolveIconName(const nsAString& aIconName, const nsAString& aIconSuffix,
Packit f0b94e
                       nsIFile** aResult);
Packit f0b94e
  virtual void OnDestroy();
Packit f0b94e
  void BaseCreate(nsIWidget* aParent, nsWidgetInitData* aInitData);
Packit f0b94e
Packit f0b94e
  virtual void ConfigureAPZCTreeManager();
Packit f0b94e
  virtual void ConfigureAPZControllerThread();
Packit f0b94e
  virtual already_AddRefed<GeckoContentController>
Packit f0b94e
  CreateRootContentController();
Packit f0b94e
Packit f0b94e
  // Dispatch an event that has already been routed through APZ.
Packit f0b94e
  nsEventStatus ProcessUntransformedAPZEvent(mozilla::WidgetInputEvent* aEvent,
Packit f0b94e
                                             const ScrollableLayerGuid& aGuid,
Packit f0b94e
                                             uint64_t aInputBlockId,
Packit f0b94e
                                             nsEventStatus aApzResponse);
Packit f0b94e
Packit f0b94e
  const LayoutDeviceIntRegion RegionFromArray(
Packit f0b94e
      const nsTArray<LayoutDeviceIntRect>& aRects);
Packit f0b94e
  void ArrayFromRegion(const LayoutDeviceIntRegion& aRegion,
Packit f0b94e
                       nsTArray<LayoutDeviceIntRect>& aRects);
Packit f0b94e
Packit f0b94e
  virtual nsresult SynthesizeNativeKeyEvent(
Packit f0b94e
      int32_t aNativeKeyboardLayout, int32_t aNativeKeyCode,
Packit f0b94e
      uint32_t aModifierFlags, const nsAString& aCharacters,
Packit f0b94e
      const nsAString& aUnmodifiedCharacters, nsIObserver* aObserver) override {
Packit f0b94e
    mozilla::widget::AutoObserverNotifier notifier(aObserver, "keyevent");
Packit f0b94e
    return NS_ERROR_UNEXPECTED;
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  virtual nsresult SynthesizeNativeMouseEvent(LayoutDeviceIntPoint aPoint,
Packit f0b94e
                                              uint32_t aNativeMessage,
Packit f0b94e
                                              uint32_t aModifierFlags,
Packit f0b94e
                                              nsIObserver* aObserver) override {
Packit f0b94e
    mozilla::widget::AutoObserverNotifier notifier(aObserver, "mouseevent");
Packit f0b94e
    return NS_ERROR_UNEXPECTED;
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  virtual nsresult SynthesizeNativeMouseMove(LayoutDeviceIntPoint aPoint,
Packit f0b94e
                                             nsIObserver* aObserver) override {
Packit f0b94e
    mozilla::widget::AutoObserverNotifier notifier(aObserver, "mouseevent");
Packit f0b94e
    return NS_ERROR_UNEXPECTED;
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  virtual nsresult SynthesizeNativeMouseScrollEvent(
Packit f0b94e
      LayoutDeviceIntPoint aPoint, uint32_t aNativeMessage, double aDeltaX,
Packit f0b94e
      double aDeltaY, double aDeltaZ, uint32_t aModifierFlags,
Packit f0b94e
      uint32_t aAdditionalFlags, nsIObserver* aObserver) override {
Packit f0b94e
    mozilla::widget::AutoObserverNotifier notifier(aObserver,
Packit f0b94e
                                                   "mousescrollevent");
Packit f0b94e
    return NS_ERROR_UNEXPECTED;
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  virtual nsresult SynthesizeNativeTouchPoint(uint32_t aPointerId,
Packit f0b94e
                                              TouchPointerState aPointerState,
Packit f0b94e
                                              LayoutDeviceIntPoint aPoint,
Packit f0b94e
                                              double aPointerPressure,
Packit f0b94e
                                              uint32_t aPointerOrientation,
Packit f0b94e
                                              nsIObserver* aObserver) override {
Packit f0b94e
    mozilla::widget::AutoObserverNotifier notifier(aObserver, "touchpoint");
Packit f0b94e
    return NS_ERROR_UNEXPECTED;
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  /**
Packit f0b94e
   * GetPseudoIMEContext() returns pseudo IME context when TextEventDispatcher
Packit f0b94e
   * has non-native input transaction.  Otherwise, returns nullptr.
Packit f0b94e
   */
Packit f0b94e
  void* GetPseudoIMEContext();
Packit f0b94e
Packit f0b94e
 protected:
Packit f0b94e
  // Utility to check if an array of clip rects is equal to our
Packit f0b94e
  // internally stored clip rect array mClipRects.
Packit f0b94e
  bool IsWindowClipRegionEqual(const nsTArray<LayoutDeviceIntRect>& aRects);
Packit f0b94e
Packit f0b94e
  // Stores the clip rectangles in aRects into mClipRects.
Packit f0b94e
  void StoreWindowClipRegion(const nsTArray<LayoutDeviceIntRect>& aRects);
Packit f0b94e
Packit f0b94e
  virtual already_AddRefed<nsIWidget> AllocateChildPopupWidget() {
Packit f0b94e
    static NS_DEFINE_IID(kCPopUpCID, NS_CHILD_CID);
Packit f0b94e
    nsCOMPtr<nsIWidget> widget = do_CreateInstance(kCPopUpCID);
Packit f0b94e
    return widget.forget();
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  LayerManager* CreateBasicLayerManager();
Packit f0b94e
Packit f0b94e
  nsPopupType PopupType() const { return mPopupType; }
Packit f0b94e
Packit f0b94e
  bool HasRemoteContent() const { return mHasRemoteContent; }
Packit f0b94e
Packit f0b94e
  void NotifyRollupGeometryChange() {
Packit f0b94e
    // XULPopupManager isn't interested in this notification, so only
Packit f0b94e
    // send it if gRollupListener is set.
Packit f0b94e
    if (gRollupListener) {
Packit f0b94e
      gRollupListener->NotifyGeometryChange();
Packit f0b94e
    }
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  /**
Packit f0b94e
   * Apply the current size constraints to the given size.
Packit f0b94e
   *
Packit f0b94e
   * @param aWidth width to constrain
Packit f0b94e
   * @param aHeight height to constrain
Packit f0b94e
   */
Packit f0b94e
  void ConstrainSize(int32_t* aWidth, int32_t* aHeight) {
Packit f0b94e
    SizeConstraints c = GetSizeConstraints();
Packit f0b94e
    *aWidth = std::max(c.mMinSize.width, std::min(c.mMaxSize.width, *aWidth));
Packit f0b94e
    *aHeight =
Packit f0b94e
        std::max(c.mMinSize.height, std::min(c.mMaxSize.height, *aHeight));
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  virtual CompositorBridgeChild* GetRemoteRenderer() override;
Packit f0b94e
Packit f0b94e
  /**
Packit f0b94e
   * Notify the widget that this window is being used with OMTC.
Packit f0b94e
   */
Packit f0b94e
  virtual void WindowUsesOMTC() {}
Packit f0b94e
  virtual void RegisterTouchWindow() {}
Packit f0b94e
Packit f0b94e
  nsIDocument* GetDocument() const;
Packit f0b94e
Packit f0b94e
  void EnsureTextEventDispatcher();
Packit f0b94e
Packit f0b94e
  // Notify the compositor that a device reset has occurred.
Packit f0b94e
  void OnRenderingDeviceReset();
Packit f0b94e
Packit f0b94e
  bool UseAPZ();
Packit f0b94e
Packit f0b94e
  bool AllowWebRenderForThisWindow();
Packit f0b94e
Packit f0b94e
  /**
Packit f0b94e
   * For widgets that support synthesizing native touch events, this function
Packit f0b94e
   * can be used to manage the current state of synthetic pointers. Each widget
Packit f0b94e
   * must maintain its own MultiTouchInput instance and pass it in as the state,
Packit f0b94e
   * along with the desired parameters for the changes. This function returns
Packit f0b94e
   * a new MultiTouchInput object that is ready to be dispatched.
Packit f0b94e
   */
Packit f0b94e
  mozilla::MultiTouchInput UpdateSynthesizedTouchState(
Packit f0b94e
      mozilla::MultiTouchInput* aState, uint32_t aTime,
Packit f0b94e
      mozilla::TimeStamp aTimeStamp, uint32_t aPointerId,
Packit f0b94e
      TouchPointerState aPointerState, LayoutDeviceIntPoint aPoint,
Packit f0b94e
      double aPointerPressure, uint32_t aPointerOrientation);
Packit f0b94e
Packit f0b94e
  /**
Packit f0b94e
   * Dispatch the given MultiTouchInput through APZ to Gecko (if APZ is enabled)
Packit f0b94e
   * or directly to gecko (if APZ is not enabled). This function must only
Packit f0b94e
   * be called from the main thread, and if APZ is enabled, that must also be
Packit f0b94e
   * the APZ controller thread.
Packit f0b94e
   */
Packit f0b94e
  void DispatchTouchInput(mozilla::MultiTouchInput& aInput);
Packit f0b94e
Packit f0b94e
#if defined(XP_WIN)
Packit f0b94e
  void UpdateScrollCapture() override;
Packit f0b94e
Packit f0b94e
  /**
Packit f0b94e
   * To be overridden by derived classes to return a snapshot that can be used
Packit f0b94e
   * during scrolling. Returning null means we won't update the container.
Packit f0b94e
   * @return an already AddRefed SourceSurface containing the snapshot
Packit f0b94e
   */
Packit f0b94e
  virtual already_AddRefed<SourceSurface> CreateScrollSnapshot() {
Packit f0b94e
    return nullptr;
Packit f0b94e
  };
Packit f0b94e
Packit f0b94e
  /**
Packit f0b94e
   * Used by derived classes to create a fallback scroll image.
Packit f0b94e
   * @param aSnapshotDrawTarget DrawTarget to fill with fallback image.
Packit f0b94e
   */
Packit f0b94e
  void DefaultFillScrollCapture(DrawTarget* aSnapshotDrawTarget);
Packit f0b94e
Packit f0b94e
  RefPtr<ImageContainer> mScrollCaptureContainer;
Packit f0b94e
#endif
Packit f0b94e
Packit f0b94e
 protected:
Packit f0b94e
  // Returns whether compositing should use an external surface size.
Packit f0b94e
  virtual bool UseExternalCompositingSurface() const { return false; }
Packit f0b94e
Packit f0b94e
  /**
Packit f0b94e
   * Starts the OMTC compositor destruction sequence.
Packit f0b94e
   *
Packit f0b94e
   * When this function returns, the compositor should not be
Packit f0b94e
   * able to access the opengl context anymore.
Packit f0b94e
   * It is safe to call it several times if platform implementations
Packit f0b94e
   * require the compositor to be destroyed before ~nsBaseWidget is
Packit f0b94e
   * reached (This is the case with gtk2 for instance).
Packit f0b94e
   */
Packit f0b94e
  virtual void DestroyCompositor();
Packit f0b94e
  void DestroyLayerManager();
Packit f0b94e
  void ReleaseContentController();
Packit f0b94e
  void RevokeTransactionIdAllocator();
Packit f0b94e
Packit f0b94e
  void FreeShutdownObserver();
Packit f0b94e
Packit f0b94e
  nsIWidgetListener* mWidgetListener;
Packit f0b94e
  nsIWidgetListener* mAttachedWidgetListener;
Packit f0b94e
  nsIWidgetListener* mPreviouslyAttachedWidgetListener;
Packit f0b94e
  RefPtr<LayerManager> mLayerManager;
Packit f0b94e
  RefPtr<CompositorSession> mCompositorSession;
Packit f0b94e
  RefPtr<CompositorBridgeChild> mCompositorBridgeChild;
Packit f0b94e
Packit f0b94e
  mozilla::UniquePtr<mozilla::Mutex> mCompositorVsyncDispatcherLock;
Packit f0b94e
  RefPtr<mozilla::CompositorVsyncDispatcher> mCompositorVsyncDispatcher;
Packit f0b94e
Packit f0b94e
  RefPtr<IAPZCTreeManager> mAPZC;
Packit f0b94e
  RefPtr<GeckoContentController> mRootContentController;
Packit f0b94e
  RefPtr<APZEventState> mAPZEventState;
Packit f0b94e
  SetAllowedTouchBehaviorCallback mSetAllowedTouchBehaviorCallback;
Packit f0b94e
  RefPtr<WidgetShutdownObserver> mShutdownObserver;
Packit f0b94e
  RefPtr<TextEventDispatcher> mTextEventDispatcher;
Packit f0b94e
  nsCursor mCursor;
Packit f0b94e
  nsBorderStyle mBorderStyle;
Packit f0b94e
  LayoutDeviceIntRect mBounds;
Packit f0b94e
  LayoutDeviceIntRect* mOriginalBounds;
Packit f0b94e
  // When this pointer is null, the widget is not clipped
Packit f0b94e
  mozilla::UniquePtr<LayoutDeviceIntRect[]> mClipRects;
Packit f0b94e
  uint32_t mClipRectCount;
Packit f0b94e
  nsSizeMode mSizeMode;
Packit f0b94e
  nsPopupLevel mPopupLevel;
Packit f0b94e
  nsPopupType mPopupType;
Packit f0b94e
  SizeConstraints mSizeConstraints;
Packit f0b94e
  bool mHasRemoteContent;
Packit f0b94e
Packit f0b94e
  bool mUpdateCursor;
Packit f0b94e
  bool mUseAttachedEvents;
Packit f0b94e
  bool mIMEHasFocus;
Packit f0b94e
  bool mIsFullyOccluded;
Packit f0b94e
  static nsIRollupListener* gRollupListener;
Packit f0b94e
Packit f0b94e
  struct InitialZoomConstraints {
Packit f0b94e
    InitialZoomConstraints(const uint32_t& aPresShellID,
Packit f0b94e
                           const FrameMetrics::ViewID& aViewID,
Packit f0b94e
                           const ZoomConstraints& aConstraints)
Packit f0b94e
        : mPresShellID(aPresShellID),
Packit f0b94e
          mViewID(aViewID),
Packit f0b94e
          mConstraints(aConstraints) {}
Packit f0b94e
Packit f0b94e
    uint32_t mPresShellID;
Packit f0b94e
    FrameMetrics::ViewID mViewID;
Packit f0b94e
    ZoomConstraints mConstraints;
Packit f0b94e
  };
Packit f0b94e
Packit f0b94e
  mozilla::Maybe<InitialZoomConstraints> mInitialZoomConstraints;
Packit f0b94e
Packit f0b94e
  // This points to the resize listeners who have been notified that a live
Packit f0b94e
  // resize is in progress. This should always be empty when a live-resize is
Packit f0b94e
  // not in progress.
Packit f0b94e
  nsTArray<RefPtr<mozilla::LiveResizeListener>> mLiveResizeListeners;
Packit f0b94e
Packit f0b94e
#ifdef DEBUG
Packit f0b94e
 protected:
Packit f0b94e
  static nsAutoString debug_GuiEventToString(
Packit f0b94e
      mozilla::WidgetGUIEvent* aGuiEvent);
Packit f0b94e
  static bool debug_WantPaintFlashing();
Packit f0b94e
Packit f0b94e
  static void debug_DumpInvalidate(FILE* aFileOut, nsIWidget* aWidget,
Packit f0b94e
                                   const LayoutDeviceIntRect* aRect,
Packit f0b94e
                                   const char* aWidgetName, int32_t aWindowID);
Packit f0b94e
Packit f0b94e
  static void debug_DumpEvent(FILE* aFileOut, nsIWidget* aWidget,
Packit f0b94e
                              mozilla::WidgetGUIEvent* aGuiEvent,
Packit f0b94e
                              const char* aWidgetName, int32_t aWindowID);
Packit f0b94e
Packit f0b94e
  static void debug_DumpPaintEvent(FILE* aFileOut, nsIWidget* aWidget,
Packit f0b94e
                                   const nsIntRegion& aPaintEvent,
Packit f0b94e
                                   const char* aWidgetName, int32_t aWindowID);
Packit f0b94e
Packit f0b94e
  static bool debug_GetCachedBoolPref(const char* aPrefName);
Packit f0b94e
#endif
Packit f0b94e
Packit f0b94e
 private:
Packit f0b94e
  already_AddRefed<LayerManager> CreateCompositorSession(
Packit f0b94e
      int aWidth, int aHeight, mozilla::layers::CompositorOptions* aOptionsOut);
Packit f0b94e
};
Packit f0b94e
Packit f0b94e
#endif  // nsBaseWidget_h__