2a76be816a3a3e219d929f557995c4354e1e02e6
[WebKit-https.git] / Source / WebCore / Modules / mediasession / MediaSession.h
1 /*
2  * Copyright (C) 2015 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 #ifndef MediaSession_h
27 #define MediaSession_h
28
29 #if ENABLE(MEDIA_SESSION)
30
31 #include "MediaRemoteControls.h"
32 #include "MediaSessionMetadata.h"
33
34 namespace WebCore {
35
36 class Dictionary;
37 class Document;
38 class HTMLMediaElement;
39
40 class MediaSession final : public RefCounted<MediaSession> {
41 public:
42     enum class State {
43         Idle,
44         Active,
45         Interrupted
46     };
47
48     enum class Kind {
49         Default,
50         Content,
51         Transient,
52         TransientSolo,
53         Ambient
54     };
55
56     static Ref<MediaSession> create(ScriptExecutionContext& context, const String& kind = String())
57     {
58         return adoptRef(*new MediaSession(context, kind));
59     }
60
61     ~MediaSession();
62
63     String kind() const;
64     Kind kindEnum() const { return m_kind; }
65     MediaRemoteControls* controls();
66
67     WEBCORE_EXPORT State currentState() const { return m_currentState; }
68     bool hasActiveMediaElements() const;
69
70     void setMetadata(const Dictionary&);
71
72     void deactivate();
73
74     // Runs the media session invocation algorithm and returns true on success.
75     bool invoke();
76
77     void handleDuckInterruption();
78     void handleIndefinitePauseInterruption();
79     void handlePauseInterruption();
80     void handleUnduckInterruption();
81     void handleUnpauseInterruption();
82
83     void togglePlayback();
84     void skipToNextTrack();
85     void skipToPreviousTrack();
86
87     void controlIsEnabledDidChange();
88
89 private:
90     friend class HTMLMediaElement;
91
92     MediaSession(ScriptExecutionContext&, const String&);
93
94     static Kind parseKind(const String&);
95
96     void addMediaElement(HTMLMediaElement&);
97     void removeMediaElement(HTMLMediaElement&);
98
99     void safelyIterateActiveMediaElements(std::function<void(HTMLMediaElement*)>);
100     void changeActiveMediaElements(std::function<void(void)>);
101     void addActiveMediaElement(HTMLMediaElement&);
102     bool isMediaElementActive(HTMLMediaElement&);
103
104     void releaseInternal();
105
106     State m_currentState { State::Idle };
107     HashSet<HTMLMediaElement*> m_participatingElements;
108     HashSet<HTMLMediaElement*> m_activeParticipatingElements;
109     HashSet<HTMLMediaElement*>* m_iteratedActiveParticipatingElements { nullptr };
110
111     Document& m_document;
112     const Kind m_kind { Kind::Default };
113     RefPtr<MediaRemoteControls> m_controls;
114     MediaSessionMetadata m_metadata;
115 };
116
117 } // namespace WebCore
118
119 #endif /* ENABLE(MEDIA_SESSION) */
120
121 #endif /* MediaSession_h */