Home | History | Annotate | Download | only in html
      1 /*
      2  * Copyright (C) 2007, 2009 Apple Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1. Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2. Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
     17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 #ifndef TimeRanges_h
     27 #define TimeRanges_h
     28 
     29 #include "bindings/core/v8/ScriptWrappable.h"
     30 #include "public/platform/WebTimeRange.h"
     31 #include "wtf/PassRefPtr.h"
     32 #include "wtf/RefCounted.h"
     33 #include "wtf/Vector.h"
     34 
     35 #include <algorithm>
     36 
     37 namespace blink {
     38 
     39 class ExceptionState;
     40 
     41 class TimeRanges : public RefCountedWillBeGarbageCollected<TimeRanges>, public ScriptWrappable {
     42     DEFINE_WRAPPERTYPEINFO();
     43 public:
     44     // We consider all the Ranges to be semi-bounded as follow: [start, end[
     45     struct Range {
     46         ALLOW_ONLY_INLINE_ALLOCATION();
     47     public:
     48         Range() { }
     49         Range(double start, double end)
     50         {
     51             m_start = start;
     52             m_end = end;
     53         }
     54         double m_start;
     55         double m_end;
     56 
     57         inline bool isPointInRange(double point) const
     58         {
     59             return m_start <= point && point < m_end;
     60         }
     61 
     62         inline bool isOverlappingRange(const Range& range) const
     63         {
     64             return isPointInRange(range.m_start) || isPointInRange(range.m_end) || range.isPointInRange(m_start);
     65         }
     66 
     67         inline bool isContiguousWithRange(const Range& range) const
     68         {
     69             return range.m_start == m_end || range.m_end == m_start;
     70         }
     71 
     72         inline Range unionWithOverlappingOrContiguousRange(const Range& range) const
     73         {
     74             Range ret;
     75 
     76             ret.m_start = std::min(m_start, range.m_start);
     77             ret.m_end = std::max(m_end, range.m_end);
     78 
     79             return ret;
     80         }
     81 
     82         inline bool isBeforeRange(const Range& range) const
     83         {
     84             return range.m_start >= m_end;
     85         }
     86 
     87         void trace(Visitor*) { }
     88     };
     89 
     90     static PassRefPtrWillBeRawPtr<TimeRanges> create()
     91     {
     92         return adoptRefWillBeNoop(new TimeRanges);
     93     }
     94     static PassRefPtrWillBeRawPtr<TimeRanges> create(double start, double end)
     95     {
     96         return adoptRefWillBeNoop(new TimeRanges(start, end));
     97     }
     98     static PassRefPtrWillBeRawPtr<TimeRanges> create(const blink::WebTimeRanges&);
     99 
    100     PassRefPtrWillBeRawPtr<TimeRanges> copy() const;
    101     void intersectWith(const TimeRanges*);
    102     void unionWith(const TimeRanges*);
    103 
    104     unsigned length() const { return m_ranges.size(); }
    105     double start(unsigned index, ExceptionState&) const;
    106     double end(unsigned index, ExceptionState&) const;
    107 
    108     void add(double start, double end);
    109 
    110     bool contain(double time) const;
    111 
    112     double nearest(double newPlaybackPosition, double currentPlaybackPosition) const;
    113 
    114     void trace(Visitor*);
    115 
    116 private:
    117     TimeRanges() { }
    118 
    119     TimeRanges(double start, double end);
    120 
    121     void invert();
    122 
    123     WillBeHeapVector<Range> m_ranges;
    124 };
    125 
    126 } // namespace blink
    127 
    128 WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::TimeRanges::Range);
    129 
    130 #endif // TimeRanges_h
    131