1/*
2 * Copyright (C) 2011, 2012 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 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 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#pragma once
27
28#if ENABLE(VIDEO_TRACK)
29
30#include "ActiveDOMObject.h"
31#include "EventTarget.h"
32#include "GenericEventQueue.h"
33#include <wtf/RefCounted.h>
34#include <wtf/Vector.h>
35
36namespace WebCore {
37
38class HTMLMediaElement;
39class Element;
40class TrackBase;
41
42class TrackListBase : public RefCounted<TrackListBase>, public EventTargetWithInlineData, public ActiveDOMObject {
43 WTF_MAKE_ISO_ALLOCATED(TrackListBase);
44public:
45 virtual ~TrackListBase();
46
47 virtual unsigned length() const;
48 virtual bool contains(TrackBase&) const;
49 virtual void remove(TrackBase&, bool scheduleEvent = true);
50
51 // EventTarget
52 EventTargetInterface eventTargetInterface() const override = 0;
53 using RefCounted<TrackListBase>::ref;
54 using RefCounted<TrackListBase>::deref;
55 ScriptExecutionContext* scriptExecutionContext() const final { return ContextDestructionObserver::scriptExecutionContext(); }
56
57 virtual void clearElement();
58 Element* element() const;
59 HTMLMediaElement* mediaElement() const { return m_element; }
60
61 // Needs to be public so tracks can call it
62 void scheduleChangeEvent();
63 bool isChangeEventScheduled() const;
64
65 bool isAnyTrackEnabled() const;
66
67protected:
68 TrackListBase(HTMLMediaElement*, ScriptExecutionContext*);
69
70 void scheduleAddTrackEvent(Ref<TrackBase>&&);
71 void scheduleRemoveTrackEvent(Ref<TrackBase>&&);
72
73 Vector<RefPtr<TrackBase>> m_inbandTracks;
74
75private:
76 void scheduleTrackEvent(const AtomString& eventName, Ref<TrackBase>&&);
77
78 bool canSuspendForDocumentSuspension() const final;
79 void suspend(ReasonForSuspension) final;
80 void resume() final;
81 void stop() final;
82
83 // EventTarget
84 void refEventTarget() final { ref(); }
85 void derefEventTarget() final { deref(); }
86
87 HTMLMediaElement* m_element;
88
89 GenericEventQueue m_asyncEventQueue;
90};
91
92} // namespace WebCore
93
94#endif // ENABLE(VIDEO_TRACK)
95