haikuwebkit/LayoutTests/media/remoteplayback-cancel-inval...

42 lines
1.2 KiB
HTML
Raw Permalink Normal View History

Implement the Remote Playback API. https://bugs.webkit.org/show_bug.cgi?id=162971 Reviewed by Youenn Fablet. Source/JavaScriptCore: Add RemotePlayback as a common identifier, needed for bindings due to "EnabledAtRuntime=RemotePlayback". * runtime/CommonIdentifiers.h: Source/WebCore: Tests: media/remoteplayback-cancel-invalid.html media/remoteplayback-prompt.html media/remoteplayback-target-availability.html media/remoteplayback-watch-disableremoteplayback.html imported/w3c/web-platform-tests/remote-playback/cancel-watch-availability.html imported/w3c/web-platform-tests/remote-playback/disable-remote-playback-cancel-watch-availability-throws.html imported/w3c/web-platform-tests/remote-playback/disable-remote-playback-prompt-throws.html imported/w3c/web-platform-tests/remote-playback/disable-remote-playback-watch-availability-throws.html imported/w3c/web-platform-tests/remote-playback/idlharness.window.html imported/w3c/web-platform-tests/remote-playback/watch-availability-initial-callback.html The Remote Playback API <https://w3c.github.io/remote-playback> allows page authors to control the presentation of <audio> and <video> elements to remote playback devices such as the Apple TV or Chromecast. WebKit already exposes a non-standardized API to initiate remote playback, and the Remote Playback API is largely congruent with the webkitShowPlaybackTargetPicker() API et. al. One addition provided by the Remote Playback API is an event in the case the user dismisses the picker UI without making a choice, so this concept needs to be plumbed through from the ChromeClient to the PlatformMediaSession. * DerivedSources.make: * Modules/mediasession/WebMediaSessionManager.cpp: (WebCore::WebMediaSessionManager::mockMediaPlaybackTargetPickerDismissPopup): (WebCore::WebMediaSessionManager::playbackTargetPickerWasDismissed): (WebCore::WebMediaSessionManager::configurePlaybackTargetClients): * Modules/mediasession/WebMediaSessionManager.h: * Modules/mediasession/WebMediaSessionManagerClient.h: * Modules/remoteplayback/HTMLMediaElementRemotePlayback.h: Added. (WebCore::HTMLMediaElementRemotePlayback::remote): (WebCore::HTMLMediaElementRemotePlayback::hasAttributeWithoutSynchronization): (WebCore::HTMLMediaElementRemotePlayback::setBooleanAttribute): * Modules/remoteplayback/HTMLMediaElementRemotePlayback.idl: Added. * Modules/remoteplayback/RemotePlayback.cpp: Added. (WebCore::RemotePlayback::create): (WebCore::RemotePlayback::RemotePlayback): (WebCore::RemotePlayback::~RemotePlayback): (WebCore::RemotePlayback::watchAvailability): (WebCore::RemotePlayback::cancelWatchAvailability): (WebCore::RemotePlayback::prompt): (WebCore::RemotePlayback::shouldPlayToRemoteTargetChanged): (WebCore::RemotePlayback::setState): (WebCore::RemotePlayback::establishConnection): (WebCore::RemotePlayback::disconnect): (WebCore::RemotePlayback::updateAvailability): (WebCore::RemotePlayback::playbackTargetPickerWasDismissed): (WebCore::RemotePlayback::isPlayingToRemoteTargetChanged): (WebCore::RemotePlayback::hasAvailabilityCallbacks): (WebCore::RemotePlayback::availabilityChanged): (WebCore::RemotePlayback::invalidate): (WebCore::RemotePlayback::activeDOMObjectName): (WebCore::RemotePlayback::canSuspendForDocumentSuspension): (WebCore::RemotePlayback::stop): * Modules/remoteplayback/RemotePlayback.h: Added. (WebCore::RemotePlayback::state): * Modules/remoteplayback/RemotePlayback.idl: Added. * Modules/remoteplayback/RemotePlaybackAvailabilityCallback.h: Added. (WebCore::RemotePlaybackAvailabilityCallback::~RemotePlaybackAvailabilityCallback): * Modules/remoteplayback/RemotePlaybackAvailabilityCallback.idl: Added. * WebCore.xcodeproj/project.pbxproj: * bindings/generic/RuntimeEnabledFeatures.h: (WebCore::RuntimeEnabledFeatures::setRemotePlaybackEnabled): (WebCore::RuntimeEnabledFeatures::remotePlaybackEnabled): * dom/Document.cpp: (WebCore::Document::playbackTargetPickerWasDismissed): * dom/Document.h: * dom/EventNames.h: * dom/EventTargetFactory.in: * html/HTMLAttributeNames.in: * html/HTMLMediaElement.cpp: (WebCore::HTMLMediaElement::HTMLMediaElement): (WebCore::HTMLMediaElement::~HTMLMediaElement): (WebCore::HTMLMediaElement::clearMediaPlayer): (WebCore::HTMLMediaElement::wirelessRoutesAvailableDidChange): (WebCore::HTMLMediaElement::mediaPlayerCurrentPlaybackTargetIsWirelessChanged): (WebCore::HTMLMediaElement::addEventListener): (WebCore::HTMLMediaElement::removeEventListener): (WebCore::HTMLMediaElement::setWirelessPlaybackTarget): (WebCore::HTMLMediaElement::playbackTargetPickerWasDismissed): (WebCore::HTMLMediaElement::remoteHasAvailabilityCallbacksChanged): (WebCore::HTMLMediaElement::createMediaPlayer): * html/HTMLMediaElement.h: (WebCore::HTMLMediaElement::remote): * html/MediaElementSession.cpp: (WebCore::MediaElementSession::wirelessVideoPlaybackDisabled): (WebCore::MediaElementSession::playbackTargetPickerWasDismissed): * html/MediaElementSession.h: * page/Page.cpp: (WebCore::Page::mockMediaPlaybackTargetPickerDismissPopup): (WebCore::Page::playbackTargetPickerWasDismissed): * page/Page.h: * page/Settings.in: * platform/audio/PlatformMediaSession.h: (WebCore::PlatformMediaSessionClient::playbackTargetPickerWasDismissed): * platform/graphics/MediaPlaybackTargetClient.h: * platform/graphics/MediaPlaybackTargetPicker.h: (WebCore::MediaPlaybackTargetPicker::playbackTargetPickerWasDismissed): * platform/graphics/avfoundation/objc/MediaPlaybackTargetPickerMac.mm: (WebCore::MediaPlaybackTargetPickerMac::showPlaybackTargetPicker): * platform/mock/MediaPlaybackTargetPickerMock.cpp: (WebCore::MediaPlaybackTargetPickerMock::dismissPopup): * platform/mock/MediaPlaybackTargetPickerMock.h: * testing/Internals.cpp: (WebCore::Internals::mockMediaPlaybackTargetPickerDismissPopup): * testing/Internals.h: * testing/Internals.idl: Source/WebKit: Add a preference to enable the Remote Playback API. Pass the playbackTargetPickerWasDismissed() notification on to Page. * Shared/WebPreferencesDefinitions.h: * UIProcess/API/C/WKPreferences.cpp: (WKPreferencesGetRemotePlaybackEnabled): (WKPreferencesSetRemotePlaybackEnabled): * UIProcess/API/C/WKPreferencesRef.h: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::playbackTargetPickerWasDismissed): * UIProcess/WebPageProxy.h: * WebProcess/WebCoreSupport/WebChromeClient.cpp: (WebKit::WebChromeClient::mockMediaPlaybackTargetPickerDismissPopup): * WebProcess/WebCoreSupport/WebChromeClient.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::updatePreferences): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * WebProcess/WebPage/mac/WebPageMac.mm: (WebKit::WebPage::playbackTargetPickerWasDismissed): Tools: Enable RemotePlayback for DumpRenderTree and WebKitTestRunner. * DumpRenderTree/mac/DumpRenderTree.mm: (resetWebPreferencesToConsistentValues): * WebKitTestRunner/TestController.cpp: (WTR::TestController::resetPreferencesToConsistentValues): LayoutTests: * media/remoteplayback-cancel-invalid-expected.txt: Added. * media/remoteplayback-cancel-invalid.html: Added. * media/remoteplayback-prompt-expected.txt: Added. * media/remoteplayback-prompt.html: Added. * media/remoteplayback-target-availability-expected.txt: Added. * media/remoteplayback-target-availability.html: Added. * media/remoteplayback-watch-disableremoteplayback-expected.txt: Added. * media/remoteplayback-watch-disableremoteplayback.html: Added. * platform/ios-wk2/TestExpectations: Canonical link: https://commits.webkit.org/216954@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@251737 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-10-29 21:54:07 +00:00
<html>
<head>
<script src='media-file.js'></script>
<script src='video-test.js'></script>
<script>
var video;
function start()
{
findMediaElement();
if (window.internals) {
internals.setMockMediaPlaybackTargetPickerEnabled(true);
internals.settings.setAllowsAirPlayForMediaPlayback(true);
}
consoleWrite('** create initial callback');
video.remote.watchAvailability(callback).then(cancelInvalid);
}
function callback(available) { };
function cancelInvalid(id)
{
consoleWrite('** pass invalid id to cancelWatchAvailability');
video.remote.cancelWatchAvailability(id + 1).catch(handleError);
}
function handleError(exception)
{
consoleWrite(`EXPECTED ERROR: ${ exception }`);
endTest();
}
</script>
</head>
<body onload='start()'>
<video controls></video>
<p>Test that passing an invalid id to cancelWatchAvailability will generate an error.</p>
</body>
</html>