Title: [220085] trunk/Source/WebCore
- Revision
- 220085
- Author
- mra...@apple.com
- Date
- 2017-07-31 17:39:06 -0700 (Mon, 31 Jul 2017)
Log Message
Support quirk for letting media autoplay if the user interacted with at least one media element.
https://bugs.webkit.org/show_bug.cgi?id=175005
<rdar://problem/33476038>
Reviewed by Eric Carlson.
If the user has interacted with at least one media element, let other media elements auto-play
as a quirk.
* dom/Document.cpp:
(WebCore::Document::updateIsPlayingMedia):
* dom/Document.h:
(WebCore::Document::noteUserInteractionWithMediaElement):
* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::removeBehaviorsRestrictionsAfterFirstUserGesture):
* html/MediaElementSession.cpp:
(WebCore::needsDocumentLevelMediaUserGestureQuirk):
(WebCore::MediaElementSession::playbackPermitted const):
* page/MediaProducer.h:
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (220084 => 220085)
--- trunk/Source/WebCore/ChangeLog 2017-08-01 00:18:00 UTC (rev 220084)
+++ trunk/Source/WebCore/ChangeLog 2017-08-01 00:39:06 UTC (rev 220085)
@@ -1,3 +1,25 @@
+2017-07-31 Matt Rajca <mra...@apple.com>
+
+ Support quirk for letting media autoplay if the user interacted with at least one media element.
+ https://bugs.webkit.org/show_bug.cgi?id=175005
+ <rdar://problem/33476038>
+
+ Reviewed by Eric Carlson.
+
+ If the user has interacted with at least one media element, let other media elements auto-play
+ as a quirk.
+
+ * dom/Document.cpp:
+ (WebCore::Document::updateIsPlayingMedia):
+ * dom/Document.h:
+ (WebCore::Document::noteUserInteractionWithMediaElement):
+ * html/HTMLMediaElement.cpp:
+ (WebCore::HTMLMediaElement::removeBehaviorsRestrictionsAfterFirstUserGesture):
+ * html/MediaElementSession.cpp:
+ (WebCore::needsDocumentLevelMediaUserGestureQuirk):
+ (WebCore::MediaElementSession::playbackPermitted const):
+ * page/MediaProducer.h:
+
2017-07-31 Nan Wang <n_w...@apple.com>
AX: CFEqual is failing on text markers with exact same data
Modified: trunk/Source/WebCore/dom/Document.cpp (220084 => 220085)
--- trunk/Source/WebCore/dom/Document.cpp 2017-08-01 00:18:00 UTC (rev 220084)
+++ trunk/Source/WebCore/dom/Document.cpp 2017-08-01 00:39:06 UTC (rev 220085)
@@ -3630,6 +3630,9 @@
}
#endif
+ if (m_userHasInteractedWithMediaElement)
+ state |= MediaProducer::HasUserInteractedWithMediaElement;
+
if (state == m_mediaState)
return;
Modified: trunk/Source/WebCore/dom/Document.h (220084 => 220085)
--- trunk/Source/WebCore/dom/Document.h 2017-08-01 00:18:00 UTC (rev 220084)
+++ trunk/Source/WebCore/dom/Document.h 2017-08-01 00:39:06 UTC (rev 220085)
@@ -1279,6 +1279,7 @@
WEBCORE_EXPORT void addAudioProducer(MediaProducer*);
WEBCORE_EXPORT void removeAudioProducer(MediaProducer*);
MediaProducer::MediaStateFlags mediaState() const { return m_mediaState; }
+ void noteUserInteractionWithMediaElement() { m_userHasInteractedWithMediaElement = true; }
bool isCapturing() const { return MediaProducer::isCapturing(m_mediaState); }
WEBCORE_EXPORT void updateIsPlayingMedia(uint64_t = HTMLMediaElementInvalidID);
void pageMutedStateDidChange();
@@ -1736,6 +1737,7 @@
InheritedBool m_designMode { inherit };
MediaProducer::MediaStateFlags m_mediaState { MediaProducer::IsNotPlaying };
+ bool m_userHasInteractedWithMediaElement { false };
PageCacheState m_pageCacheState { NotInPageCache };
ReferrerPolicy m_referrerPolicy { ReferrerPolicy::Default };
ReadyState m_readyState { Complete };
Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (220084 => 220085)
--- trunk/Source/WebCore/html/HTMLMediaElement.cpp 2017-08-01 00:18:00 UTC (rev 220084)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp 2017-08-01 00:39:06 UTC (rev 220085)
@@ -6713,6 +6713,7 @@
| MediaElementSession::RequireUserGestureToControlControlsManager);
m_mediaSession->removeBehaviorRestriction(restrictionsToRemove);
+ document().topDocument().noteUserInteractionWithMediaElement();
}
void HTMLMediaElement::updateRateChangeRestrictions()
Modified: trunk/Source/WebCore/html/MediaElementSession.cpp (220084 => 220085)
--- trunk/Source/WebCore/html/MediaElementSession.cpp 2017-08-01 00:18:00 UTC (rev 220084)
+++ trunk/Source/WebCore/html/MediaElementSession.cpp 2017-08-01 00:39:06 UTC (rev 220085)
@@ -148,6 +148,26 @@
m_restrictions &= ~restriction;
}
+#if PLATFORM(MAC)
+static bool needsDocumentLevelMediaUserGestureQuirk(Document& document)
+{
+ if (!document.settings().needsSiteSpecificQuirks())
+ return false;
+
+ String host = document.topDocument().url().host();
+ if (equalLettersIgnoringASCIICase(host, "slate.com") || host.endsWithIgnoringASCIICase(".slate.com"))
+ return true;
+
+ if (equalLettersIgnoringASCIICase(host, "ign.com") || host.endsWithIgnoringASCIICase(".ign.com"))
+ return true;
+
+ if (equalLettersIgnoringASCIICase(host, "washingtonpost.com") || host.endsWithIgnoringASCIICase(".washingtonpost.com"))
+ return true;
+
+ return false;
+}
+#endif // PLATFORM(MAC)
+
SuccessOr<MediaPlaybackDenialReason> MediaElementSession::playbackPermitted(const HTMLMediaElement& element) const
{
if (element.document().isMediaDocument() && !element.document().ownerElement())
@@ -173,6 +193,11 @@
}
#endif
+#if PLATFORM(MAC)
+ if (element.document().topDocument().mediaState() & MediaProducer::HasUserInteractedWithMediaElement && needsDocumentLevelMediaUserGestureQuirk(element.document()))
+ return { };
+#endif
+
if (m_restrictions & RequireUserGestureForVideoRateChange && element.isVideo() && !element.document().processingUserGestureForMedia()) {
RELEASE_LOG(Media, "MediaElementSession::playbackPermitted - returning FALSE because of video rate change restriction");
return MediaPlaybackDenialReason::UserGestureRequired;
Modified: trunk/Source/WebCore/page/MediaProducer.h (220084 => 220085)
--- trunk/Source/WebCore/page/MediaProducer.h 2017-08-01 00:18:00 UTC (rev 220084)
+++ trunk/Source/WebCore/page/MediaProducer.h 2017-08-01 00:39:06 UTC (rev 220085)
@@ -48,6 +48,7 @@
HasMutedVideoCaptureDevice = 1 << 14,
HasInterruptedAudioCaptureDevice = 1 << 15,
HasInterruptedVideoCaptureDevice = 1 << 16,
+ HasUserInteractedWithMediaElement = 1 << 17,
AudioCaptureMask = HasActiveAudioCaptureDevice | HasMutedAudioCaptureDevice | HasInterruptedAudioCaptureDevice,
VideoCaptureMask = HasActiveVideoCaptureDevice | HasMutedVideoCaptureDevice | HasInterruptedVideoCaptureDevice,
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes