summaryrefslogtreecommitdiffstats
path: root/widget/android/nsWindow.h
diff options
context:
space:
mode:
Diffstat (limited to 'widget/android/nsWindow.h')
-rw-r--r--widget/android/nsWindow.h289
1 files changed, 289 insertions, 0 deletions
diff --git a/widget/android/nsWindow.h b/widget/android/nsWindow.h
new file mode 100644
index 000000000..f3d7566f7
--- /dev/null
+++ b/widget/android/nsWindow.h
@@ -0,0 +1,289 @@
+/* -*- Mode: c++; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
+ * vim: set sw=4 ts=4 expandtab:
+ * 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 NSWINDOW_H_
+#define NSWINDOW_H_
+
+#include "nsBaseWidget.h"
+#include "gfxPoint.h"
+#include "nsIIdleServiceInternal.h"
+#include "nsTArray.h"
+#include "AndroidJavaWrappers.h"
+#include "GeneratedJNIWrappers.h"
+#include "mozilla/EventForwards.h"
+#include "mozilla/Mutex.h"
+#include "mozilla/StaticPtr.h"
+#include "mozilla/TextRange.h"
+#include "mozilla/UniquePtr.h"
+
+struct ANPEvent;
+
+namespace mozilla {
+ class TextComposition;
+ class WidgetTouchEvent;
+
+ namespace layers {
+ class CompositorBridgeParent;
+ class CompositorBridgeChild;
+ class LayerManager;
+ class APZCTreeManager;
+ }
+}
+
+class nsWindow : public nsBaseWidget
+{
+private:
+ virtual ~nsWindow();
+
+public:
+ using nsBaseWidget::GetLayerManager;
+
+ nsWindow();
+
+ NS_DECL_ISUPPORTS_INHERITED
+
+ static void InitNatives();
+ void SetScreenId(uint32_t aScreenId) { mScreenId = aScreenId; }
+
+private:
+ uint32_t mScreenId;
+
+ // An Event subclass that guards against stale events.
+ template<typename Lambda,
+ bool IsStatic = Lambda::isStatic,
+ typename InstanceType = typename Lambda::ThisArgType,
+ class Impl = typename Lambda::TargetClass>
+ class WindowEvent;
+
+ // Smart pointer for holding a pointer back to the nsWindow inside a native
+ // object class. The nsWindow pointer is automatically cleared when the
+ // nsWindow is destroyed, and a WindowPtr<Impl>::Locked class is provided
+ // for thread-safe access to the nsWindow pointer off of the Gecko thread.
+ template<class Impl> class WindowPtr;
+
+ // Smart pointer for holding a pointer to a native object class. The
+ // pointer is automatically cleared when the object is destroyed.
+ template<class Impl>
+ class NativePtr final
+ {
+ friend WindowPtr<Impl>;
+
+ static const char sName[];
+
+ WindowPtr<Impl>* mPtr;
+ Impl* mImpl;
+ mozilla::Mutex mImplLock;
+
+ public:
+ class Locked;
+
+ NativePtr() : mPtr(nullptr), mImpl(nullptr), mImplLock(sName) {}
+ ~NativePtr() { MOZ_ASSERT(!mPtr); }
+
+ operator Impl*() const
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ return mImpl;
+ }
+
+ Impl* operator->() const { return operator Impl*(); }
+
+ template<class Instance, typename... Args>
+ void Attach(Instance aInstance, nsWindow* aWindow, Args&&... aArgs);
+ void Detach();
+ };
+
+ class LayerViewSupport;
+ // Object that implements native LayerView calls.
+ // Owned by the Java LayerView instance.
+ NativePtr<LayerViewSupport> mLayerViewSupport;
+
+ class NPZCSupport;
+ // Object that implements native NativePanZoomController calls.
+ // Owned by the Java NativePanZoomController instance.
+ NativePtr<NPZCSupport> mNPZCSupport;
+
+ class GeckoViewSupport;
+ // Object that implements native GeckoView calls and associated states.
+ // nullptr for nsWindows that were not opened from GeckoView.
+ // Because other objects get destroyed in the mGeckOViewSupport destructor,
+ // keep it last in the list, so its destructor is called first.
+ mozilla::UniquePtr<GeckoViewSupport> mGeckoViewSupport;
+
+ // Class that implements native PresentationMediaPlayerManager calls.
+ class PMPMSupport;
+
+public:
+ static nsWindow* TopWindow();
+
+ void OnSizeChanged(const mozilla::gfx::IntSize& aSize);
+
+ void InitEvent(mozilla::WidgetGUIEvent& event,
+ LayoutDeviceIntPoint* aPoint = 0);
+
+ void UpdateOverscrollVelocity(const float aX, const float aY);
+ void UpdateOverscrollOffset(const float aX, const float aY);
+ void SetScrollingRootContent(const bool isRootContent);
+
+ //
+ // nsIWidget
+ //
+
+ using nsBaseWidget::Create; // for Create signature not overridden here
+ virtual MOZ_MUST_USE nsresult Create(nsIWidget* aParent,
+ nsNativeWidget aNativeParent,
+ const LayoutDeviceIntRect& aRect,
+ nsWidgetInitData* aInitData) override;
+ virtual void Destroy() override;
+ NS_IMETHOD ConfigureChildren(const nsTArray<nsIWidget::Configuration>&) override;
+ NS_IMETHOD SetParent(nsIWidget* aNewParent) override;
+ virtual nsIWidget *GetParent(void) override;
+ virtual float GetDPI() override;
+ virtual double GetDefaultScaleInternal() override;
+ NS_IMETHOD Show(bool aState) override;
+ virtual bool IsVisible() const override;
+ virtual void ConstrainPosition(bool aAllowSlop,
+ int32_t *aX,
+ int32_t *aY) override;
+ NS_IMETHOD Move(double aX,
+ double aY) override;
+ NS_IMETHOD Resize(double aWidth,
+ double aHeight,
+ bool aRepaint) override;
+ NS_IMETHOD Resize(double aX,
+ double aY,
+ double aWidth,
+ double aHeight,
+ bool aRepaint) override;
+ void SetZIndex(int32_t aZIndex) override;
+ virtual void SetSizeMode(nsSizeMode aMode) override;
+ NS_IMETHOD Enable(bool aState) override;
+ virtual bool IsEnabled() const override;
+ NS_IMETHOD Invalidate(const LayoutDeviceIntRect& aRect) override;
+ NS_IMETHOD SetFocus(bool aRaise = false) override;
+ virtual LayoutDeviceIntRect GetScreenBounds() override;
+ virtual LayoutDeviceIntPoint WidgetToScreenOffset() override;
+ NS_IMETHOD DispatchEvent(mozilla::WidgetGUIEvent* aEvent,
+ nsEventStatus& aStatus) override;
+ nsEventStatus DispatchEvent(mozilla::WidgetGUIEvent* aEvent);
+ virtual already_AddRefed<nsIScreen> GetWidgetScreen() override;
+ virtual nsresult MakeFullScreen(bool aFullScreen,
+ nsIScreen* aTargetScreen = nullptr)
+ override;
+
+ NS_IMETHOD SetCursor(nsCursor aCursor) override { return NS_ERROR_NOT_IMPLEMENTED; }
+ NS_IMETHOD SetCursor(imgIContainer* aCursor,
+ uint32_t aHotspotX,
+ uint32_t aHotspotY) override { return NS_ERROR_NOT_IMPLEMENTED; }
+ NS_IMETHOD SetHasTransparentBackground(bool aTransparent) { return NS_OK; }
+ NS_IMETHOD GetHasTransparentBackground(bool& aTransparent) { aTransparent = false; return NS_OK; }
+ NS_IMETHOD HideWindowChrome(bool aShouldHide) override { return NS_ERROR_NOT_IMPLEMENTED; }
+ void* GetNativeData(uint32_t aDataType) override;
+ void SetNativeData(uint32_t aDataType, uintptr_t aVal) override;
+ NS_IMETHOD SetTitle(const nsAString& aTitle) override { return NS_OK; }
+ NS_IMETHOD SetIcon(const nsAString& aIconSpec) override { return NS_OK; }
+ NS_IMETHOD GetAttention(int32_t aCycleCount) override { return NS_ERROR_NOT_IMPLEMENTED; }
+ NS_IMETHOD BeginResizeDrag(mozilla::WidgetGUIEvent* aEvent,
+ int32_t aHorizontal,
+ int32_t aVertical) override
+ {
+ return NS_ERROR_NOT_IMPLEMENTED;
+ }
+
+ NS_IMETHOD_(void) SetInputContext(const InputContext& aContext,
+ const InputContextAction& aAction) override;
+ NS_IMETHOD_(InputContext) GetInputContext() override;
+ virtual nsIMEUpdatePreference GetIMEUpdatePreference() override;
+
+ void SetSelectionDragState(bool aState);
+ LayerManager* GetLayerManager(PLayerTransactionChild* aShadowManager = nullptr,
+ LayersBackend aBackendHint = mozilla::layers::LayersBackend::LAYERS_NONE,
+ LayerManagerPersistence aPersistence = LAYER_MANAGER_CURRENT) override;
+
+ virtual bool NeedsPaint() override;
+ virtual bool PreRender(mozilla::widget::WidgetRenderingContext* aContext) override;
+ virtual void DrawWindowUnderlay(mozilla::widget::WidgetRenderingContext* aContext,
+ LayoutDeviceIntRect aRect) override;
+ virtual void DrawWindowOverlay(mozilla::widget::WidgetRenderingContext* aContext,
+ LayoutDeviceIntRect aRect) override;
+
+ virtual bool WidgetPaintsBackground() override;
+
+ virtual uint32_t GetMaxTouchPoints() const override;
+
+ void UpdateZoomConstraints(const uint32_t& aPresShellId,
+ const FrameMetrics::ViewID& aViewId,
+ const mozilla::Maybe<ZoomConstraints>& aConstraints) override;
+
+ nsresult SynthesizeNativeTouchPoint(uint32_t aPointerId,
+ TouchPointerState aPointerState,
+ LayoutDeviceIntPoint aPoint,
+ double aPointerPressure,
+ uint32_t aPointerOrientation,
+ nsIObserver* aObserver) override;
+ nsresult SynthesizeNativeMouseEvent(LayoutDeviceIntPoint aPoint,
+ uint32_t aNativeMessage,
+ uint32_t aModifierFlags,
+ nsIObserver* aObserver) override;
+ nsresult SynthesizeNativeMouseMove(LayoutDeviceIntPoint aPoint,
+ nsIObserver* aObserver) override;
+
+ CompositorBridgeParent* GetCompositorBridgeParent() const;
+
+ mozilla::jni::DependentRef<mozilla::java::GeckoLayerClient> GetLayerClient();
+
+protected:
+ void BringToFront();
+ nsWindow *FindTopLevel();
+ bool IsTopLevel();
+
+ RefPtr<mozilla::TextComposition> GetIMEComposition();
+ enum RemoveIMECompositionFlag {
+ CANCEL_IME_COMPOSITION,
+ COMMIT_IME_COMPOSITION
+ };
+ void RemoveIMEComposition(RemoveIMECompositionFlag aFlag = COMMIT_IME_COMPOSITION);
+
+ void ConfigureAPZControllerThread() override;
+ void DispatchHitTest(const mozilla::WidgetTouchEvent& aEvent);
+
+ already_AddRefed<GeckoContentController> CreateRootContentController() override;
+
+ // Call this function when the users activity is the direct cause of an
+ // event (like a keypress or mouse click).
+ void UserActivity();
+
+ bool mIsVisible;
+ nsTArray<nsWindow*> mChildren;
+ nsWindow* mParent;
+
+ double mStartDist;
+ double mLastDist;
+
+ nsCOMPtr<nsIIdleServiceInternal> mIdleService;
+
+ bool mAwaitingFullScreen;
+ bool mIsFullScreen;
+
+ virtual nsresult NotifyIMEInternal(
+ const IMENotification& aIMENotification) override;
+
+ bool UseExternalCompositingSurface() const override {
+ return true;
+ }
+
+ static void DumpWindows();
+ static void DumpWindows(const nsTArray<nsWindow*>& wins, int indent = 0);
+ static void LogWindow(nsWindow *win, int index, int indent);
+
+private:
+ void CreateLayerManager(int aCompositorWidth, int aCompositorHeight);
+ void RedrawAll();
+
+ mozilla::java::LayerRenderer::Frame::GlobalRef mLayerRendererFrame;
+};
+
+#endif /* NSWINDOW_H_ */