DXR will be turned off on Tuesday, December 29th. It will redirect to Searchfox.
See the announcement on Discourse.

DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Implementation

Mercurial (c68fe15a81fc)

VCS Links

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* -*- 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_dom_TimeRanges_h_
#define mozilla_dom_TimeRanges_h_

#include "nsCOMPtr.h"
#include "nsISupports.h"
#include "nsISupports.h"
#include "nsTArray.h"
#include "nsWrapperCache.h"
#include "mozilla/ErrorResult.h"
#include "TimeUnits.h"


namespace mozilla {

namespace dom {
class TimeRanges;
class TimeRanges;
}  // namespace dom

namespace dom {

// Implements media TimeRanges:
// Implements media TimeRanges:
// http://www.whatwg.org/specs/web-apps/current-work/multipage/video.html#timeranges
class TimeRanges final : public nsISupports, public nsWrapperCache {
 public:
  NS_DECL_CYCLE_COLLECTING_ISUPPORTS
  NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(TimeRanges)
  NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(TimeRanges)

  TimeRanges();
  explicit TimeRanges(nsISupports* aParent);
  explicit TimeRanges(const media::TimeIntervals& aTimeIntervals);
  explicit TimeRanges(const media::TimeIntervals& aTimeIntervals);
  TimeRanges(nsISupports* aParent, const media::TimeIntervals& aTimeIntervals);

  media::TimeIntervals ToTimeIntervals() const;

  void Add(double aStart, double aEnd);
  void Add(double aStart, double aEnd);

  // Returns the start time of the first range, or -1 if no ranges exist.
  double GetStartTime();

  // Returns the end time of the last range, or -1 if no ranges exist.
  // Returns the end time of the last range, or -1 if no ranges exist.
  double GetEndTime();

  // See http://www.whatwg.org/html/#normalized-timeranges-object
  void Normalize(double aTolerance = 0.0);

  // Mutate this TimeRange to be the union of this and aOtherRanges.
  void Union(const TimeRanges* aOtherRanges, double aTolerance);
  void Union(const TimeRanges* aOtherRanges, double aTolerance);

  // Mutate this TimeRange to be the intersection of this and aOtherRanges.
  void Intersection(const TimeRanges* aOtherRanges);

  JSObject* WrapObject(JSContext* aCx,
  JSObject* WrapObject(JSContext* aCx,
                       JS::Handle<JSObject*> aGivenProto) override;

  nsISupports* GetParentObject() const;

  uint32_t Length() const { return mRanges.Length(); }
  uint32_t Length() const { return mRanges.Length(); }

  double Start(uint32_t aIndex, ErrorResult& aRv) const;

  double End(uint32_t aIndex, ErrorResult& aRv) const;


  double Start(uint32_t aIndex) const { return mRanges[aIndex].mStart; }

  double End(uint32_t aIndex) const { return mRanges[aIndex].mEnd; }


  // Shift all values by aOffset seconds.
  void Shift(double aOffset);

 private:
  ~TimeRanges();
  ~TimeRanges();

  // Comparator which orders TimeRanges by start time. Used by Normalize().
  struct TimeRange {
    TimeRange(double aStart, double aEnd) : mStart(aStart), mEnd(aEnd) {}
    double mStart;
    double mStart;
    double mEnd;
  };

  struct CompareTimeRanges {
    bool Equals(const TimeRange& aTr1, const TimeRange& aTr2) const {
    bool Equals(const TimeRange& aTr1, const TimeRange& aTr2) const {
      return aTr1.mStart == aTr2.mStart && aTr1.mEnd == aTr2.mEnd;
    }

    bool LessThan(const TimeRange& aTr1, const TimeRange& aTr2) const {
      return aTr1.mStart < aTr2.mStart;
    }
  };
  };

  AutoTArray<TimeRange, 4> mRanges;

  nsCOMPtr<nsISupports> mParent;


 public:
  typedef nsTArray<TimeRange>::index_type index_type;
  static const index_type NoIndex = index_type(-1);

  index_type Find(double aTime, double aTolerance = 0);
  index_type Find(double aTime, double aTolerance = 0);

  bool Contains(double aStart, double aEnd) {
    index_type target = Find(aStart);
    if (target == NoIndex) {
      return false;
      return false;
    }

    return mRanges[target].mEnd >= aEnd;
  }
};
};

}  // namespace dom
}  // namespace mozilla

#endif  // mozilla_dom_TimeRanges_h_
#endif  // mozilla_dom_TimeRanges_h_