Source code

Revision control

Copy as Markdown

Other Tools

/* -*- 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