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

Reply via email to