Home | History | Annotate | Download | only in track
      1 /*
      2  * Copyright (C) 2011 Google Inc.  All rights reserved.
      3  * Copyright (C) 2011, 2012, 2013 Apple Inc. All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions are
      7  * met:
      8  *
      9  *     * Redistributions of source code must retain the above copyright
     10  * notice, this list of conditions and the following disclaimer.
     11  *     * Redistributions in binary form must reproduce the above
     12  * copyright notice, this list of conditions and the following disclaimer
     13  * in the documentation and/or other materials provided with the
     14  * distribution.
     15  *     * Neither the name of Google Inc. nor the names of its
     16  * contributors may be used to endorse or promote products derived from
     17  * this software without specific prior written permission.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     20  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     21  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     22  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     23  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     24  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     25  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     26  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     27  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     28  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     29  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     30  */
     31 
     32 #include "config.h"
     33 #include "core/html/track/TextTrackCue.h"
     34 
     35 #include "bindings/v8/ExceptionMessages.h"
     36 #include "bindings/v8/ExceptionStatePlaceholder.h"
     37 #include "core/events/Event.h"
     38 #include "core/html/track/TextTrack.h"
     39 #include "core/html/track/TextTrackCueList.h"
     40 
     41 namespace WebCore {
     42 
     43 static const int invalidCueIndex = -1;
     44 
     45 bool TextTrackCue::isInfiniteOrNonNumber(double value, ExceptionState& exceptionState)
     46 {
     47     if (!std::isfinite(value)) {
     48         exceptionState.throwTypeError(ExceptionMessages::notAFiniteNumber(value));
     49         return true;
     50     }
     51     return false;
     52 }
     53 
     54 TextTrackCue::TextTrackCue(double start, double end)
     55     : m_startTime(start)
     56     , m_endTime(end)
     57     , m_cueIndex(invalidCueIndex)
     58     , m_track(0)
     59     , m_isActive(false)
     60     , m_pauseOnExit(false)
     61 {
     62 }
     63 
     64 void TextTrackCue::cueWillChange()
     65 {
     66     if (m_track)
     67         m_track->cueWillChange(this);
     68 }
     69 
     70 void TextTrackCue::cueDidChange()
     71 {
     72     if (m_track)
     73         m_track->cueDidChange(this);
     74 }
     75 
     76 TextTrack* TextTrackCue::track() const
     77 {
     78     return m_track;
     79 }
     80 
     81 void TextTrackCue::setTrack(TextTrack* track)
     82 {
     83     m_track = track;
     84 }
     85 
     86 void TextTrackCue::setId(const String& id)
     87 {
     88     if (m_id == id)
     89         return;
     90 
     91     cueWillChange();
     92     m_id = id;
     93     cueDidChange();
     94 }
     95 
     96 void TextTrackCue::setStartTime(double value, ExceptionState& exceptionState)
     97 {
     98     // NaN, Infinity and -Infinity values should trigger a TypeError.
     99     if (isInfiniteOrNonNumber(value, exceptionState))
    100         return;
    101 
    102     // TODO(93143): Add spec-compliant behavior for negative time values.
    103     if (m_startTime == value || value < 0)
    104         return;
    105 
    106     cueWillChange();
    107     m_startTime = value;
    108     cueDidChange();
    109 }
    110 
    111 void TextTrackCue::setEndTime(double value, ExceptionState& exceptionState)
    112 {
    113     // NaN, Infinity and -Infinity values should trigger a TypeError.
    114     if (isInfiniteOrNonNumber(value, exceptionState))
    115         return;
    116 
    117     // TODO(93143): Add spec-compliant behavior for negative time values.
    118     if (m_endTime == value || value < 0)
    119         return;
    120 
    121     cueWillChange();
    122     m_endTime = value;
    123     cueDidChange();
    124 }
    125 
    126 void TextTrackCue::setPauseOnExit(bool value)
    127 {
    128     if (m_pauseOnExit == value)
    129         return;
    130 
    131     cueWillChange();
    132     m_pauseOnExit = value;
    133     cueDidChange();
    134 }
    135 
    136 int TextTrackCue::cueIndex()
    137 {
    138     if (m_cueIndex == invalidCueIndex)
    139         m_cueIndex = track()->cues()->getCueIndex(this);
    140 
    141     return m_cueIndex;
    142 }
    143 
    144 void TextTrackCue::invalidateCueIndex()
    145 {
    146     m_cueIndex = invalidCueIndex;
    147 }
    148 
    149 bool TextTrackCue::dispatchEvent(PassRefPtr<Event> event)
    150 {
    151     // When a TextTrack's mode is disabled: no cues are active, no events fired.
    152     if (!track() || track()->mode() == TextTrack::disabledKeyword())
    153         return false;
    154 
    155     return EventTarget::dispatchEvent(event);
    156 }
    157 
    158 bool TextTrackCue::isActive()
    159 {
    160     return m_isActive && track() && track()->mode() != TextTrack::disabledKeyword();
    161 }
    162 
    163 void TextTrackCue::setIsActive(bool active)
    164 {
    165     m_isActive = active;
    166 
    167     // Remove the display tree as soon as the cue becomes inactive.
    168     if (!active)
    169         removeDisplayTree();
    170 }
    171 
    172 const AtomicString& TextTrackCue::interfaceName() const
    173 {
    174     return EventTargetNames::TextTrackCue;
    175 }
    176 
    177 } // namespace WebCore
    178