haikuwebkit/LayoutTests/media/media-usage-state.html

105 lines
5.0 KiB
HTML
Raw Permalink Normal View History

[macOS] Update ScreenTime as playback state changes https://bugs.webkit.org/show_bug.cgi?id=210518 <rdar://problem/61181092> Reviewed by Jer Noble. Source/WebCore: Test: media/media-usage-state.html Pass media element state to the UI process whenever it changes. * Headers.cmake: * WebCore.xcodeproj/project.pbxproj: * html/HTMLMediaElement.cpp: (WebCore::HTMLMediaElement::HTMLMediaElement): (WebCore::HTMLMediaElement::mediaSessionUniqueIdentifier const): * html/HTMLMediaElement.h: * html/MediaElementSession.cpp: (WebCore::MediaElementSession::MediaElementSession): (WebCore::MediaElementSession::~MediaElementSession): (WebCore::MediaElementSession::updateMediaUsageIfChanged): * html/MediaElementSession.h: * page/ChromeClient.h: (WebCore::ChromeClient::addMediaUsageManagerSession): (WebCore::ChromeClient::updateMediaUsageManagerSessionState): (WebCore::ChromeClient::removeMediaUsageManagerSession): * platform/audio/PlatformMediaSession.cpp: (WebCore::PlatformMediaSession::PlatformMediaSession): * platform/audio/PlatformMediaSession.h: (WebCore::PlatformMediaSession::updateMediaUsageIfChanged): (WebCore::PlatformMediaSession::mediaSessionIdentifier const): * platform/audio/PlatformMediaSessionManager.cpp: (WebCore::PlatformMediaSessionManager::updateNowPlayingInfoIfNecessary): * platform/audio/PlatformMediaSessionManager.h: (WebCore::PlatformMediaSessionManager::scheduleUpdateSessionStatus): (WebCore::PlatformMediaSessionManager::sessionDidEndRemoteScrubbing): (WebCore::PlatformMediaSessionManager::scheduleUpdateNowPlayingInfo): Deleted. * platform/audio/cocoa/MediaSessionManagerCocoa.h: * platform/audio/cocoa/MediaSessionManagerCocoa.mm: (WebCore::MediaSessionManagerCocoa::scheduleUpdateSessionStatus): (WebCore::MediaSessionManagerCocoa::sessionWillBeginPlayback): (WebCore::MediaSessionManagerCocoa::sessionDidEndRemoteScrubbing): (WebCore::MediaSessionManagerCocoa::removeSession): (WebCore::MediaSessionManagerCocoa::sessionWillEndPlayback): (WebCore::MediaSessionManagerCocoa::clientCharacteristicsChanged): (WebCore::MediaSessionManagerCocoa::sessionCanProduceAudioChanged): (WebCore::MediaSessionManagerCocoa::scheduleUpdateNowPlayingInfo): Deleted. * platform/audio/ios/MediaSessionManagerIOS.mm: (WebCore::MediaSessionManageriOS::resetRestrictions): (WebCore::MediaSessionManageriOS::sessionWillBeginPlayback): * platform/graphics/MediaUsageInfo.h: Added. (WebCore::MediaUsageInfo::operator== const): (WebCore::MediaUsageInfo::operator!= const): (WebCore::MediaUsageInfo::encode const): (WebCore::MediaUsageInfo::decode): * testing/Internals.cpp: (WebCore::Internals::setMediaElementRestrictions): (WebCore::Internals::mediaUsageState const): * testing/Internals.h: * testing/Internals.idl: Source/WebCore/PAL: Soft link the UsageTracking framework. * PAL.xcodeproj/project.pbxproj: * pal/cocoa/UsageTrackingSoftLink.h: Added. * pal/cocoa/UsageTrackingSoftLink.mm: Added. Source/WebKit: Add a manager that gets media element state changes, and a Cocoa-specific implementation that passes that state to ScreenTime. * Scripts/webkit/messages.py: * Sources.txt: * SourcesCocoa.txt: * UIProcess/Cocoa/WebPageProxyCocoa.mm: (WebKit::WebPageProxy::mediaUsageManager): (WebKit::WebPageProxy::addMediaUsageManagerSession): (WebKit::WebPageProxy::updateMediaUsageManagerSessionState): (WebKit::WebPageProxy::removeMediaUsageManagerSession): * UIProcess/Media/MediaUsageManager.cpp: Added. (WebKit::MediaUsageManager::create): (WebKit::reset): (WebKit::MediaUsageManager::addMediaSession): (WebKit::MediaUsageManager::removeMediaSession): (WebKit::MediaUsageManager::updateMediaUsage): * UIProcess/Media/MediaUsageManager.h: Added. * UIProcess/Media/cocoa/MediaUsageManagerCocoa.h: Added. (WebKit::MediaUsageManagerCocoa::SessionMediaUsage::SessionMediaUsage): * UIProcess/Media/cocoa/MediaUsageManagerCocoa.mm: Added. (WebKit::usageTrackingAvailable): (WebKit::MediaUsageManager::create): (WebKit::MediaUsageManagerCocoa::~MediaUsageManagerCocoa): (WebKit::MediaUsageManagerCocoa::reset): (WebKit::MediaUsageManagerCocoa::addMediaSession): (WebKit::MediaUsageManagerCocoa::removeMediaSession): (WebKit::MediaUsageManagerCocoa::updateMediaUsage): * UIProcess/WebAuthentication/AuthenticatorManager.cpp: * UIProcess/WebAuthentication/Mock/MockLocalConnection.mm: * UIProcess/WebPageProxy.cpp: * UIProcess/WebPageProxy.h: * UIProcess/WebPageProxy.messages.in: * WebKit.xcodeproj/project.pbxproj: * WebProcess/WebCoreSupport/WebChromeClient.cpp: (WebKit::WebChromeClient::addMediaUsageManagerSession): (WebKit::WebChromeClient::updateMediaUsageManagerSessionState): (WebKit::WebChromeClient::removeMediaUsageManagerSession): * WebProcess/WebCoreSupport/WebChromeClient.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::addMediaUsageManagerSession): (WebKit::WebPage::updateMediaUsageManagerSessionState): (WebKit::WebPage::removeMediaUsageManagerSession): * WebProcess/WebPage/WebPage.h: Source/WTF: Define HAVE_MEDIA_USAGE_FRAMEWORK and ENABLE_MEDIA_USAGE * wtf/PlatformEnableCocoa.h: * wtf/PlatformHave.h: LayoutTests: * media/media-usage-state-expected.txt: Added. * media/media-usage-state.html: Added. * platform/gtk/TestExpectations: Skip new test. * platform/win/TestExpectations: Ditto. * platform/wpe/TestExpectations: Ditto. Canonical link: https://commits.webkit.org/223468@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@260182 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2020-04-16 13:36:07 +00:00
<html>
<head>
<script src='media-file.js'></script>
<script src='video-test.js'></script>
<script>
let usage;
let videoURL;
window.addEventListener('load', async event => {
if (!window.internals) {
failTest(`<br>This test requires internals!`);
return;
}
findMediaElement();
run('internals.setMediaElementRestrictions(video, "RequireUserGestureForAudioRateChange,RequireUserGestureForVideoRateChange,RequireUserGestureToControlControlsManager")');
videoURL = findMediaFile("video", "content/test");
video.src = videoURL;
await waitFor(video, 'canplaythrough');
consoleWrite("<br>** Check state before playback.")
usage = internals.mediaUsageState(video);
testExpected(`usage.mediaURL.indexOf('${videoURL}')`, -1, '>');
testExpected('usage.isPlaying', false);
testExpected('usage.canShowControlsManager', false);
testExpected('usage.canShowNowPlayingControls', false);
testExpected('usage.isSuspended', false);
testExpected('usage.isInActiveDocument', true);
testExpected('usage.isFullscreen', false);
testExpected('usage.isMuted', false);
testExpected('usage.isMediaDocumentInMainFrame', false);
testExpected('usage.isVideo', true);
testExpected('usage.isAudio', false);
testExpected('usage.hasVideo', true);
testExpected('usage.hasAudio', true);
testExpected('usage.hasRenderer', true);
testExpected('usage.audioElementWithUserGesture', false);
testExpected('usage.userHasPlayedAudioBefore', false);
testExpected('usage.isElementRectMostlyInMainFrame', true);
testExpected('usage.playbackPermitted', false);
testExpected('usage.pageMediaPlaybackSuspended', false);
testExpected('usage.isMediaDocumentAndNotOwnerElement', false);
testExpected('usage.pageExplicitlyAllowsElementToAutoplayInline', false);
testExpected('usage.requiresFullscreenForVideoPlaybackAndFullscreenNotPermitted', false);
testExpected('usage.hasHadUserInteractionAndQuirksContainsShouldAutoplayForArbitraryUserGesture', false);
testExpected('usage.isVideoAndRequiresUserGestureForVideoRateChange', true);
testExpected('usage.isAudioAndRequiresUserGestureForAudioRateChange', false);
testExpected('usage.isVideoAndRequiresUserGestureForVideoDueToLowPowerMode', false);
testExpected('usage.noUserGestureRequired', false);
testExpected('usage.requiresPlaybackAndIsNotPlaying', false);
testExpected('usage.hasEverNotifiedAboutPlaying', false);
testExpected('usage.outsideOfFullscreen', false);
testExpected('usage.isLargeEnoughForMainContent', false);
consoleWrite("<br>** Mute video.")
run('video.muted = true');
usage = internals.mediaUsageState(video);
testExpected('usage.isMuted', true);
consoleWrite("<br>** Unmute video.")
run('video.muted = false');
usage = internals.mediaUsageState(video);
testExpected('usage.isMuted', false);
consoleWrite("<br>** Try to play without user gesture, should reject and state should not change.")
await shouldReject(video.play());
usage = internals.mediaUsageState(video);
testExpected('usage.isPlaying', false);
testExpected('usage.canShowControlsManager', false);
testExpected('usage.userHasPlayedAudioBefore', false);
testExpected('usage.playbackPermitted', false);
testExpected('usage.isVideoAndRequiresUserGestureForVideoRateChange', true);
testExpected('usage.noUserGestureRequired', false);
consoleWrite("<br>** Try to play without user gesture, should succeed and state should change.")
runWithKeyDown(() => {
video.play();
});
await waitFor(video, 'playing');
usage = internals.mediaUsageState(video);
testExpected('usage.isPlaying', true);
testExpected('usage.canShowControlsManager', true);
testExpected('usage.userHasPlayedAudioBefore', true);
testExpected('usage.playbackPermitted', true);
testExpected('usage.isVideoAndRequiresUserGestureForVideoRateChange', false);
testExpected('usage.noUserGestureRequired', true);
endTest();
});
</script>
</head>
<body>
<video controls></video>
<p>Test mediaUsageState.</p>
</body>
</html>