36c21b1136e401b64c56c899440e496bbfe12363
[WebKit-https.git] / Source / WebCore / html / HTMLMediaSession.cpp
1 /*
2  * Copyright (C) 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 INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27
28 #if ENABLE(VIDEO)
29
30 #include "HTMLMediaSession.h"
31
32 #include "HTMLMediaElement.h"
33 #include "Logging.h"
34 #include "MediaSessionManager.h"
35 #include "Page.h"
36 #include "ScriptController.h"
37
38 #if PLATFORM(IOS)
39 #include "RuntimeApplicationChecksIOS.h"
40 #endif
41
42 namespace WebCore {
43
44 std::unique_ptr<HTMLMediaSession> HTMLMediaSession::create(MediaSessionClient& client)
45 {
46     return std::make_unique<HTMLMediaSession>(client);
47 }
48
49 HTMLMediaSession::HTMLMediaSession(MediaSessionClient& client)
50     : MediaSession(client)
51     , m_restrictions(NoRestrictions)
52 {
53 }
54
55 void HTMLMediaSession::addBehaviorRestriction(BehaviorRestrictions restriction)
56 {
57     m_restrictions |= restriction;
58 }
59
60 void HTMLMediaSession::removeBehaviorRestriction(BehaviorRestrictions restriction)
61 {
62     m_restrictions &= ~restriction;
63 }
64
65 bool HTMLMediaSession::playbackPermitted(const HTMLMediaElement&) const
66 {
67     if (m_restrictions & RequireUserGestureForRateChange && !ScriptController::processingUserGesture()) {
68         LOG(Media, "HTMLMediaSession::playbackPermitted - returning FALSE");
69         return false;
70     }
71
72     return true;
73 }
74
75 bool HTMLMediaSession::dataLoadingPermitted(const HTMLMediaElement&) const
76 {
77     if (m_restrictions & RequireUserGestureForLoad && !ScriptController::processingUserGesture()) {
78         LOG(Media, "HTMLMediaSession::dataLoadingPermitted - returning FALSE");
79         return false;
80     }
81
82     return true;
83 }
84
85 bool HTMLMediaSession::fullscreenPermitted(const HTMLMediaElement&) const
86 {
87     if (m_restrictions & RequireUserGestureForFullscreen && !ScriptController::processingUserGesture()) {
88         LOG(Media, "HTMLMediaSession::fullscreenPermitted - returning FALSE");
89         return false;
90     }
91
92     return true;
93 }
94
95 bool HTMLMediaSession::pageAllowsDataLoading(const HTMLMediaElement& element) const
96 {
97     Page* page = element.document().page();
98     if (m_restrictions & RequirePageConsentToLoadMedia && page && !page->canStartMedia()) {
99         LOG(Media, "HTMLMediaSession::pageAllowsDataLoading - returning FALSE");
100         return false;
101     }
102     
103     return true;
104 }
105
106 bool HTMLMediaSession::pageAllowsPlaybackAfterResuming(const HTMLMediaElement& element) const
107 {
108     Page* page = element.document().page();
109     if (m_restrictions & RequirePageConsentToResumeMedia && page && !page->canStartMedia()) {
110         LOG(Media, "HTMLMediaSession::pageAllowsPlaybackAfterResuming - returning FALSE");
111         return false;
112     }
113     
114     return true;
115 }
116
117 #if ENABLE(IOS_AIRPLAY)
118 bool HTMLMediaSession::showingPlaybackTargetPickerPermitted(const HTMLMediaElement&) const
119 {
120     if (m_restrictions & RequireUserGestureToShowPlaybackTargetPicker && !ScriptController::processingUserGesture()) {
121         LOG(Media, "HTMLMediaSession::showingPlaybackTargetPickerPermitted - returning FALSE");
122         return false;
123     }
124     
125     return true;
126 }
127 #endif
128
129 void HTMLMediaSession::clientWillBeginPlayback() const
130 {
131     MediaSessionManager::sharedManager().sessionWillBeginPlayback(*this);
132 }
133
134 bool HTMLMediaSession::requiresFullscreenForVideoPlayback(const HTMLMediaElement& element) const
135 {
136     if (!MediaSessionManager::sharedManager().sessionRestrictsInlineVideoPlayback(*this))
137         return false;
138
139     Settings* settings = element.document().settings();
140     if (!settings || !settings->mediaPlaybackAllowsInline())
141         return true;
142
143     if (element.fastHasAttribute(HTMLNames::webkit_playsinlineAttr))
144         return false;
145
146 #if PLATFORM(IOS)
147     if (applicationIsDumpRenderTree())
148         return false;
149 #endif
150
151     return true;
152 }
153
154 }
155
156 #endif // ENABLE(VIDEO)