IAPZHitTester.cpp (2873B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 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/. */ 6 7 #include "IAPZHitTester.h" 8 #include "APZCTreeManager.h" 9 #include "AsyncPanZoomController.h" 10 11 namespace mozilla { 12 namespace layers { 13 14 IAPZHitTester::HitTestResult IAPZHitTester::CloneHitTestResult( 15 RecursiveMutexAutoLock& aProofOfTreeLock, 16 const IAPZHitTester::HitTestResult& aHitTestResult) const { 17 HitTestResult result; 18 19 result.mTargetApzc = aHitTestResult.mTargetApzc; 20 result.mHitResult = aHitTestResult.mHitResult; 21 result.mLayersId = aHitTestResult.mLayersId; 22 result.mFixedPosSides = aHitTestResult.mFixedPosSides; 23 result.mHitOverscrollGutter = aHitTestResult.mHitOverscrollGutter; 24 25 RefPtr<HitTestingTreeNode> scrollbarNode = 26 aHitTestResult.mScrollbarNode.Get(aProofOfTreeLock); 27 RefPtr<HitTestingTreeNode> node = aHitTestResult.mNode.Get(aProofOfTreeLock); 28 29 if (aHitTestResult.mScrollbarNode) { 30 InitializeHitTestingTreeNodeAutoLock(result.mScrollbarNode, 31 aProofOfTreeLock, scrollbarNode); 32 } 33 if (aHitTestResult.mNode) { 34 InitializeHitTestingTreeNodeAutoLock(result.mNode, aProofOfTreeLock, node); 35 } 36 37 return result; 38 } 39 40 RecursiveMutex& IAPZHitTester::GetTreeLock() { return mTreeManager->mTreeLock; } 41 42 LayersId IAPZHitTester::GetRootLayersId() const { 43 return mTreeManager->mRootLayersId; 44 } 45 46 HitTestingTreeNode* IAPZHitTester::GetRootNode() const { 47 mTreeManager->mTreeLock.AssertCurrentThreadIn(); 48 return mTreeManager->mRootNode; 49 } 50 51 HitTestingTreeNode* IAPZHitTester::FindRootNodeForLayersId( 52 LayersId aLayersId) const { 53 return mTreeManager->FindRootNodeForLayersId(aLayersId); 54 } 55 56 AsyncPanZoomController* IAPZHitTester::FindRootApzcForLayersId( 57 LayersId aLayersId) const { 58 HitTestingTreeNode* resultNode = FindRootNodeForLayersId(aLayersId); 59 return resultNode ? resultNode->GetApzc() : nullptr; 60 } 61 62 already_AddRefed<HitTestingTreeNode> IAPZHitTester::GetTargetNode( 63 const ScrollableLayerGuid& aGuid, 64 ScrollableLayerGuid::Comparator aComparator) { 65 // Acquire the tree lock so that derived classes can call this from 66 // methods other than GetAPZCAtPoint(). 67 RecursiveMutexAutoLock lock(mTreeManager->mTreeLock); 68 return mTreeManager->GetTargetNode(aGuid, aComparator); 69 } 70 71 void IAPZHitTester::InitializeHitTestingTreeNodeAutoLock( 72 HitTestingTreeNodeAutoLock& aAutoLock, 73 const RecursiveMutexAutoLock& aProofOfTreeLock, 74 RefPtr<HitTestingTreeNode>& aNode) const { 75 aAutoLock.Initialize(aProofOfTreeLock, aNode.forget(), 76 mTreeManager->mTreeLock); 77 } 78 79 } // namespace layers 80 } // namespace mozilla