haikuwebkit/LayoutTests/media/picture-in-picture/picture-in-picture-interrup...

47 lines
1.4 KiB
HTML
Raw Permalink Normal View History

<!DOCTYPE html>
<html>
<head>
Entering/Exiting Picture-in-Picture mode through webkitSetPresentationMode() does not fire events (enterpictureinpicture and leavepictureinpicture) defined in the spec https://bugs.webkit.org/show_bug.cgi?id=203989 Patch by Peng Liu <peng.liu6@apple.com> on 2019-11-08 Reviewed by Eric Carlson. Source/WebCore: Instantiate a HTMLVideoElementPictureInPicture object when we create a new video element so that the events defined in the spec will be fired no matter which interface is used to enter/exit the Picture-in-Picture mode. Test: media/picture-in-picture/picture-in-picture-events.html * Modules/pictureinpicture/HTMLVideoElementPictureInPicture.cpp: (WebCore::HTMLVideoElementPictureInPicture::providePictureInPictureTo): * Modules/pictureinpicture/HTMLVideoElementPictureInPicture.h: * WebCore.xcodeproj/project.pbxproj: * html/HTMLVideoElement.cpp: (WebCore::HTMLVideoElement::create): LayoutTests: Move all layout tests for Picture-in-Picture to folder media/picture-in-picture. Add a layout test to verify the events defined in the spec are fired when we call the webkit prefixed API. Update TestExpectations files since webkit.org/b/203614 has been fixed. * TestExpectations: * media/picture-in-picture/picture-in-picture-api-element-attributes-expected.txt: Renamed from LayoutTests/media/picture-in-picture-api-element-attributes-expected.txt. * media/picture-in-picture/picture-in-picture-api-element-attributes.html: Renamed from LayoutTests/media/picture-in-picture-api-element-attributes.html. * media/picture-in-picture/picture-in-picture-api-enter-pip-1-expected.txt: Renamed from LayoutTests/media/picture-in-picture-api-enter-pip-1-expected.txt. * media/picture-in-picture/picture-in-picture-api-enter-pip-1.html: Renamed from LayoutTests/media/picture-in-picture-api-enter-pip-1.html. * media/picture-in-picture/picture-in-picture-api-enter-pip-2-expected.txt: Renamed from LayoutTests/media/picture-in-picture-api-enter-pip-2-expected.txt. * media/picture-in-picture/picture-in-picture-api-enter-pip-2.html: Renamed from LayoutTests/media/picture-in-picture-api-enter-pip-2.html. * media/picture-in-picture/picture-in-picture-api-enter-pip-3-expected.txt: Renamed from LayoutTests/media/picture-in-picture-api-enter-pip-3-expected.txt. * media/picture-in-picture/picture-in-picture-api-enter-pip-3.html: Renamed from LayoutTests/media/picture-in-picture-api-enter-pip-3.html. * media/picture-in-picture/picture-in-picture-api-enter-pip-4-expected.txt: Renamed from LayoutTests/media/picture-in-picture-api-enter-pip-4-expected.txt. * media/picture-in-picture/picture-in-picture-api-enter-pip-4.html: Renamed from LayoutTests/media/picture-in-picture-api-enter-pip-4.html. * media/picture-in-picture/picture-in-picture-api-events-expected.txt: Renamed from LayoutTests/media/picture-in-picture-api-pip-events-expected.txt. * media/picture-in-picture/picture-in-picture-api-events.html: Renamed from LayoutTests/media/picture-in-picture-api-pip-events.html. * media/picture-in-picture/picture-in-picture-api-exit-pip-1-expected.txt: Renamed from LayoutTests/media/picture-in-picture-api-exit-pip-1-expected.txt. * media/picture-in-picture/picture-in-picture-api-exit-pip-1.html: Renamed from LayoutTests/media/picture-in-picture-api-exit-pip-1.html. * media/picture-in-picture/picture-in-picture-api-exit-pip-2-expected.txt: Renamed from LayoutTests/media/picture-in-picture-api-exit-pip-2-expected.txt. * media/picture-in-picture/picture-in-picture-api-exit-pip-2.html: Renamed from LayoutTests/media/picture-in-picture-api-exit-pip-2.html. * media/picture-in-picture/picture-in-picture-api-pip-window-expected.txt: Renamed from LayoutTests/media/picture-in-picture-api-pip-window-expected.txt. * media/picture-in-picture/picture-in-picture-api-pip-window.html: Renamed from LayoutTests/media/picture-in-picture-api-pip-window.html. * media/picture-in-picture/picture-in-picture-events-expected.txt: Added. * media/picture-in-picture/picture-in-picture-events.html: Added. * media/picture-in-picture/picture-in-picture-interruption-expected.txt: Renamed from LayoutTests/media/picture-in-picture-interruption-expected.txt. * media/picture-in-picture/picture-in-picture-interruption.html: Renamed from LayoutTests/media/picture-in-picture-interruption.html. * platform/gtk/TestExpectations: * platform/ios/TestExpectations: * platform/ipad/TestExpectations: * platform/mac-wk2/TestExpectations: Canonical link: https://commits.webkit.org/217359@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@252276 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-11-09 00:39:29 +00:00
<script src="../video-test.js"></script>
<script src="../media-file.js"></script>
<script>
window.addEventListener('load', async event => {
Fix issues of the Picture-in-Picture API under stress tests https://bugs.webkit.org/show_bug.cgi?id=212191 Reviewed by Eric Carlson. Source/WebCore: The current implementation of the Picture-in-Picture API is not robust under stress tests. Changing the video presentation mode of a video element between inline and picture-in-picture continuously may corrupt the internal states of the video element. This patch refactors the approach to tracking the progress of video presentation mode changes and make sure no new requestPictureInPicture() or exitPictureInPicture() will trigger a presentation mode change unless the previous operations are completed. This patch also removes the code for testing purposes in the HTMLVideoElement class. Covered by existing tests. * html/HTMLMediaElement.h: * html/HTMLVideoElement.cpp: (WebCore::toPresentationMode): (WebCore::HTMLVideoElement::setFullscreenMode): (WebCore::HTMLVideoElement::fullscreenModeChanged): (WebCore::HTMLVideoElement::didEnterFullscreen): (WebCore::HTMLVideoElement::didExitFullscreen): (WebCore::HTMLVideoElement::setPictureInPictureObserver): (WebCore::HTMLVideoElement::setVideoFullscreenFrame): (WebCore::HTMLVideoElement::didBecomeFullscreenElement): Deleted. (WebCore::HTMLVideoElement::setPictureInPictureAPITestEnabled): Deleted. * html/HTMLVideoElement.h: * testing/Internals.cpp: (WebCore::Internals::setPictureInPictureAPITestEnabled): Deleted. * testing/Internals.h: * testing/Internals.idl: Remove setPictureInPictureAPITestEnabled(). Source/WebKit: * UIProcess/Cocoa/VideoFullscreenManagerProxy.mm: (WebKit::VideoFullscreenManagerProxy::enterFullscreen): Mock the behavior of the VideoFullscreenInterface[AVKit|Mac] regarding the Picture-in-Picture mode support. * WebProcess/cocoa/VideoFullscreenManager.mm: (WebKit::VideoFullscreenManager::didEnterFullscreen): (WebKit::VideoFullscreenManager::didCleanupFullscreen): Add callbacks for the end of entering/exiting fullscreen. LayoutTests: Refactor the layout tests for the Picture-in-Picture API with the Mock VideoPresentation Mode. * media/picture-in-picture/picture-in-picture-api-css-selector-expected.txt: * media/picture-in-picture/picture-in-picture-api-css-selector.html: * media/picture-in-picture/picture-in-picture-api-enter-pip-1-expected.txt: * media/picture-in-picture/picture-in-picture-api-enter-pip-1.html: * media/picture-in-picture/picture-in-picture-api-enter-pip-2-expected.txt: * media/picture-in-picture/picture-in-picture-api-enter-pip-2.html: * media/picture-in-picture/picture-in-picture-api-enter-pip-3-expected.txt: * media/picture-in-picture/picture-in-picture-api-enter-pip-3.html: * media/picture-in-picture/picture-in-picture-api-enter-pip-4-expected.txt: * media/picture-in-picture/picture-in-picture-api-enter-pip-4.html: * media/picture-in-picture/picture-in-picture-api-events-expected.txt: * media/picture-in-picture/picture-in-picture-api-events.html: * media/picture-in-picture/picture-in-picture-api-exit-pip-1-expected.txt: * media/picture-in-picture/picture-in-picture-api-exit-pip-1.html: * media/picture-in-picture/picture-in-picture-api-exit-pip-2-expected.txt: * media/picture-in-picture/picture-in-picture-api-exit-pip-2.html: * media/picture-in-picture/picture-in-picture-api-pip-window-expected.txt: * media/picture-in-picture/picture-in-picture-api-pip-window.html: * media/picture-in-picture/picture-in-picture-events-expected.txt: * media/picture-in-picture/picture-in-picture-events.html: * media/picture-in-picture/picture-in-picture-interruption-expected.txt: * media/picture-in-picture/picture-in-picture-interruption.html: Canonical link: https://commits.webkit.org/225106@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@262038 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2020-05-22 00:20:29 +00:00
if (!window.internals) {
failTest('This test requires window.internals.');
return;
}
findMediaElement();
run('internals.settings.setAllowsPictureInPictureMediaPlayback(true)');
Fix issues of the Picture-in-Picture API under stress tests https://bugs.webkit.org/show_bug.cgi?id=212191 Reviewed by Eric Carlson. Source/WebCore: The current implementation of the Picture-in-Picture API is not robust under stress tests. Changing the video presentation mode of a video element between inline and picture-in-picture continuously may corrupt the internal states of the video element. This patch refactors the approach to tracking the progress of video presentation mode changes and make sure no new requestPictureInPicture() or exitPictureInPicture() will trigger a presentation mode change unless the previous operations are completed. This patch also removes the code for testing purposes in the HTMLVideoElement class. Covered by existing tests. * html/HTMLMediaElement.h: * html/HTMLVideoElement.cpp: (WebCore::toPresentationMode): (WebCore::HTMLVideoElement::setFullscreenMode): (WebCore::HTMLVideoElement::fullscreenModeChanged): (WebCore::HTMLVideoElement::didEnterFullscreen): (WebCore::HTMLVideoElement::didExitFullscreen): (WebCore::HTMLVideoElement::setPictureInPictureObserver): (WebCore::HTMLVideoElement::setVideoFullscreenFrame): (WebCore::HTMLVideoElement::didBecomeFullscreenElement): Deleted. (WebCore::HTMLVideoElement::setPictureInPictureAPITestEnabled): Deleted. * html/HTMLVideoElement.h: * testing/Internals.cpp: (WebCore::Internals::setPictureInPictureAPITestEnabled): Deleted. * testing/Internals.h: * testing/Internals.idl: Remove setPictureInPictureAPITestEnabled(). Source/WebKit: * UIProcess/Cocoa/VideoFullscreenManagerProxy.mm: (WebKit::VideoFullscreenManagerProxy::enterFullscreen): Mock the behavior of the VideoFullscreenInterface[AVKit|Mac] regarding the Picture-in-Picture mode support. * WebProcess/cocoa/VideoFullscreenManager.mm: (WebKit::VideoFullscreenManager::didEnterFullscreen): (WebKit::VideoFullscreenManager::didCleanupFullscreen): Add callbacks for the end of entering/exiting fullscreen. LayoutTests: Refactor the layout tests for the Picture-in-Picture API with the Mock VideoPresentation Mode. * media/picture-in-picture/picture-in-picture-api-css-selector-expected.txt: * media/picture-in-picture/picture-in-picture-api-css-selector.html: * media/picture-in-picture/picture-in-picture-api-enter-pip-1-expected.txt: * media/picture-in-picture/picture-in-picture-api-enter-pip-1.html: * media/picture-in-picture/picture-in-picture-api-enter-pip-2-expected.txt: * media/picture-in-picture/picture-in-picture-api-enter-pip-2.html: * media/picture-in-picture/picture-in-picture-api-enter-pip-3-expected.txt: * media/picture-in-picture/picture-in-picture-api-enter-pip-3.html: * media/picture-in-picture/picture-in-picture-api-enter-pip-4-expected.txt: * media/picture-in-picture/picture-in-picture-api-enter-pip-4.html: * media/picture-in-picture/picture-in-picture-api-events-expected.txt: * media/picture-in-picture/picture-in-picture-api-events.html: * media/picture-in-picture/picture-in-picture-api-exit-pip-1-expected.txt: * media/picture-in-picture/picture-in-picture-api-exit-pip-1.html: * media/picture-in-picture/picture-in-picture-api-exit-pip-2-expected.txt: * media/picture-in-picture/picture-in-picture-api-exit-pip-2.html: * media/picture-in-picture/picture-in-picture-api-pip-window-expected.txt: * media/picture-in-picture/picture-in-picture-api-pip-window.html: * media/picture-in-picture/picture-in-picture-events-expected.txt: * media/picture-in-picture/picture-in-picture-events.html: * media/picture-in-picture/picture-in-picture-interruption-expected.txt: * media/picture-in-picture/picture-in-picture-interruption.html: Canonical link: https://commits.webkit.org/225106@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@262038 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2020-05-22 00:20:29 +00:00
run('internals.setMockVideoPresentationModeEnabled(true)');
Entering/Exiting Picture-in-Picture mode through webkitSetPresentationMode() does not fire events (enterpictureinpicture and leavepictureinpicture) defined in the spec https://bugs.webkit.org/show_bug.cgi?id=203989 Patch by Peng Liu <peng.liu6@apple.com> on 2019-11-08 Reviewed by Eric Carlson. Source/WebCore: Instantiate a HTMLVideoElementPictureInPicture object when we create a new video element so that the events defined in the spec will be fired no matter which interface is used to enter/exit the Picture-in-Picture mode. Test: media/picture-in-picture/picture-in-picture-events.html * Modules/pictureinpicture/HTMLVideoElementPictureInPicture.cpp: (WebCore::HTMLVideoElementPictureInPicture::providePictureInPictureTo): * Modules/pictureinpicture/HTMLVideoElementPictureInPicture.h: * WebCore.xcodeproj/project.pbxproj: * html/HTMLVideoElement.cpp: (WebCore::HTMLVideoElement::create): LayoutTests: Move all layout tests for Picture-in-Picture to folder media/picture-in-picture. Add a layout test to verify the events defined in the spec are fired when we call the webkit prefixed API. Update TestExpectations files since webkit.org/b/203614 has been fixed. * TestExpectations: * media/picture-in-picture/picture-in-picture-api-element-attributes-expected.txt: Renamed from LayoutTests/media/picture-in-picture-api-element-attributes-expected.txt. * media/picture-in-picture/picture-in-picture-api-element-attributes.html: Renamed from LayoutTests/media/picture-in-picture-api-element-attributes.html. * media/picture-in-picture/picture-in-picture-api-enter-pip-1-expected.txt: Renamed from LayoutTests/media/picture-in-picture-api-enter-pip-1-expected.txt. * media/picture-in-picture/picture-in-picture-api-enter-pip-1.html: Renamed from LayoutTests/media/picture-in-picture-api-enter-pip-1.html. * media/picture-in-picture/picture-in-picture-api-enter-pip-2-expected.txt: Renamed from LayoutTests/media/picture-in-picture-api-enter-pip-2-expected.txt. * media/picture-in-picture/picture-in-picture-api-enter-pip-2.html: Renamed from LayoutTests/media/picture-in-picture-api-enter-pip-2.html. * media/picture-in-picture/picture-in-picture-api-enter-pip-3-expected.txt: Renamed from LayoutTests/media/picture-in-picture-api-enter-pip-3-expected.txt. * media/picture-in-picture/picture-in-picture-api-enter-pip-3.html: Renamed from LayoutTests/media/picture-in-picture-api-enter-pip-3.html. * media/picture-in-picture/picture-in-picture-api-enter-pip-4-expected.txt: Renamed from LayoutTests/media/picture-in-picture-api-enter-pip-4-expected.txt. * media/picture-in-picture/picture-in-picture-api-enter-pip-4.html: Renamed from LayoutTests/media/picture-in-picture-api-enter-pip-4.html. * media/picture-in-picture/picture-in-picture-api-events-expected.txt: Renamed from LayoutTests/media/picture-in-picture-api-pip-events-expected.txt. * media/picture-in-picture/picture-in-picture-api-events.html: Renamed from LayoutTests/media/picture-in-picture-api-pip-events.html. * media/picture-in-picture/picture-in-picture-api-exit-pip-1-expected.txt: Renamed from LayoutTests/media/picture-in-picture-api-exit-pip-1-expected.txt. * media/picture-in-picture/picture-in-picture-api-exit-pip-1.html: Renamed from LayoutTests/media/picture-in-picture-api-exit-pip-1.html. * media/picture-in-picture/picture-in-picture-api-exit-pip-2-expected.txt: Renamed from LayoutTests/media/picture-in-picture-api-exit-pip-2-expected.txt. * media/picture-in-picture/picture-in-picture-api-exit-pip-2.html: Renamed from LayoutTests/media/picture-in-picture-api-exit-pip-2.html. * media/picture-in-picture/picture-in-picture-api-pip-window-expected.txt: Renamed from LayoutTests/media/picture-in-picture-api-pip-window-expected.txt. * media/picture-in-picture/picture-in-picture-api-pip-window.html: Renamed from LayoutTests/media/picture-in-picture-api-pip-window.html. * media/picture-in-picture/picture-in-picture-events-expected.txt: Added. * media/picture-in-picture/picture-in-picture-events.html: Added. * media/picture-in-picture/picture-in-picture-interruption-expected.txt: Renamed from LayoutTests/media/picture-in-picture-interruption-expected.txt. * media/picture-in-picture/picture-in-picture-interruption.html: Renamed from LayoutTests/media/picture-in-picture-interruption.html. * platform/gtk/TestExpectations: * platform/ios/TestExpectations: * platform/ipad/TestExpectations: * platform/mac-wk2/TestExpectations: Canonical link: https://commits.webkit.org/217359@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@252276 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-11-09 00:39:29 +00:00
run('video.src = findMediaFile("video", "../content/test")');
await waitFor(video, 'canplaythrough');
run('video.play()');
await waitFor(video, 'playing');
Fix issues of the Picture-in-Picture API under stress tests https://bugs.webkit.org/show_bug.cgi?id=212191 Reviewed by Eric Carlson. Source/WebCore: The current implementation of the Picture-in-Picture API is not robust under stress tests. Changing the video presentation mode of a video element between inline and picture-in-picture continuously may corrupt the internal states of the video element. This patch refactors the approach to tracking the progress of video presentation mode changes and make sure no new requestPictureInPicture() or exitPictureInPicture() will trigger a presentation mode change unless the previous operations are completed. This patch also removes the code for testing purposes in the HTMLVideoElement class. Covered by existing tests. * html/HTMLMediaElement.h: * html/HTMLVideoElement.cpp: (WebCore::toPresentationMode): (WebCore::HTMLVideoElement::setFullscreenMode): (WebCore::HTMLVideoElement::fullscreenModeChanged): (WebCore::HTMLVideoElement::didEnterFullscreen): (WebCore::HTMLVideoElement::didExitFullscreen): (WebCore::HTMLVideoElement::setPictureInPictureObserver): (WebCore::HTMLVideoElement::setVideoFullscreenFrame): (WebCore::HTMLVideoElement::didBecomeFullscreenElement): Deleted. (WebCore::HTMLVideoElement::setPictureInPictureAPITestEnabled): Deleted. * html/HTMLVideoElement.h: * testing/Internals.cpp: (WebCore::Internals::setPictureInPictureAPITestEnabled): Deleted. * testing/Internals.h: * testing/Internals.idl: Remove setPictureInPictureAPITestEnabled(). Source/WebKit: * UIProcess/Cocoa/VideoFullscreenManagerProxy.mm: (WebKit::VideoFullscreenManagerProxy::enterFullscreen): Mock the behavior of the VideoFullscreenInterface[AVKit|Mac] regarding the Picture-in-Picture mode support. * WebProcess/cocoa/VideoFullscreenManager.mm: (WebKit::VideoFullscreenManager::didEnterFullscreen): (WebKit::VideoFullscreenManager::didCleanupFullscreen): Add callbacks for the end of entering/exiting fullscreen. LayoutTests: Refactor the layout tests for the Picture-in-Picture API with the Mock VideoPresentation Mode. * media/picture-in-picture/picture-in-picture-api-css-selector-expected.txt: * media/picture-in-picture/picture-in-picture-api-css-selector.html: * media/picture-in-picture/picture-in-picture-api-enter-pip-1-expected.txt: * media/picture-in-picture/picture-in-picture-api-enter-pip-1.html: * media/picture-in-picture/picture-in-picture-api-enter-pip-2-expected.txt: * media/picture-in-picture/picture-in-picture-api-enter-pip-2.html: * media/picture-in-picture/picture-in-picture-api-enter-pip-3-expected.txt: * media/picture-in-picture/picture-in-picture-api-enter-pip-3.html: * media/picture-in-picture/picture-in-picture-api-enter-pip-4-expected.txt: * media/picture-in-picture/picture-in-picture-api-enter-pip-4.html: * media/picture-in-picture/picture-in-picture-api-events-expected.txt: * media/picture-in-picture/picture-in-picture-api-events.html: * media/picture-in-picture/picture-in-picture-api-exit-pip-1-expected.txt: * media/picture-in-picture/picture-in-picture-api-exit-pip-1.html: * media/picture-in-picture/picture-in-picture-api-exit-pip-2-expected.txt: * media/picture-in-picture/picture-in-picture-api-exit-pip-2.html: * media/picture-in-picture/picture-in-picture-api-pip-window-expected.txt: * media/picture-in-picture/picture-in-picture-api-pip-window.html: * media/picture-in-picture/picture-in-picture-events-expected.txt: * media/picture-in-picture/picture-in-picture-events.html: * media/picture-in-picture/picture-in-picture-interruption-expected.txt: * media/picture-in-picture/picture-in-picture-interruption.html: Canonical link: https://commits.webkit.org/225106@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@262038 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2020-05-22 00:20:29 +00:00
runWithKeyDown(() => {
video.webkitSetPresentationMode('picture-in-picture');
});
await waitFor(video, 'webkitpresentationmodechanged');
run('internals.beginMediaSessionInterruption("enteringbackground")');
testExpected('internals.mediaSessionState(video)', 'Playing');
run('internals.endMediaSessionInterruption("enteringbackground")');
testExpected('internals.mediaSessionState(video)', 'Playing');
endTest();
});
</script>
</head>
<body>
<div>This tests that video is in the correct media session state after ending a background interruption while pipped.</div>
<video controls></video>
</body>
</html>