15d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)// found in the LICENSE file.
45d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
55d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#ifndef TrackListBase_h
65d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#define TrackListBase_h
75d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
85d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/events/EventTarget.h"
95d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
105d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/html/HTMLMediaElement.h"
115d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/html/track/TrackEvent.h"
125d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
13c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
145d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
155d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)template<class T>
169e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)class TrackListBase : public RefCountedWillBeGarbageCollectedFinalized<TrackListBase<T> >, public EventTargetWithInlineData {
175d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    REFCOUNTED_EVENT_TARGET(TrackListBase);
185d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(TrackListBase);
195d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)public:
205d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    explicit TrackListBase(HTMLMediaElement* mediaElement)
215d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        : m_mediaElement(mediaElement)
225d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
235d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    }
245d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
255d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    virtual ~TrackListBase()
265d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
275d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#if !ENABLE(OILPAN)
285d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        ASSERT(m_tracks.isEmpty());
295d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        ASSERT(!m_mediaElement);
305d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#endif
315d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    }
325d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
335d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    unsigned length() const { return m_tracks.size(); }
345d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    T* anonymousIndexedGetter(unsigned index) const
355d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
365d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (index >= m_tracks.size())
375d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            return 0;
385d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        return m_tracks[index].get();
395d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    }
405d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
415d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    T* getTrackById(const String& id) const
425d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
435d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        for (unsigned i = 0; i < m_tracks.size(); ++i) {
445d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            if (m_tracks[i]->id() == id)
455d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)                return m_tracks[i].get();
465d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        }
475d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
485d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        return 0;
495d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    }
505d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
515d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    DEFINE_ATTRIBUTE_EVENT_LISTENER(change);
525d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    DEFINE_ATTRIBUTE_EVENT_LISTENER(addtrack);
535d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    DEFINE_ATTRIBUTE_EVENT_LISTENER(removetrack);
545d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
555d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // EventTarget interface
565d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    virtual ExecutionContext* executionContext() const OVERRIDE
575d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
585d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (m_mediaElement)
595d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            return m_mediaElement->executionContext();
605d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        return 0;
615d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    }
625d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
635d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#if !ENABLE(OILPAN)
645d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    void shutdown()
655d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
665d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        removeAll();
675d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        m_mediaElement = nullptr;
685d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    }
695d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#endif
705d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
715d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    void add(PassRefPtrWillBeRawPtr<T> prpTrack)
725d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
735d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        RefPtrWillBeRawPtr<T> track = prpTrack;
745d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
755d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        track->setMediaElement(m_mediaElement);
765d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        m_tracks.append(track);
775d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        scheduleTrackEvent(EventTypeNames::addtrack, track.release());
785d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    }
795d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
805d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    void remove(blink::WebMediaPlayer::TrackId trackId)
815d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
825d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        for (unsigned i = 0; i < m_tracks.size(); ++i) {
835d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            if (m_tracks[i]->trackId() != trackId)
845d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)                continue;
855d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            m_tracks[i]->setMediaElement(0);
875d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            scheduleTrackEvent(EventTypeNames::removetrack, m_tracks[i]);
885d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            m_tracks.remove(i);
895d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            return;
905d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        }
915d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        ASSERT_NOT_REACHED();
925d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    }
935d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
945d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    void removeAll()
955d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
965d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        for (unsigned i = 0; i < m_tracks.size(); ++i)
975d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            m_tracks[i]->setMediaElement(0);
985d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
995d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        m_tracks.clear();
1005d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    }
1015d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
1025d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    void scheduleChangeEvent()
1035d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
104197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        RefPtrWillBeRawPtr<Event> event = Event::create(EventTypeNames::change);
1055d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        event->setTarget(this);
1065d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        m_mediaElement->scheduleEvent(event);
1075d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    }
1085d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
1095d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    Node* owner() const { return m_mediaElement; }
1105d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
1115d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    void trace(Visitor* visitor)
1125d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
1135d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        visitor->trace(m_tracks);
1145d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        visitor->trace(m_mediaElement);
1155d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        EventTargetWithInlineData::trace(visitor);
1165d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    }
1175d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
1185d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)private:
1195d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    void scheduleTrackEvent(const AtomicString& eventName, PassRefPtrWillBeRawPtr<T> track)
1205d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
1215d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        TrackEventInit initializer;
1225d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        initializer.track = track;
1235d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        initializer.bubbles = false;
1245d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        initializer.cancelable = false;
1255d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        RefPtrWillBeRawPtr<Event> event = TrackEvent::create(eventName, initializer);
1265d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        event->setTarget(this);
1275d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        m_mediaElement->scheduleEvent(event);
1285d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    }
1295d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
1305d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    WillBeHeapVector<RefPtrWillBeMember<T> > m_tracks;
1315d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RawPtrWillBeMember<HTMLMediaElement> m_mediaElement;
1325d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)};
1335d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
1345d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)}
1355d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
1365d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#endif
137