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