Don't override _allowsMediaDocumentInlinePlayback in MediaDocument with playsinlineAttr.
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 28 Jul 2017 04:41:14 +0000 (04:41 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 28 Jul 2017 04:41:14 +0000 (04:41 +0000)
https://bugs.webkit.org/show_bug.cgi?id=174850
rdar://problem/33449903

Patch by Jeremy Jones <jeremyj@apple.com> on 2017-07-27
Reviewed by Jon Lee.

This change removes playsinlineAttr from MediaDocument so that it doesn't override the setting
from _allowsMediaDocumentInlinePlayback. In its place is an update to requiresFullscreenForVideoPlayback
that implements the details of exactly which media documents are still allowed to play inlne.

Media documents always use a video element; but when there are no video tracks, it has behavior like
an audio element. See media-controller.js isAudio().

This change preserves this behavior with respect to fullscreen requirements for media document by
mirroring the isAudio() check in requiresFullscreenForVideoPlayback.

* html/MediaDocument.cpp:
(WebCore::MediaDocumentParser::createDocumentStructure):
* html/MediaElementSession.cpp:
(WebCore::MediaElementSession::requiresFullscreenForVideoPlayback):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@219992 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/html/MediaDocument.cpp
Source/WebCore/html/MediaElementSession.cpp

index eb887503b212d7ca3891af86165b0b4ff4f0b55f..2a19fa6f35bed8bb33401c800501f8985049078d 100644 (file)
@@ -1,3 +1,26 @@
+2017-07-27  Jeremy Jones  <jeremyj@apple.com>
+
+        Don't override _allowsMediaDocumentInlinePlayback in MediaDocument with playsinlineAttr.
+        https://bugs.webkit.org/show_bug.cgi?id=174850
+        rdar://problem/33449903
+
+        Reviewed by Jon Lee.
+
+        This change removes playsinlineAttr from MediaDocument so that it doesn't override the setting
+        from _allowsMediaDocumentInlinePlayback. In its place is an update to requiresFullscreenForVideoPlayback
+        that implements the details of exactly which media documents are still allowed to play inlne.
+
+        Media documents always use a video element; but when there are no video tracks, it has behavior like 
+        an audio element. See media-controller.js isAudio().
+
+        This change preserves this behavior with respect to fullscreen requirements for media document by
+        mirroring the isAudio() check in requiresFullscreenForVideoPlayback.
+
+        * html/MediaDocument.cpp:
+        (WebCore::MediaDocumentParser::createDocumentStructure):
+        * html/MediaElementSession.cpp:
+        (WebCore::MediaElementSession::requiresFullscreenForVideoPlayback):
+
 2017-07-27  Jeremy Jones  <jeremyj@apple.com>
 
         MediaDocument fullscreen pinch gesture should trigger navigate back.
index 37dfbd9d868d3216a28c27b8b1d63e980f6e5224..b5c2229749376dd10c17ed710c6bacc44488a938 100644 (file)
@@ -108,7 +108,6 @@ void MediaDocumentParser::createDocumentStructure()
     m_mediaElement = videoElement.ptr();
     videoElement->setAttributeWithoutSynchronization(controlsAttr, emptyAtom());
     videoElement->setAttributeWithoutSynchronization(autoplayAttr, emptyAtom());
-    videoElement->setAttributeWithoutSynchronization(playsinlineAttr, emptyAtom());
     videoElement->setAttributeWithoutSynchronization(srcAttr, document.url().string());
     if (auto* loader = document.loader())
         videoElement->setAttributeWithoutSynchronization(typeAttr, loader->responseMIMEType());
index f6f863d106dfe41414af9bfc59a8851c1d9a7afb..41cebb12cfaafbf943c56ebfc29e7a3ea9deb902 100644 (file)
@@ -560,6 +560,13 @@ bool MediaElementSession::requiresFullscreenForVideoPlayback(const HTMLMediaElem
     if (is<HTMLAudioElement>(element))
         return false;
 
+    if (element.document().isMediaDocument()) {
+        ASSERT(is<HTMLVideoElement>(element));
+        const HTMLVideoElement& videoElement = *downcast<const HTMLVideoElement>(&element);
+        if (element.readyState() < HTMLVideoElement::HAVE_METADATA || !videoElement.hasEverHadVideo())
+            return false;
+    }
+
     if (element.isTemporarilyAllowingInlinePlaybackAfterFullscreen())
         return false;
 
@@ -575,6 +582,10 @@ bool MediaElementSession::requiresFullscreenForVideoPlayback(const HTMLMediaElem
     if (dyld_get_program_sdk_version() < DYLD_IOS_VERSION_10_0)
         return !element.hasAttributeWithoutSynchronization(HTMLNames::webkit_playsinlineAttr);
 #endif
+
+    if (element.document().isMediaDocument() && element.document().ownerElement())
+        return false;
+
     return !element.hasAttributeWithoutSynchronization(HTMLNames::playsinlineAttr);
 }