tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

CompositorHitTestInfo.h (4544B)


      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 #ifndef MOZILLA_GFX_COMPOSITORHITTESTINFO_H_
      8 #define MOZILLA_GFX_COMPOSITORHITTESTINFO_H_
      9 
     10 #include "mozilla/EnumSet.h"
     11 #include "mozilla/EnumTypeTraits.h"
     12 
     13 namespace mozilla {
     14 namespace gfx {
     15 
     16 // This set of flags is used to figure out what information a frame has
     17 // that is relevant to hit-testing in the compositor. The flags are
     18 // intentionally set up so that if all of them are 0 the item is effectively
     19 // invisible to hit-testing, and no information for this frame needs to be
     20 // sent to the compositor.
     21 // Each enumerator is annotated with the value it contributes to an
     22 // EnumSet (2 ^ <value of enumerator>), in hexadecimal.
     23 enum class CompositorHitTestFlags : uint8_t {
     24  // The frame participates in hit-testing
     25  eVisibleToHitTest = 0,  // 0x0001
     26 
     27  // The frame may have odd shapes that requires the main thread to do accurate
     28  // hit-testing.
     29  eIrregularArea,  // 0x0002
     30  // The frame has APZ-aware listeners and so inputs targeted at this area
     31  // need to be handled by the main thread before APZ can use them, as they
     32  // might be prevent-defaulted.
     33  eApzAwareListeners,  // 0x0004
     34  // This is an inactive scrollframe or unlayerized scrollthumb. In this state
     35  // it cannot be used by APZ for async scrolling, so APZ will defer to the main
     36  // thread.
     37  eInactiveScrollframe,  // 0x0008
     38 
     39  // The touch action flags are set up so that the default of
     40  // touch-action:auto on an element leaves all the flags as 0.
     41  eTouchActionPanXDisabled,           // 0x0010
     42  eTouchActionPanYDisabled,           // 0x0020
     43  eTouchActionPinchZoomDisabled,      // 0x0040
     44  eTouchActionAnimatingZoomDisabled,  // 0x0080
     45 
     46  // The frame is a scrollbar or a subframe inside a scrollbar (including
     47  // scroll thumbs)
     48  eScrollbar,  // 0x0100
     49  // The frame is a scrollthumb. If this is set then eScrollbar will also be
     50  // set, unless gecko somehow generates a scroll thumb without a containing
     51  // scrollbar.
     52  eScrollbarThumb,  // 0x0200
     53  // If eScrollbar is set, this flag indicates if the scrollbar is a vertical
     54  // one (if set) or a horizontal one (if not set)
     55  eScrollbarVertical,  // 0x0400
     56 
     57  // Events targeting this frame should only be processed if a target
     58  // confirmation is received from the main thread. If no such confirmation
     59  // is received within a timeout period, the event may be dropped.
     60  // Only meaningful in combination with eDispatchToContent.
     61  eRequiresTargetConfirmation,  // 0x0800
     62 
     63  // Bits 0x1000, 0x2000, 0x4000, and 0x8000 are used by SideBitsPacked in
     64  // WebRenderAPI.cpp when we pack SideBits and CompositorHitTestInfo into a
     65  // uint16_t and pass in into webrender to store in the item tag.
     66 
     67 };
     68 
     69 using CompositorHitTestInfo = EnumSet<CompositorHitTestFlags, uint32_t>;
     70 
     71 // A CompositorHitTestInfo with none of the flags set
     72 constexpr CompositorHitTestInfo CompositorHitTestInvisibleToHit;
     73 
     74 // Mask to check for all the touch-action flags at once
     75 constexpr CompositorHitTestInfo CompositorHitTestTouchActionMask(
     76    CompositorHitTestFlags::eTouchActionPanXDisabled,
     77    CompositorHitTestFlags::eTouchActionPanYDisabled,
     78    CompositorHitTestFlags::eTouchActionPinchZoomDisabled,
     79    CompositorHitTestFlags::eTouchActionAnimatingZoomDisabled);
     80 
     81 // Mask to check all the flags that involve APZ waiting for results from the
     82 // main thread
     83 constexpr CompositorHitTestInfo CompositorHitTestDispatchToContent(
     84    CompositorHitTestFlags::eIrregularArea,
     85    CompositorHitTestFlags::eApzAwareListeners,
     86    CompositorHitTestFlags::eInactiveScrollframe);
     87 
     88 }  // namespace gfx
     89 
     90 // Used for IPDL serialization. The 'value' have to be the biggest enum from
     91 // CompositorHitTestFlags.
     92 template <>
     93 struct MaxEnumValue<::mozilla::gfx::CompositorHitTestFlags> {
     94  static constexpr unsigned int value = static_cast<unsigned int>(
     95      gfx::CompositorHitTestFlags::eRequiresTargetConfirmation);
     96 };
     97 
     98 namespace gfx {
     99 
    100 // Checks if the CompositorHitTestFlags max enum value is less than N.
    101 template <int N>
    102 static constexpr bool DoesCompositorHitTestInfoFitIntoBits() {
    103  if (MaxEnumValue<CompositorHitTestInfo::valueType>::value < N) {
    104    return true;
    105  }
    106 
    107  return false;
    108 }
    109 }  // namespace gfx
    110 
    111 }  // namespace mozilla
    112 
    113 #endif /* MOZILLA_GFX_COMPOSITORHITTESTINFO_H_ */