tor-browser

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

GridTracks.cpp (3788B)


      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 "GridTracks.h"
      8 
      9 #include "GridDimension.h"
     10 #include "GridTrack.h"
     11 #include "mozilla/dom/GridBinding.h"
     12 #include "nsGridContainerFrame.h"
     13 
     14 namespace mozilla::dom {
     15 
     16 NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(GridTracks, mParent, mTracks)
     17 NS_IMPL_CYCLE_COLLECTING_ADDREF(GridTracks)
     18 NS_IMPL_CYCLE_COLLECTING_RELEASE(GridTracks)
     19 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(GridTracks)
     20  NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
     21  NS_INTERFACE_MAP_ENTRY(nsISupports)
     22 NS_INTERFACE_MAP_END
     23 
     24 GridTracks::GridTracks(GridDimension* aParent) : mParent(aParent) {
     25  MOZ_ASSERT(aParent, "Should never be instantiated with a null GridDimension");
     26 }
     27 
     28 GridTracks::~GridTracks() = default;
     29 
     30 JSObject* GridTracks::WrapObject(JSContext* aCx,
     31                                 JS::Handle<JSObject*> aGivenProto) {
     32  return GridTracks_Binding::Wrap(aCx, this, aGivenProto);
     33 }
     34 
     35 uint32_t GridTracks::Length() const { return mTracks.Length(); }
     36 
     37 GridTrack* GridTracks::Item(uint32_t aIndex) {
     38  return mTracks.SafeElementAt(aIndex);
     39 }
     40 
     41 GridTrack* GridTracks::IndexedGetter(uint32_t aIndex, bool& aFound) {
     42  aFound = aIndex < mTracks.Length();
     43  if (!aFound) {
     44    return nullptr;
     45  }
     46  return mTracks[aIndex];
     47 }
     48 
     49 void GridTracks::SetTrackInfo(const ComputedGridTrackInfo* aTrackInfo) {
     50  // rebuild the tracks based on aTrackInfo
     51  mTracks.Clear();
     52 
     53  if (!aTrackInfo) {
     54    return;
     55  }
     56 
     57  nscoord lastTrackEdge = 0;
     58  uint32_t repeatIndex = 0;
     59  auto AppendRemovedAutoFits = [this, &aTrackInfo, &lastTrackEdge,
     60                                &repeatIndex]() {
     61    uint32_t numRepeatTracks = aTrackInfo->mRemovedRepeatTracks.Length();
     62    // Add in removed auto-fit tracks
     63    while (repeatIndex < numRepeatTracks &&
     64           aTrackInfo->mRemovedRepeatTracks[repeatIndex]) {
     65      RefPtr<GridTrack> track = new GridTrack(this);
     66      mTracks.AppendElement(track);
     67      track->SetTrackValues(
     68          nsPresContext::AppUnitsToDoubleCSSPixels(lastTrackEdge),
     69          nsPresContext::AppUnitsToDoubleCSSPixels(0),
     70          GridDeclaration::Explicit, GridTrackState::Removed);
     71      repeatIndex++;
     72    }
     73    repeatIndex++;
     74  };
     75 
     76  for (size_t i = aTrackInfo->mStartFragmentTrack;
     77       i < aTrackInfo->mEndFragmentTrack; i++) {
     78    if (i >= aTrackInfo->mRepeatFirstTrack) {
     79      // Append removed auto-fit tracks, if appropriate. The
     80      // AppendRemovedAutoFits function exits early once it has been called
     81      // aTrackInfo->mRemovedRepeatTracks.Length() times -- a check we don't
     82      // replicate here or at subsequent calling sites.
     83      AppendRemovedAutoFits();
     84    }
     85 
     86    RefPtr<GridTrack> track = new GridTrack(this);
     87    mTracks.AppendElement(track);
     88    track->SetTrackValues(
     89        nsPresContext::AppUnitsToDoubleCSSPixels(aTrackInfo->mPositions[i]),
     90        nsPresContext::AppUnitsToDoubleCSSPixels(aTrackInfo->mSizes[i]),
     91        (
     92            // Implicit if index is before the first explicit track, or after
     93            // the last explicit track.
     94            (i < aTrackInfo->mNumLeadingImplicitTracks) ||
     95                    (i >= aTrackInfo->mNumLeadingImplicitTracks +
     96                              aTrackInfo->mNumExplicitTracks)
     97                ? GridDeclaration::Implicit
     98                : GridDeclaration::Explicit),
     99        GridTrackState(aTrackInfo->mStates[i]));
    100 
    101    lastTrackEdge = aTrackInfo->mPositions[i] + aTrackInfo->mSizes[i];
    102  }
    103 
    104  // Append any trailing removed auto-fit tracks.
    105  AppendRemovedAutoFits();
    106 }
    107 
    108 }  // namespace mozilla::dom