/* -*- 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_layers_IAPZHitTester_h #define mozilla_layers_IAPZHitTester_h #include "HitTestingTreeNode.h" // for HitTestingTreeNodeAutoLock #include "mozilla/RefPtr.h" #include "mozilla/gfx/CompositorHitTestInfo.h" #include "mozilla/layers/LayersTypes.h" namespace mozilla { namespace layers { class AsyncPanZoomController; class APZCTreeManager; class IAPZHitTester { public: virtual ~IAPZHitTester() = default; // Not a constructor because we want external code to be able to pass a hit // tester to the APZCTreeManager constructor, which will then initialize it. void Initialize(APZCTreeManager* aTreeManager) { mTreeManager = aTreeManager; } // Represents the results of an APZ hit test. struct HitTestResult { // The APZC targeted by the hit test. RefPtr<AsyncPanZoomController> mTargetApzc; // The applicable hit test flags. gfx::CompositorHitTestInfo mHitResult; // The layers id of the content that was hit. // This effectively identifiers the process that was hit for // Fission purposes. LayersId mLayersId; // If a scrollbar was hit, this will be populated with the // scrollbar node. The AutoLock allows accessing the scrollbar // node without having to hold the tree lock. HitTestingTreeNodeAutoLock mScrollbarNode; // If content that is fixed to the root-content APZC was hit, // the sides of the viewport to which the content is fixed. SideBits mFixedPosSides = SideBits::eNone; // If a fixed/sticky position element was hit, this will be populated with // the hit-testing tree node. The AutoLock allows accessing the node // without having to hold the tree lock. HitTestingTreeNodeAutoLock mNode; // This is set to true If mTargetApzc is overscrolled and the // event targeted the gap space ("gutter") created by the overscroll. bool mHitOverscrollGutter = false; HitTestResult() = default; // Make it move-only. HitTestResult(HitTestResult&&) = default; HitTestResult& operator=(HitTestResult&&) = default; }; virtual HitTestResult GetAPZCAtPoint( const ScreenPoint& aHitTestPoint, const RecursiveMutexAutoLock& aProofOfTreeLock) = 0; HitTestResult CloneHitTestResult(RecursiveMutexAutoLock& aProofOfTreeLock, const HitTestResult& aHitTestResult) const; protected: APZCTreeManager* mTreeManager = nullptr; // We are a friend of APZCTreeManager but our derived classes // are not. Wrap a few private members of APZCTreeManager for // use by derived classes. RecursiveMutex& GetTreeLock(); LayersId GetRootLayersId() const; HitTestingTreeNode* GetRootNode() const; HitTestingTreeNode* FindRootNodeForLayersId(LayersId aLayersId) const; AsyncPanZoomController* FindRootApzcForLayersId(LayersId aLayersId) const; already_AddRefed<HitTestingTreeNode> GetTargetNode( const ScrollableLayerGuid& aGuid, ScrollableLayerGuid::Comparator aComparator); void InitializeHitTestingTreeNodeAutoLock( HitTestingTreeNodeAutoLock& aAutoLock, const RecursiveMutexAutoLock& aProofOfTreeLock, RefPtr<HitTestingTreeNode>& aNode) const; }; } // namespace layers } // namespace mozilla #endif // mozilla_layers_IAPZHitTester_h