Title: [201729] trunk/Source/WebCore
- Revision
- 201729
- Author
- jer.no...@apple.com
- Date
- 2016-06-06 14:47:05 -0700 (Mon, 06 Jun 2016)
Log Message
Media elements should only be allowed to control controls manager during a user gesture.
https://bugs.webkit.org/show_bug.cgi?id=158432
Reviewed by Eric Carlson.
Add a new MediaElementSession behavior restriction for the controls manager
which is cleared on the first user gesture. Since canControlControlsManager()
may be called before the first layout, call updatePlaybackControlsManager()
since the main content check requires the laid-out size of the media element.
(WebCore::HTMLMediaElement::HTMLMediaElement):
(WebCore::HTMLMediaElement::layoutSizeChanged):
(WebCore::HTMLMediaElement::removeBehaviorsRestrictionsAfterFirstUserGesture):
* html/HTMLMediaElement.h:
* html/MediaElementSession.cpp:
(WebCore::MediaElementSession::canControlControlsManager):
* html/MediaElementSession.h:
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (201728 => 201729)
--- trunk/Source/WebCore/ChangeLog 2016-06-06 21:40:58 UTC (rev 201728)
+++ trunk/Source/WebCore/ChangeLog 2016-06-06 21:47:05 UTC (rev 201729)
@@ -1,3 +1,23 @@
+2016-06-06 Jer Noble <jer.no...@apple.com>
+
+ Media elements should only be allowed to control controls manager during a user gesture.
+ https://bugs.webkit.org/show_bug.cgi?id=158432
+
+ Reviewed by Eric Carlson.
+
+ Add a new MediaElementSession behavior restriction for the controls manager
+ which is cleared on the first user gesture. Since canControlControlsManager()
+ may be called before the first layout, call updatePlaybackControlsManager()
+ since the main content check requires the laid-out size of the media element.
+
+ (WebCore::HTMLMediaElement::HTMLMediaElement):
+ (WebCore::HTMLMediaElement::layoutSizeChanged):
+ (WebCore::HTMLMediaElement::removeBehaviorsRestrictionsAfterFirstUserGesture):
+ * html/HTMLMediaElement.h:
+ * html/MediaElementSession.cpp:
+ (WebCore::MediaElementSession::canControlControlsManager):
+ * html/MediaElementSession.h:
+
2016-06-06 Adam Bergkvist <adam.bergkv...@ericsson.com>
WebRTC: Update MediaEndpointPeerConnection::createOffer() to use the transceiver set
Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (201728 => 201729)
--- trunk/Source/WebCore/html/HTMLMediaElement.cpp 2016-06-06 21:40:58 UTC (rev 201728)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp 2016-06-06 21:47:05 UTC (rev 201729)
@@ -409,6 +409,7 @@
, m_parsingInProgress(createdByParser)
, m_elementIsHidden(document.hidden())
, m_creatingControls(false)
+ , m_receivedLayoutSizeChanged(false)
#if ENABLE(MEDIA_CONTROLS_SCRIPT)
, m_mediaControlsDependOnPageScaleFactor(false)
, m_haveSetUpCaptionContainer(false)
@@ -443,6 +444,7 @@
#if ENABLE(WIRELESS_PLAYBACK_TARGET)
m_mediaSession->addBehaviorRestriction(MediaElementSession::RequireUserGestureToAutoplayToExternalDevice);
#endif
+ m_mediaSession->addBehaviorRestriction(MediaElementSession::RequireUserGestureToControlControlsManager);
Settings* settings = document.settings();
#if PLATFORM(IOS)
@@ -4001,6 +4003,11 @@
};
m_resizeTaskQueue.enqueueTask(WTFMove(task));
#endif
+
+ if (!m_receivedLayoutSizeChanged) {
+ m_receivedLayoutSizeChanged = true;
+ updatePlaybackControlsManager();
+ }
}
void HTMLMediaElement::visibilityDidChange()
@@ -6404,7 +6411,8 @@
| MediaElementSession::RequireUserGestureForVideoRateChange
| MediaElementSession::RequireUserGestureForAudioRateChange
| MediaElementSession::RequireUserGestureForFullscreen
- | MediaElementSession::InvisibleAutoplayNotPermitted;
+ | MediaElementSession::InvisibleAutoplayNotPermitted
+ | MediaElementSession::RequireUserGestureToControlControlsManager;
m_mediaSession->removeBehaviorRestriction(restrictionsToRemove);
}
Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (201728 => 201729)
--- trunk/Source/WebCore/html/HTMLMediaElement.h 2016-06-06 21:40:58 UTC (rev 201728)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h 2016-06-06 21:47:05 UTC (rev 201729)
@@ -926,6 +926,7 @@
bool m_parsingInProgress : 1;
bool m_elementIsHidden : 1;
bool m_creatingControls : 1;
+ bool m_receivedLayoutSizeChanged : 1;
#if ENABLE(MEDIA_CONTROLS_SCRIPT)
bool m_mediaControlsDependOnPageScaleFactor : 1;
Modified: trunk/Source/WebCore/html/MediaElementSession.cpp (201728 => 201729)
--- trunk/Source/WebCore/html/MediaElementSession.cpp 2016-06-06 21:40:58 UTC (rev 201728)
+++ trunk/Source/WebCore/html/MediaElementSession.cpp 2016-06-06 21:47:05 UTC (rev 201729)
@@ -214,31 +214,55 @@
bool MediaElementSession::canControlControlsManager(const HTMLMediaElement& element) const
{
- if (!element.hasAudio())
+ if (!element.hasAudio()) {
+ LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: No audio");
return false;
+ }
- if (element.muted())
+ if (element.muted()) {
+ LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: Muted");
return false;
+ }
- if (element.ended())
+ if (element.ended()) {
+ LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: Ended");
return false;
+ }
- if (element.document().activeDOMObjectsAreSuspended())
+ if (element.document().activeDOMObjectsAreSuspended()) {
+ LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: activeDOMObjectsAreSuspended()");
return false;
+ }
- if (!playbackPermitted(element))
+ if (!playbackPermitted(element)) {
+ LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: Playback not permitted");
return false;
+ }
- if (!element.renderer())
- return false;
+ if (element.isVideo()) {
+ if (!element.renderer()) {
+ LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: No renderer");
+ return false;
+ }
- if (isElementLargeEnoughForMainContent(element))
- return true;
+ if (!element.hasVideo()) {
+ LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: No video");
+ return false;
+ }
- if (ScriptController::processingUserGestureForMedia())
- return true;
+ if (isElementLargeEnoughForMainContent(element)) {
+ LOG(Media, "MediaElementSession::canControlControlsManager - returning TRUE: Is main content");
+ return true;
+ }
+ }
- return false;
+ if (m_restrictions & RequireUserGestureToControlControlsManager && !ScriptController::processingUserGestureForMedia()) {
+ LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: No user gesture");
+ return false;
+ }
+
+ LOG(Media, "MediaElementSession::canControlControlsManager - returning TRUE: All criteria met");
+ return true;
}
#if ENABLE(WIRELESS_PLAYBACK_TARGET)
Modified: trunk/Source/WebCore/html/MediaElementSession.h (201728 => 201729)
--- trunk/Source/WebCore/html/MediaElementSession.h 2016-06-06 21:40:58 UTC (rev 201728)
+++ trunk/Source/WebCore/html/MediaElementSession.h 2016-06-06 21:47:05 UTC (rev 201729)
@@ -94,7 +94,8 @@
MetadataPreloadingNotPermitted = 1 << 9,
AutoPreloadingNotPermitted = 1 << 10,
InvisibleAutoplayNotPermitted = 1 << 11,
- OverrideUserGestureRequirementForMainContent = 1 << 12
+ OverrideUserGestureRequirementForMainContent = 1 << 12,
+ RequireUserGestureToControlControlsManager = 1 << 13,
};
typedef unsigned BehaviorRestrictions;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes