[iOS] Show external device name/type in placeholder
[WebKit-https.git] / Source / WebCore / Modules / mediacontrols / MediaControlsHost.cpp
1 /*
2  * Copyright (C) 2013, 2014 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 COMPUTER, 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 COMPUTER, 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 #include "config.h"
27
28 #if ENABLE(MEDIA_CONTROLS_SCRIPT)
29
30 #include "MediaControlsHost.h"
31
32 #include "CaptionUserPreferences.h"
33 #include "Element.h"
34 #include "HTMLMediaElement.h"
35 #include "Logging.h"
36 #include "MediaControlElements.h"
37 #include "Page.h"
38 #include "PageGroup.h"
39 #include "TextTrack.h"
40 #include "TextTrackList.h"
41
42 namespace WebCore {
43
44 const AtomicString& MediaControlsHost::automaticKeyword()
45 {
46     DEFINE_STATIC_LOCAL(const AtomicString, automatic, ("automatic", AtomicString::ConstructFromLiteral));
47     return automatic;
48 }
49
50 const AtomicString& MediaControlsHost::forcedOnlyKeyword()
51 {
52     DEFINE_STATIC_LOCAL(const AtomicString, forcedOn, ("forced-only", AtomicString::ConstructFromLiteral));
53     return forcedOn;
54 }
55
56 const AtomicString& MediaControlsHost::alwaysOnKeyword()
57 {
58     DEFINE_STATIC_LOCAL(const AtomicString, alwaysOn, ("always-on", AtomicString::ConstructFromLiteral));
59     return alwaysOn;
60 }
61
62 PassRefPtr<MediaControlsHost> MediaControlsHost::create(HTMLMediaElement* mediaElement)
63 {
64     return adoptRef(new MediaControlsHost(mediaElement));
65 }
66
67 MediaControlsHost::MediaControlsHost(HTMLMediaElement* mediaElement)
68     : m_mediaElement(mediaElement)
69 {
70     ASSERT(mediaElement);
71 }
72
73 MediaControlsHost::~MediaControlsHost()
74 {
75 }
76
77 Vector<RefPtr<TextTrack>> MediaControlsHost::sortedTrackListForMenu(TextTrackList* trackList)
78 {
79     if (!trackList)
80         return Vector<RefPtr<TextTrack>>();
81
82     Page* page = m_mediaElement->document().page();
83     if (!page)
84         return Vector<RefPtr<TextTrack>>();
85
86     CaptionUserPreferences* captionPreferences = page->group().captionPreferences();
87     return captionPreferences->sortedTrackListForMenu(trackList);
88 }
89
90 String MediaControlsHost::displayNameForTrack(TextTrack* track)
91 {
92     if (!track)
93         return emptyString();
94
95     Page* page = m_mediaElement->document().page();
96     if (!page)
97         return emptyString();
98
99     CaptionUserPreferences* captionPreferences = page->group().captionPreferences();
100     return captionPreferences->displayNameForTrack(track);
101 }
102
103 TextTrack* MediaControlsHost::captionMenuOffItem()
104 {
105     return TextTrack::captionMenuOffItem();
106 }
107
108 TextTrack* MediaControlsHost::captionMenuAutomaticItem()
109 {
110     return TextTrack::captionMenuAutomaticItem();
111 }
112
113 AtomicString MediaControlsHost::captionDisplayMode()
114 {
115     Page* page = m_mediaElement->document().page();
116     if (!page)
117         return emptyAtom;
118
119     switch (page->group().captionPreferences()->captionDisplayMode()) {
120     case CaptionUserPreferences::Automatic:
121         return automaticKeyword();
122     case CaptionUserPreferences::ForcedOnly:
123         return forcedOnlyKeyword();
124     case CaptionUserPreferences::AlwaysOn:
125         return alwaysOnKeyword();
126     default:
127         ASSERT_NOT_REACHED();
128         return emptyAtom;
129     }
130 }
131
132 void MediaControlsHost::setSelectedTextTrack(TextTrack* track)
133 {
134     m_mediaElement->setSelectedTextTrack(track);
135 }
136
137 Element* MediaControlsHost::textTrackContainer()
138 {
139     if (!m_textTrackContainer) {
140         m_textTrackContainer = MediaControlTextTrackContainerElement::create(m_mediaElement->document());
141         m_textTrackContainer->setMediaController(m_mediaElement);
142     }
143     return m_textTrackContainer.get();
144 }
145
146 void MediaControlsHost::updateTextTrackContainer()
147 {
148     if (m_textTrackContainer)
149         m_textTrackContainer->updateDisplay();
150 }
151
152 bool MediaControlsHost::mediaPlaybackAllowsInline() const
153 {
154     return !m_mediaElement->mediaSession().requiresFullscreenForVideoPlayback(*m_mediaElement);
155 }
156
157 bool MediaControlsHost::supportsFullscreen()
158 {
159     return m_mediaElement->supportsFullscreen();
160 }
161
162 bool MediaControlsHost::userGestureRequired() const
163 {
164     return !m_mediaElement->mediaSession().playbackPermitted(*m_mediaElement);
165 }
166
167 String MediaControlsHost::externalDeviceDisplayName() const
168 {
169 #if ENABLE(IOS_AIRPLAY)
170     MediaPlayer* player = m_mediaElement->player();
171     if (!player) {
172         LOG(Media, "MediaControlsHost::externalDeviceDisplayName - returning \"\" because player is NULL");
173         return emptyString();
174     }
175     
176     String name = player->wirelessPlaybackTargetName();
177     LOG(Media, "MediaControlsHost::externalDeviceDisplayName - returning \"%s\"", name.utf8().data());
178     
179     return name;
180 #else
181     return emptyString();
182 #endif
183 }
184
185 String MediaControlsHost::externalDeviceType() const
186 {
187     DEFINE_STATIC_LOCAL(String, none, (ASCIILiteral("none")));
188     String type = none;
189     
190 #if ENABLE(IOS_AIRPLAY)
191     DEFINE_STATIC_LOCAL(String, airplay, (ASCIILiteral("airplay")));
192     DEFINE_STATIC_LOCAL(String, tvout, (ASCIILiteral("tvout")));
193     
194     MediaPlayer* player = m_mediaElement->player();
195     if (!player) {
196         LOG(Media, "MediaControlsHost::externalDeviceType - returning \"none\" because player is NULL");
197         return none;
198     }
199     
200     switch (player->wirelessPlaybackTargetType()) {
201     case MediaPlayer::TargetTypeNone:
202         type = none;
203         break;
204     case MediaPlayer::TargetTypeAirPlay:
205         type = airplay;
206         break;
207     case MediaPlayer::TargetTypeTVOut:
208         type = tvout;
209         break;
210     }
211 #endif
212     
213     LOG(Media, "MediaControlsHost::externalDeviceType - returning \"%s\"", type.utf8().data());
214     
215     return type;
216 }
217     
218 }
219
220 #endif