gfx/layers/apz/src/FocusTarget.h
author Doug Thayer <dothayer@mozilla.com>
Fri, 22 Mar 2019 03:15:14 +0000
changeset 465585 c09a51622e988e81077c75e3aaa5a49df66284b3
parent 448966 6f3709b3878117466168c40affa7bca0b60cf75b
child 465596 699a6b6bee44710ba8710a2ee7740783a596a26a
permissions -rw-r--r--
Bug 1441308 - Core renderroot splitting changes r=kats,sotaro This is a large patch that contains all of the core changes for renderroot splitting. Differential Revision: https://phabricator.services.mozilla.com/D20701

/* -*- 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_FocusTarget_h
#define mozilla_layers_FocusTarget_h

#include <stdint.h>  // for int32_t, uint32_t

#include "mozilla/DefineEnum.h"                  // for MOZ_DEFINE_ENUM
#include "mozilla/layers/ScrollableLayerGuid.h"  // for ViewID
#include "mozilla/webrender/WebRenderTypes.h"    // for RenderRoot
#include "mozilla/Variant.h"                     // for Variant

class nsIPresShell;

namespace mozilla {
namespace layers {

/**
 * This class is used for communicating information about the currently focused
 * element of a document and the scrollable frames to use when keyboard
 * scrolling it. It is created on the main thread at paint-time, but is then
 * passed over IPC to the compositor/APZ code.
 */
class FocusTarget final {
 public:
  struct ScrollTargets {
    ScrollableLayerGuid::ViewID mHorizontal;
    wr::RenderRoot mHorizontalRenderRoot;
    ScrollableLayerGuid::ViewID mVertical;
    wr::RenderRoot mVerticalRenderRoot;

    bool operator==(const ScrollTargets& aRhs) const {
      bool ret =
          (mHorizontal == aRhs.mHorizontal && mVertical == aRhs.mVertical);
      if (ret) {
        // The render root is a function of where the scrollable frame is in
        // the DOM/layout tree, so if the ViewIDs match then the render roots
        // should also match.
        MOZ_ASSERT(mHorizontalRenderRoot == aRhs.mHorizontalRenderRoot &&
                   mVerticalRenderRoot == aRhs.mVerticalRenderRoot);
      }
      return ret;
    }
  };

  // We need this to represent the case where mData has no focus target data
  // because we can't have an empty variant
  struct NoFocusTarget {
    bool operator==(const NoFocusTarget& aRhs) const { return true; }
  };

  FocusTarget();

  /**
   * Construct a focus target for the specified top level PresShell
   */
  FocusTarget(nsIPresShell* aRootPresShell, uint64_t aFocusSequenceNumber);

  bool operator==(const FocusTarget& aRhs) const;

  const char* Type() const;

 public:
  // The content sequence number recorded at the time of this class's creation
  uint64_t mSequenceNumber;

  // Whether there are keydown, keypress, or keyup event listeners
  // in the event target chain of the focused element
  bool mFocusHasKeyEventListeners;

  mozilla::Variant<LayersId, ScrollTargets, NoFocusTarget> mData;
};

}  // namespace layers
}  // namespace mozilla

#endif  // mozilla_layers_FocusTarget_h