haikuwebkit/LayoutTests/media/media-session/mock-coordinator-expected.txt

223 lines
9.1 KiB
Plaintext
Raw Permalink Normal View History

[Cocoa] Add Experimental MediaSession coordinator https://bugs.webkit.org/show_bug.cgi?id=222158 <rdar://problem/74508862> Reviewed by Jer Noble. Source/WebCore: Add an experimental MediaSession coordinator, an object that provides an interface that allows script to coordinate changes to MediaSession with the User Agent. Also add an experimental MediaSession playlist interface. The changes are behind new experimental feature flags, MediaSessionCoordinatorEnabled and MediaSessionPlaylistEnabled. Test: media/media-session/mock-coordinator.html * DerivedSources-input.xcfilelist: Add new IDL files. * DerivedSources-output.xcfilelist: Add new derived sources. * DerivedSources.make: Add new IDL. * Modules/mediasession/MediaMetadata.cpp: (WebCore::MediaMetadata::create): Set trackIdentifier from init data. (WebCore::MediaMetadata::setTrackIdentifier): trackIdentifier setter. * Modules/mediasession/MediaMetadata.h: (WebCore::MediaMetadata::trackIdentifier const): * Modules/mediasession/MediaMetadata.idl: * Modules/mediasession/MediaMetadataInit.h: Add trackIdentifier. (WebCore::MediaMetadataInit::encode const): (WebCore::MediaMetadataInit::decode): * Modules/mediasession/MediaMetadataInit.idl: * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Initialize MainThreadGenericEventQueue. (WebCore::MediaSession::setMetadata): metadataUpdated -> notifyMetadataObservers. (WebCore::MediaSession::setReadyState): Session readyState setter. (WebCore::MediaSession::setCoordinator): Coordinator setter. Post 'coordinatorchange' event after change. (WebCore::MediaSession::setPlaylist): Playlist setter. (WebCore::MediaSession::setActionHandler): Call notifyActionHandlerObservers. (WebCore::MediaSession::setPositionState): Call notifyPositionStateObservers. (WebCore::MediaSession::metadataUpdated): Call notifyMetadataObservers. (WebCore::MediaSession::addObserver): New. (WebCore::MediaSession::removeObserver): New. (WebCore::MediaSession::forEachObserver): New. (WebCore::MediaSession::notifyMetadataObservers): New. (WebCore::MediaSession::notifyPositionStateObservers): New. (WebCore::MediaSession::notifyPlaybackStateObservers): New. (WebCore::MediaSession::notifyActionHandlerObservers): New. (WebCore::MediaSession::notifyReadyStateObservers): New. * Modules/mediasession/MediaSession.h: (WebCore::MediaSession::coordinator const): (WebCore::MediaSession::playlist const): (WebCore::MediaSession::logger const): * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionAction.h: * Modules/mediasession/MediaSessionAction.idl: * Modules/mediasession/MediaSessionActionDetails.h: * Modules/mediasession/MediaSessionActionDetails.idl: MediaSessionCoordinator proxies calls through the PlatformMediaSessionCoordinator, and then calls the equivalent MediaSession methode if the platform coordinator is successful. * Modules/mediasession/MediaSessionCoordinator.cpp: Added. (WebCore::nextCoordinatorLogIdentifier): (WebCore::MediaSessionCoordinator::create): (WebCore::MediaSessionCoordinator::MediaSessionCoordinator): (WebCore::MediaSessionCoordinator::seekTo): (WebCore::MediaSessionCoordinator::play): (WebCore::MediaSessionCoordinator::pause): (WebCore::MediaSessionCoordinator::setTrack): (WebCore::MediaSessionCoordinator::setMediaSession): (WebCore::MediaSessionCoordinator::logChannel): * Modules/mediasession/MediaSessionCoordinator.h: New. (WebCore::MediaSessionCoordinator::logger const): (WebCore::MediaSessionCoordinator::logIdentifier const): (WebCore::MediaSessionCoordinator::logClassName): * Modules/mediasession/MediaSessionCoordinator.idl: New. * Modules/mediasession/NavigatorMediaSession.h: * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * bindings/js/WebCoreBuiltinNames.h: * dom/EventNames.h: * dom/EventTargetFactory.in: * platform/graphics/PlatformMediaSessionCoordinator.h: Added. (WebCore::PlatformMediaSessionCoordinator::setLogger): (WebCore::PlatformMediaSessionCoordinator::loggerPtr const): (WebCore::PlatformMediaSessionCoordinator::logIdentifier const): (WebCore::PlatformMediaSessionCoordinator::logClassName const): (WebCore::PlatformMediaSessionCoordinator::logChannel const): * testing/Internals.cpp: (WebCore::Internals::registerMockMediaSessionCoordinator): Register the mock media session coordinator for testing. * testing/Internals.h: * testing/Internals.idl: * testing/MockMediaSessionCoordinator.cpp: Added. (WebCore::MockMediaSessionCoordinator::create): (WebCore::MockMediaSessionCoordinator::MockMediaSessionCoordinator): (WebCore::MockMediaSessionCoordinator::seekTo): (WebCore::MockMediaSessionCoordinator::play): (WebCore::MockMediaSessionCoordinator::pause): (WebCore::MockMediaSessionCoordinator::setTrack): * testing/MockMediaSessionCoordinator.h: New. Source/WTF: * Scripts/Preferences/WebPreferencesExperimental.yaml: * wtf/PlatformEnableCocoa.h: LayoutTests: * platform/TestExpectations: * media/media-session/mock-coordinator-expected.txt: Added. * media/media-session/mock-coordinator.html: Added. Canonical link: https://commits.webkit.org/235728@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@274983 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-03-24 23:14:51 +00:00
LayoutTests/imported/w3c: MediaSession.coordinator should not be optional, relying on coordinator state change instead https://bugs.webkit.org/show_bug.cgi?id=226328 rdar://77461335 Reviewed by Eric Carlson. * web-platform-tests/mediasession/idlharness.window-expected.txt: Source/WebCore: MediaSession.coordinator should not be optional, relying on coordinator state change instead https://bugs.webkit.org/show_bug.cgi?id=226328 rdar://77461335 Reviewed by Eric Carlson. The coordinator was a read-only optional attribute of the MediaSession element. Testing if the attribute was to be used to determine if a MediaSessionCoordinator was now available and for the MediaSession to join it. This made the use of an external polyfill difficult and enforcing the validity of an user created custom MediaSessionCoordinator due to IDL semantics limitations hard. We instead always create a MediaSessionCoordinator which in its default state is Closed. Once this state is changed to Waiting and an event is fire the MediaSession can now join it. * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): MediaSession no longer needs to fire event. Remove no longer necessary inheritance and async event queue. (WebCore::MediaSession::create): Drive-by fix, don't call suspendIfNeeded() in the constructor. (WebCore::MediaSession::createCoordinator): Make method private. * Modules/mediasession/MediaSession.h: (WebCore::MediaSession::coordinator const): MediaSessionCoordinator always exists. Return reference instead. * Modules/mediasession/MediaSession.idl: Amend definition, remove EventHandler * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::create): (WebCore::MediaSessionCoordinator::MediaSessionCoordinator): (WebCore::MediaSessionCoordinator::setMediaSessionCoordinatorPrivate): (WebCore::MediaSessionCoordinator::virtualHasPendingActivity const): (WebCore::MediaSessionCoordinator::join): (WebCore::MediaSessionCoordinator::close): (WebCore::MediaSessionCoordinator::coordinatorStateChanged): * Modules/mediasession/MediaSessionCoordinator.h: * Modules/mediasession/MediaSessionCoordinator.idl: Added new EventHandler attribute. * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Update for new API definition. * dom/EventNames.h: * dom/EventTargetFactory.in: * page/Page.cpp: (WebCore::Page::setMediaSessionCoordinator): (WebCore::Page::invalidateMediaSessionCoordinator): * testing/Internals.cpp: (WebCore::Internals::registerMockMediaSessionCoordinator): Tools: MediaSession.coordinator should not be optional, relying on coordinator readyState change instead https://bugs.webkit.org/show_bug.cgi?id=226328 rdar://77461335 Reviewed by Eric Carlson. * TestWebKitAPI/Tests/WebKit/MediaSessionCoordinatorTest.mm: (TestWebKitAPI::MediaSessionCoordinatorTest::createCoordinator): Change test to match new API, using coordinatorstatechange event instead. * TestWebKitAPI/Tests/WebKitCocoa/media-remote.html: LayoutTests: MediaSession.coordinator should not be optional, relying on coordinator readyState change instead https://bugs.webkit.org/show_bug.cgi?id=226328 rdar://77461335 Reviewed by Eric Carlson. * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: Change test to match new API. Canonical link: https://commits.webkit.org/238369@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@278336 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-06-02 01:20:38 +00:00
** There mediaSession.coordinator.state should be closed initially.
EXPECTED (navigator.mediaSession.coordinator.state == 'closed') OK
[Cocoa] Add Experimental MediaSession coordinator https://bugs.webkit.org/show_bug.cgi?id=222158 <rdar://problem/74508862> Reviewed by Jer Noble. Source/WebCore: Add an experimental MediaSession coordinator, an object that provides an interface that allows script to coordinate changes to MediaSession with the User Agent. Also add an experimental MediaSession playlist interface. The changes are behind new experimental feature flags, MediaSessionCoordinatorEnabled and MediaSessionPlaylistEnabled. Test: media/media-session/mock-coordinator.html * DerivedSources-input.xcfilelist: Add new IDL files. * DerivedSources-output.xcfilelist: Add new derived sources. * DerivedSources.make: Add new IDL. * Modules/mediasession/MediaMetadata.cpp: (WebCore::MediaMetadata::create): Set trackIdentifier from init data. (WebCore::MediaMetadata::setTrackIdentifier): trackIdentifier setter. * Modules/mediasession/MediaMetadata.h: (WebCore::MediaMetadata::trackIdentifier const): * Modules/mediasession/MediaMetadata.idl: * Modules/mediasession/MediaMetadataInit.h: Add trackIdentifier. (WebCore::MediaMetadataInit::encode const): (WebCore::MediaMetadataInit::decode): * Modules/mediasession/MediaMetadataInit.idl: * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Initialize MainThreadGenericEventQueue. (WebCore::MediaSession::setMetadata): metadataUpdated -> notifyMetadataObservers. (WebCore::MediaSession::setReadyState): Session readyState setter. (WebCore::MediaSession::setCoordinator): Coordinator setter. Post 'coordinatorchange' event after change. (WebCore::MediaSession::setPlaylist): Playlist setter. (WebCore::MediaSession::setActionHandler): Call notifyActionHandlerObservers. (WebCore::MediaSession::setPositionState): Call notifyPositionStateObservers. (WebCore::MediaSession::metadataUpdated): Call notifyMetadataObservers. (WebCore::MediaSession::addObserver): New. (WebCore::MediaSession::removeObserver): New. (WebCore::MediaSession::forEachObserver): New. (WebCore::MediaSession::notifyMetadataObservers): New. (WebCore::MediaSession::notifyPositionStateObservers): New. (WebCore::MediaSession::notifyPlaybackStateObservers): New. (WebCore::MediaSession::notifyActionHandlerObservers): New. (WebCore::MediaSession::notifyReadyStateObservers): New. * Modules/mediasession/MediaSession.h: (WebCore::MediaSession::coordinator const): (WebCore::MediaSession::playlist const): (WebCore::MediaSession::logger const): * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionAction.h: * Modules/mediasession/MediaSessionAction.idl: * Modules/mediasession/MediaSessionActionDetails.h: * Modules/mediasession/MediaSessionActionDetails.idl: MediaSessionCoordinator proxies calls through the PlatformMediaSessionCoordinator, and then calls the equivalent MediaSession methode if the platform coordinator is successful. * Modules/mediasession/MediaSessionCoordinator.cpp: Added. (WebCore::nextCoordinatorLogIdentifier): (WebCore::MediaSessionCoordinator::create): (WebCore::MediaSessionCoordinator::MediaSessionCoordinator): (WebCore::MediaSessionCoordinator::seekTo): (WebCore::MediaSessionCoordinator::play): (WebCore::MediaSessionCoordinator::pause): (WebCore::MediaSessionCoordinator::setTrack): (WebCore::MediaSessionCoordinator::setMediaSession): (WebCore::MediaSessionCoordinator::logChannel): * Modules/mediasession/MediaSessionCoordinator.h: New. (WebCore::MediaSessionCoordinator::logger const): (WebCore::MediaSessionCoordinator::logIdentifier const): (WebCore::MediaSessionCoordinator::logClassName): * Modules/mediasession/MediaSessionCoordinator.idl: New. * Modules/mediasession/NavigatorMediaSession.h: * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * bindings/js/WebCoreBuiltinNames.h: * dom/EventNames.h: * dom/EventTargetFactory.in: * platform/graphics/PlatformMediaSessionCoordinator.h: Added. (WebCore::PlatformMediaSessionCoordinator::setLogger): (WebCore::PlatformMediaSessionCoordinator::loggerPtr const): (WebCore::PlatformMediaSessionCoordinator::logIdentifier const): (WebCore::PlatformMediaSessionCoordinator::logClassName const): (WebCore::PlatformMediaSessionCoordinator::logChannel const): * testing/Internals.cpp: (WebCore::Internals::registerMockMediaSessionCoordinator): Register the mock media session coordinator for testing. * testing/Internals.h: * testing/Internals.idl: * testing/MockMediaSessionCoordinator.cpp: Added. (WebCore::MockMediaSessionCoordinator::create): (WebCore::MockMediaSessionCoordinator::MockMediaSessionCoordinator): (WebCore::MockMediaSessionCoordinator::seekTo): (WebCore::MockMediaSessionCoordinator::play): (WebCore::MockMediaSessionCoordinator::pause): (WebCore::MockMediaSessionCoordinator::setTrack): * testing/MockMediaSessionCoordinator.h: New. Source/WTF: * Scripts/Preferences/WebPreferencesExperimental.yaml: * wtf/PlatformEnableCocoa.h: LayoutTests: * platform/TestExpectations: * media/media-session/mock-coordinator-expected.txt: Added. * media/media-session/mock-coordinator.html: Added. Canonical link: https://commits.webkit.org/235728@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@274983 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-03-24 23:14:51 +00:00
LayoutTests/imported/w3c: MediaSession.coordinator should not be optional, relying on coordinator state change instead https://bugs.webkit.org/show_bug.cgi?id=226328 rdar://77461335 Reviewed by Eric Carlson. * web-platform-tests/mediasession/idlharness.window-expected.txt: Source/WebCore: MediaSession.coordinator should not be optional, relying on coordinator state change instead https://bugs.webkit.org/show_bug.cgi?id=226328 rdar://77461335 Reviewed by Eric Carlson. The coordinator was a read-only optional attribute of the MediaSession element. Testing if the attribute was to be used to determine if a MediaSessionCoordinator was now available and for the MediaSession to join it. This made the use of an external polyfill difficult and enforcing the validity of an user created custom MediaSessionCoordinator due to IDL semantics limitations hard. We instead always create a MediaSessionCoordinator which in its default state is Closed. Once this state is changed to Waiting and an event is fire the MediaSession can now join it. * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): MediaSession no longer needs to fire event. Remove no longer necessary inheritance and async event queue. (WebCore::MediaSession::create): Drive-by fix, don't call suspendIfNeeded() in the constructor. (WebCore::MediaSession::createCoordinator): Make method private. * Modules/mediasession/MediaSession.h: (WebCore::MediaSession::coordinator const): MediaSessionCoordinator always exists. Return reference instead. * Modules/mediasession/MediaSession.idl: Amend definition, remove EventHandler * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::create): (WebCore::MediaSessionCoordinator::MediaSessionCoordinator): (WebCore::MediaSessionCoordinator::setMediaSessionCoordinatorPrivate): (WebCore::MediaSessionCoordinator::virtualHasPendingActivity const): (WebCore::MediaSessionCoordinator::join): (WebCore::MediaSessionCoordinator::close): (WebCore::MediaSessionCoordinator::coordinatorStateChanged): * Modules/mediasession/MediaSessionCoordinator.h: * Modules/mediasession/MediaSessionCoordinator.idl: Added new EventHandler attribute. * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Update for new API definition. * dom/EventNames.h: * dom/EventTargetFactory.in: * page/Page.cpp: (WebCore::Page::setMediaSessionCoordinator): (WebCore::Page::invalidateMediaSessionCoordinator): * testing/Internals.cpp: (WebCore::Internals::registerMockMediaSessionCoordinator): Tools: MediaSession.coordinator should not be optional, relying on coordinator readyState change instead https://bugs.webkit.org/show_bug.cgi?id=226328 rdar://77461335 Reviewed by Eric Carlson. * TestWebKitAPI/Tests/WebKit/MediaSessionCoordinatorTest.mm: (TestWebKitAPI::MediaSessionCoordinatorTest::createCoordinator): Change test to match new API, using coordinatorstatechange event instead. * TestWebKitAPI/Tests/WebKitCocoa/media-remote.html: LayoutTests: MediaSession.coordinator should not be optional, relying on coordinator readyState change instead https://bugs.webkit.org/show_bug.cgi?id=226328 rdar://77461335 Reviewed by Eric Carlson. * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: Change test to match new API. Canonical link: https://commits.webkit.org/238369@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@278336 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-06-02 01:20:38 +00:00
** Test that mediaSession.coordinator.coordinatorstatechange event is fired when it changes.
[Cocoa] Add Experimental MediaSession coordinator https://bugs.webkit.org/show_bug.cgi?id=222158 <rdar://problem/74508862> Reviewed by Jer Noble. Source/WebCore: Add an experimental MediaSession coordinator, an object that provides an interface that allows script to coordinate changes to MediaSession with the User Agent. Also add an experimental MediaSession playlist interface. The changes are behind new experimental feature flags, MediaSessionCoordinatorEnabled and MediaSessionPlaylistEnabled. Test: media/media-session/mock-coordinator.html * DerivedSources-input.xcfilelist: Add new IDL files. * DerivedSources-output.xcfilelist: Add new derived sources. * DerivedSources.make: Add new IDL. * Modules/mediasession/MediaMetadata.cpp: (WebCore::MediaMetadata::create): Set trackIdentifier from init data. (WebCore::MediaMetadata::setTrackIdentifier): trackIdentifier setter. * Modules/mediasession/MediaMetadata.h: (WebCore::MediaMetadata::trackIdentifier const): * Modules/mediasession/MediaMetadata.idl: * Modules/mediasession/MediaMetadataInit.h: Add trackIdentifier. (WebCore::MediaMetadataInit::encode const): (WebCore::MediaMetadataInit::decode): * Modules/mediasession/MediaMetadataInit.idl: * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Initialize MainThreadGenericEventQueue. (WebCore::MediaSession::setMetadata): metadataUpdated -> notifyMetadataObservers. (WebCore::MediaSession::setReadyState): Session readyState setter. (WebCore::MediaSession::setCoordinator): Coordinator setter. Post 'coordinatorchange' event after change. (WebCore::MediaSession::setPlaylist): Playlist setter. (WebCore::MediaSession::setActionHandler): Call notifyActionHandlerObservers. (WebCore::MediaSession::setPositionState): Call notifyPositionStateObservers. (WebCore::MediaSession::metadataUpdated): Call notifyMetadataObservers. (WebCore::MediaSession::addObserver): New. (WebCore::MediaSession::removeObserver): New. (WebCore::MediaSession::forEachObserver): New. (WebCore::MediaSession::notifyMetadataObservers): New. (WebCore::MediaSession::notifyPositionStateObservers): New. (WebCore::MediaSession::notifyPlaybackStateObservers): New. (WebCore::MediaSession::notifyActionHandlerObservers): New. (WebCore::MediaSession::notifyReadyStateObservers): New. * Modules/mediasession/MediaSession.h: (WebCore::MediaSession::coordinator const): (WebCore::MediaSession::playlist const): (WebCore::MediaSession::logger const): * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionAction.h: * Modules/mediasession/MediaSessionAction.idl: * Modules/mediasession/MediaSessionActionDetails.h: * Modules/mediasession/MediaSessionActionDetails.idl: MediaSessionCoordinator proxies calls through the PlatformMediaSessionCoordinator, and then calls the equivalent MediaSession methode if the platform coordinator is successful. * Modules/mediasession/MediaSessionCoordinator.cpp: Added. (WebCore::nextCoordinatorLogIdentifier): (WebCore::MediaSessionCoordinator::create): (WebCore::MediaSessionCoordinator::MediaSessionCoordinator): (WebCore::MediaSessionCoordinator::seekTo): (WebCore::MediaSessionCoordinator::play): (WebCore::MediaSessionCoordinator::pause): (WebCore::MediaSessionCoordinator::setTrack): (WebCore::MediaSessionCoordinator::setMediaSession): (WebCore::MediaSessionCoordinator::logChannel): * Modules/mediasession/MediaSessionCoordinator.h: New. (WebCore::MediaSessionCoordinator::logger const): (WebCore::MediaSessionCoordinator::logIdentifier const): (WebCore::MediaSessionCoordinator::logClassName): * Modules/mediasession/MediaSessionCoordinator.idl: New. * Modules/mediasession/NavigatorMediaSession.h: * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * bindings/js/WebCoreBuiltinNames.h: * dom/EventNames.h: * dom/EventTargetFactory.in: * platform/graphics/PlatformMediaSessionCoordinator.h: Added. (WebCore::PlatformMediaSessionCoordinator::setLogger): (WebCore::PlatformMediaSessionCoordinator::loggerPtr const): (WebCore::PlatformMediaSessionCoordinator::logIdentifier const): (WebCore::PlatformMediaSessionCoordinator::logClassName const): (WebCore::PlatformMediaSessionCoordinator::logChannel const): * testing/Internals.cpp: (WebCore::Internals::registerMockMediaSessionCoordinator): Register the mock media session coordinator for testing. * testing/Internals.h: * testing/Internals.idl: * testing/MockMediaSessionCoordinator.cpp: Added. (WebCore::MockMediaSessionCoordinator::create): (WebCore::MockMediaSessionCoordinator::MockMediaSessionCoordinator): (WebCore::MockMediaSessionCoordinator::seekTo): (WebCore::MockMediaSessionCoordinator::play): (WebCore::MockMediaSessionCoordinator::pause): (WebCore::MockMediaSessionCoordinator::setTrack): * testing/MockMediaSessionCoordinator.h: New. Source/WTF: * Scripts/Preferences/WebPreferencesExperimental.yaml: * wtf/PlatformEnableCocoa.h: LayoutTests: * platform/TestExpectations: * media/media-session/mock-coordinator-expected.txt: Added. * media/media-session/mock-coordinator.html: Added. Canonical link: https://commits.webkit.org/235728@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@274983 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-03-24 23:14:51 +00:00
RUN(internals.registerMockMediaSessionCoordinator(changeHandler))
LayoutTests/imported/w3c: MediaSession.coordinator should not be optional, relying on coordinator state change instead https://bugs.webkit.org/show_bug.cgi?id=226328 rdar://77461335 Reviewed by Eric Carlson. * web-platform-tests/mediasession/idlharness.window-expected.txt: Source/WebCore: MediaSession.coordinator should not be optional, relying on coordinator state change instead https://bugs.webkit.org/show_bug.cgi?id=226328 rdar://77461335 Reviewed by Eric Carlson. The coordinator was a read-only optional attribute of the MediaSession element. Testing if the attribute was to be used to determine if a MediaSessionCoordinator was now available and for the MediaSession to join it. This made the use of an external polyfill difficult and enforcing the validity of an user created custom MediaSessionCoordinator due to IDL semantics limitations hard. We instead always create a MediaSessionCoordinator which in its default state is Closed. Once this state is changed to Waiting and an event is fire the MediaSession can now join it. * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): MediaSession no longer needs to fire event. Remove no longer necessary inheritance and async event queue. (WebCore::MediaSession::create): Drive-by fix, don't call suspendIfNeeded() in the constructor. (WebCore::MediaSession::createCoordinator): Make method private. * Modules/mediasession/MediaSession.h: (WebCore::MediaSession::coordinator const): MediaSessionCoordinator always exists. Return reference instead. * Modules/mediasession/MediaSession.idl: Amend definition, remove EventHandler * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::create): (WebCore::MediaSessionCoordinator::MediaSessionCoordinator): (WebCore::MediaSessionCoordinator::setMediaSessionCoordinatorPrivate): (WebCore::MediaSessionCoordinator::virtualHasPendingActivity const): (WebCore::MediaSessionCoordinator::join): (WebCore::MediaSessionCoordinator::close): (WebCore::MediaSessionCoordinator::coordinatorStateChanged): * Modules/mediasession/MediaSessionCoordinator.h: * Modules/mediasession/MediaSessionCoordinator.idl: Added new EventHandler attribute. * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Update for new API definition. * dom/EventNames.h: * dom/EventTargetFactory.in: * page/Page.cpp: (WebCore::Page::setMediaSessionCoordinator): (WebCore::Page::invalidateMediaSessionCoordinator): * testing/Internals.cpp: (WebCore::Internals::registerMockMediaSessionCoordinator): Tools: MediaSession.coordinator should not be optional, relying on coordinator readyState change instead https://bugs.webkit.org/show_bug.cgi?id=226328 rdar://77461335 Reviewed by Eric Carlson. * TestWebKitAPI/Tests/WebKit/MediaSessionCoordinatorTest.mm: (TestWebKitAPI::MediaSessionCoordinatorTest::createCoordinator): Change test to match new API, using coordinatorstatechange event instead. * TestWebKitAPI/Tests/WebKitCocoa/media-remote.html: LayoutTests: MediaSession.coordinator should not be optional, relying on coordinator readyState change instead https://bugs.webkit.org/show_bug.cgi?id=226328 rdar://77461335 Reviewed by Eric Carlson. * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: Change test to match new API. Canonical link: https://commits.webkit.org/238369@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@278336 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-06-02 01:20:38 +00:00
EVENT(coordinatorstatechange STATE(waiting)
[Cocoa] Add Experimental MediaSession coordinator https://bugs.webkit.org/show_bug.cgi?id=222158 <rdar://problem/74508862> Reviewed by Jer Noble. Source/WebCore: Add an experimental MediaSession coordinator, an object that provides an interface that allows script to coordinate changes to MediaSession with the User Agent. Also add an experimental MediaSession playlist interface. The changes are behind new experimental feature flags, MediaSessionCoordinatorEnabled and MediaSessionPlaylistEnabled. Test: media/media-session/mock-coordinator.html * DerivedSources-input.xcfilelist: Add new IDL files. * DerivedSources-output.xcfilelist: Add new derived sources. * DerivedSources.make: Add new IDL. * Modules/mediasession/MediaMetadata.cpp: (WebCore::MediaMetadata::create): Set trackIdentifier from init data. (WebCore::MediaMetadata::setTrackIdentifier): trackIdentifier setter. * Modules/mediasession/MediaMetadata.h: (WebCore::MediaMetadata::trackIdentifier const): * Modules/mediasession/MediaMetadata.idl: * Modules/mediasession/MediaMetadataInit.h: Add trackIdentifier. (WebCore::MediaMetadataInit::encode const): (WebCore::MediaMetadataInit::decode): * Modules/mediasession/MediaMetadataInit.idl: * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Initialize MainThreadGenericEventQueue. (WebCore::MediaSession::setMetadata): metadataUpdated -> notifyMetadataObservers. (WebCore::MediaSession::setReadyState): Session readyState setter. (WebCore::MediaSession::setCoordinator): Coordinator setter. Post 'coordinatorchange' event after change. (WebCore::MediaSession::setPlaylist): Playlist setter. (WebCore::MediaSession::setActionHandler): Call notifyActionHandlerObservers. (WebCore::MediaSession::setPositionState): Call notifyPositionStateObservers. (WebCore::MediaSession::metadataUpdated): Call notifyMetadataObservers. (WebCore::MediaSession::addObserver): New. (WebCore::MediaSession::removeObserver): New. (WebCore::MediaSession::forEachObserver): New. (WebCore::MediaSession::notifyMetadataObservers): New. (WebCore::MediaSession::notifyPositionStateObservers): New. (WebCore::MediaSession::notifyPlaybackStateObservers): New. (WebCore::MediaSession::notifyActionHandlerObservers): New. (WebCore::MediaSession::notifyReadyStateObservers): New. * Modules/mediasession/MediaSession.h: (WebCore::MediaSession::coordinator const): (WebCore::MediaSession::playlist const): (WebCore::MediaSession::logger const): * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionAction.h: * Modules/mediasession/MediaSessionAction.idl: * Modules/mediasession/MediaSessionActionDetails.h: * Modules/mediasession/MediaSessionActionDetails.idl: MediaSessionCoordinator proxies calls through the PlatformMediaSessionCoordinator, and then calls the equivalent MediaSession methode if the platform coordinator is successful. * Modules/mediasession/MediaSessionCoordinator.cpp: Added. (WebCore::nextCoordinatorLogIdentifier): (WebCore::MediaSessionCoordinator::create): (WebCore::MediaSessionCoordinator::MediaSessionCoordinator): (WebCore::MediaSessionCoordinator::seekTo): (WebCore::MediaSessionCoordinator::play): (WebCore::MediaSessionCoordinator::pause): (WebCore::MediaSessionCoordinator::setTrack): (WebCore::MediaSessionCoordinator::setMediaSession): (WebCore::MediaSessionCoordinator::logChannel): * Modules/mediasession/MediaSessionCoordinator.h: New. (WebCore::MediaSessionCoordinator::logger const): (WebCore::MediaSessionCoordinator::logIdentifier const): (WebCore::MediaSessionCoordinator::logClassName): * Modules/mediasession/MediaSessionCoordinator.idl: New. * Modules/mediasession/NavigatorMediaSession.h: * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * bindings/js/WebCoreBuiltinNames.h: * dom/EventNames.h: * dom/EventTargetFactory.in: * platform/graphics/PlatformMediaSessionCoordinator.h: Added. (WebCore::PlatformMediaSessionCoordinator::setLogger): (WebCore::PlatformMediaSessionCoordinator::loggerPtr const): (WebCore::PlatformMediaSessionCoordinator::logIdentifier const): (WebCore::PlatformMediaSessionCoordinator::logClassName const): (WebCore::PlatformMediaSessionCoordinator::logChannel const): * testing/Internals.cpp: (WebCore::Internals::registerMockMediaSessionCoordinator): Register the mock media session coordinator for testing. * testing/Internals.h: * testing/Internals.idl: * testing/MockMediaSessionCoordinator.cpp: Added. (WebCore::MockMediaSessionCoordinator::create): (WebCore::MockMediaSessionCoordinator::MockMediaSessionCoordinator): (WebCore::MockMediaSessionCoordinator::seekTo): (WebCore::MockMediaSessionCoordinator::play): (WebCore::MockMediaSessionCoordinator::pause): (WebCore::MockMediaSessionCoordinator::setTrack): * testing/MockMediaSessionCoordinator.h: New. Source/WTF: * Scripts/Preferences/WebPreferencesExperimental.yaml: * wtf/PlatformEnableCocoa.h: LayoutTests: * platform/TestExpectations: * media/media-session/mock-coordinator-expected.txt: Added. * media/media-session/mock-coordinator.html: Added. Canonical link: https://commits.webkit.org/235728@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@274983 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-03-24 23:14:51 +00:00
LayoutTests/imported/w3c: MediaSession.coordinator should not be optional, relying on coordinator state change instead https://bugs.webkit.org/show_bug.cgi?id=226328 rdar://77461335 Reviewed by Eric Carlson. * web-platform-tests/mediasession/idlharness.window-expected.txt: Source/WebCore: MediaSession.coordinator should not be optional, relying on coordinator state change instead https://bugs.webkit.org/show_bug.cgi?id=226328 rdar://77461335 Reviewed by Eric Carlson. The coordinator was a read-only optional attribute of the MediaSession element. Testing if the attribute was to be used to determine if a MediaSessionCoordinator was now available and for the MediaSession to join it. This made the use of an external polyfill difficult and enforcing the validity of an user created custom MediaSessionCoordinator due to IDL semantics limitations hard. We instead always create a MediaSessionCoordinator which in its default state is Closed. Once this state is changed to Waiting and an event is fire the MediaSession can now join it. * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): MediaSession no longer needs to fire event. Remove no longer necessary inheritance and async event queue. (WebCore::MediaSession::create): Drive-by fix, don't call suspendIfNeeded() in the constructor. (WebCore::MediaSession::createCoordinator): Make method private. * Modules/mediasession/MediaSession.h: (WebCore::MediaSession::coordinator const): MediaSessionCoordinator always exists. Return reference instead. * Modules/mediasession/MediaSession.idl: Amend definition, remove EventHandler * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::create): (WebCore::MediaSessionCoordinator::MediaSessionCoordinator): (WebCore::MediaSessionCoordinator::setMediaSessionCoordinatorPrivate): (WebCore::MediaSessionCoordinator::virtualHasPendingActivity const): (WebCore::MediaSessionCoordinator::join): (WebCore::MediaSessionCoordinator::close): (WebCore::MediaSessionCoordinator::coordinatorStateChanged): * Modules/mediasession/MediaSessionCoordinator.h: * Modules/mediasession/MediaSessionCoordinator.idl: Added new EventHandler attribute. * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Update for new API definition. * dom/EventNames.h: * dom/EventTargetFactory.in: * page/Page.cpp: (WebCore::Page::setMediaSessionCoordinator): (WebCore::Page::invalidateMediaSessionCoordinator): * testing/Internals.cpp: (WebCore::Internals::registerMockMediaSessionCoordinator): Tools: MediaSession.coordinator should not be optional, relying on coordinator readyState change instead https://bugs.webkit.org/show_bug.cgi?id=226328 rdar://77461335 Reviewed by Eric Carlson. * TestWebKitAPI/Tests/WebKit/MediaSessionCoordinatorTest.mm: (TestWebKitAPI::MediaSessionCoordinatorTest::createCoordinator): Change test to match new API, using coordinatorstatechange event instead. * TestWebKitAPI/Tests/WebKitCocoa/media-remote.html: LayoutTests: MediaSession.coordinator should not be optional, relying on coordinator readyState change instead https://bugs.webkit.org/show_bug.cgi?id=226328 rdar://77461335 Reviewed by Eric Carlson. * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: Change test to match new API. Canonical link: https://commits.webkit.org/238369@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@278336 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-06-02 01:20:38 +00:00
** navigator.mediaSession.coordinator.state should be "waiting" initially
[macOS] MediaSessionCoordinator should have join and leave methods https://bugs.webkit.org/show_bug.cgi?id=223955 <rdar://problem/76021588> Reviewed by Jer Noble. Source/WebCore: Add 'join' and 'leave' methods to MediaSessionCoordinator so a page has to opt-in to participating in a coordinated session and can leave at any time. Don't have the coordinator automatically call session methods when the private coordinator finishes, just signal the promise and let the page handle it. No new tests, updated media/media-session/mock-coordinator.html. * CMakeLists.txt: * DerivedSources-input.xcfilelist: * DerivedSources-output.xcfilelist: * DerivedSources.make: * Modules/mediasession/MediaMetadata.idl: Fix Conditional. * Modules/mediasession/MediaMetadataPlaylistMixin.idl: Ditto. * Modules/mediasession/MediaPositionState.h: Add logging template. (WTF::LogArgument<WebCore::MediaPositionState>::toString): * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Switch from beging a ContextDestructionObserver to an ActiveDOMObject to the wrapper won't be collected while an event dispatch is pending. (WebCore::MediaSession::virtualHasPendingActivity const): Prevent collection while event dispatch is pending. (WebCore::MediaSession::setPositionState): Improve logging. (WebCore::MediaPositionState::toJSONString const): * Modules/mediasession/MediaSession.h: * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::join): New. (WebCore::MediaSessionCoordinator::leave): New. (WebCore::MediaSessionCoordinator::seekTo): Reject unless state is 'joined'. Don't call session method. (WebCore::MediaSessionCoordinator::play): Ditto. (WebCore::MediaSessionCoordinator::pause): Ditto. (WebCore::MediaSessionCoordinator::setTrack): Ditto. (WebCore::MediaSessionCoordinator::positionStateChanged): (WebCore::MediaSessionCoordinator::playbackStateChanged): (WebCore::MediaSessionCoordinator::readyStateChanged): Do nothing unless state is 'joined'. Improve logging. (WebCore::MediaSessionCoordinator::seekSessionToTime): Ditto. (WebCore::MediaSessionCoordinator::playSession): Ditto. (WebCore::MediaSessionCoordinator::pauseSession): Ditto. (WebCore::MediaSessionCoordinator::setSessionTrack): Ditto. * Modules/mediasession/MediaSessionCoordinator.h: (WebCore::MediaSessionCoordinator::identifier const): (WebCore::MediaSessionCoordinator::state const): * Modules/mediasession/MediaSessionCoordinator.idl: * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Fix Conditional. * Modules/mediasession/MediaSessionCoordinatorPrivate.h: Declare new required methods. * Modules/mediasession/MediaSessionCoordinatorState.h: Define states. * Modules/mediasession/MediaSessionCoordinatorState.idl: * Modules/mediasession/MediaSessionPlaylistMixin.idl: Fix Conditional. * Sources.txt: Add JSMediaSessionCoordinatorState.cpp. * WebCore.xcodeproj/project.pbxproj: * testing/MockMediaSessionCoordinator.cpp: (WebCore::MockMediaSessionCoordinator::join): (WebCore::MockMediaSessionCoordinator::leave): (WebCore::MockMediaSessionCoordinator::coordinatorStateChanged): * testing/MockMediaSessionCoordinator.h: Source/WebKit: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::join): (WebKit::RemoteMediaSessionCoordinatorProxy::leave): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::join): (WebKit::RemoteMediaSessionCoordinator::leave): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: LayoutTests: * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275314 268f45cc-cd09-0410-ab3c-d52691b4dbfc Canonical link: https://commits.webkit.org/235995@main
2021-03-31 23:11:14 +00:00
EXPECTED (navigator.mediaSession.coordinator.state == 'waiting') OK
** Test that when coordinator methods fail and promises reject before mediaSession.join() is called.
RUN(promise = navigator.mediaSession.coordinator.play())
Promise rejected correctly OK
RUN(promise = navigator.mediaSession.coordinator.pause())
Promise rejected correctly OK
RUN(promise = navigator.mediaSession.coordinator.seekTo(10))
Promise rejected correctly OK
** Test that mediaSession does not notify coordinator when states change before mediaSession.join() is called.
* PositionState
RUN(navigator.mediaSession.setPositionState({ duration: 1, playbackRate: 1, position: 0 }))
EXPECTED (latestChange == '') OK
* ReadyState
EXPECTED (navigator.mediaSession.readyState == 'havenothing') OK
RUN(navigator.mediaSession.readyState = 'havemetadata')
[macOS] MediaSessionCoordinator should have join and leave methods https://bugs.webkit.org/show_bug.cgi?id=223955 <rdar://problem/76021588> Reviewed by Jer Noble. Source/WebCore: Add 'join' and 'leave' methods to MediaSessionCoordinator so a page has to opt-in to participating in a coordinated session and can leave at any time. Don't have the coordinator automatically call session methods when the private coordinator finishes, just signal the promise and let the page handle it. No new tests, updated media/media-session/mock-coordinator.html. * CMakeLists.txt: * DerivedSources-input.xcfilelist: * DerivedSources-output.xcfilelist: * DerivedSources.make: * Modules/mediasession/MediaMetadata.idl: Fix Conditional. * Modules/mediasession/MediaMetadataPlaylistMixin.idl: Ditto. * Modules/mediasession/MediaPositionState.h: Add logging template. (WTF::LogArgument<WebCore::MediaPositionState>::toString): * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Switch from beging a ContextDestructionObserver to an ActiveDOMObject to the wrapper won't be collected while an event dispatch is pending. (WebCore::MediaSession::virtualHasPendingActivity const): Prevent collection while event dispatch is pending. (WebCore::MediaSession::setPositionState): Improve logging. (WebCore::MediaPositionState::toJSONString const): * Modules/mediasession/MediaSession.h: * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::join): New. (WebCore::MediaSessionCoordinator::leave): New. (WebCore::MediaSessionCoordinator::seekTo): Reject unless state is 'joined'. Don't call session method. (WebCore::MediaSessionCoordinator::play): Ditto. (WebCore::MediaSessionCoordinator::pause): Ditto. (WebCore::MediaSessionCoordinator::setTrack): Ditto. (WebCore::MediaSessionCoordinator::positionStateChanged): (WebCore::MediaSessionCoordinator::playbackStateChanged): (WebCore::MediaSessionCoordinator::readyStateChanged): Do nothing unless state is 'joined'. Improve logging. (WebCore::MediaSessionCoordinator::seekSessionToTime): Ditto. (WebCore::MediaSessionCoordinator::playSession): Ditto. (WebCore::MediaSessionCoordinator::pauseSession): Ditto. (WebCore::MediaSessionCoordinator::setSessionTrack): Ditto. * Modules/mediasession/MediaSessionCoordinator.h: (WebCore::MediaSessionCoordinator::identifier const): (WebCore::MediaSessionCoordinator::state const): * Modules/mediasession/MediaSessionCoordinator.idl: * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Fix Conditional. * Modules/mediasession/MediaSessionCoordinatorPrivate.h: Declare new required methods. * Modules/mediasession/MediaSessionCoordinatorState.h: Define states. * Modules/mediasession/MediaSessionCoordinatorState.idl: * Modules/mediasession/MediaSessionPlaylistMixin.idl: Fix Conditional. * Sources.txt: Add JSMediaSessionCoordinatorState.cpp. * WebCore.xcodeproj/project.pbxproj: * testing/MockMediaSessionCoordinator.cpp: (WebCore::MockMediaSessionCoordinator::join): (WebCore::MockMediaSessionCoordinator::leave): (WebCore::MockMediaSessionCoordinator::coordinatorStateChanged): * testing/MockMediaSessionCoordinator.h: Source/WebKit: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::join): (WebKit::RemoteMediaSessionCoordinatorProxy::leave): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::join): (WebKit::RemoteMediaSessionCoordinator::leave): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: LayoutTests: * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275314 268f45cc-cd09-0410-ab3c-d52691b4dbfc Canonical link: https://commits.webkit.org/235995@main
2021-03-31 23:11:14 +00:00
EXPECTED (latestChange == '') OK
EXPECTED (navigator.mediaSession.readyState == 'havemetadata') OK
[macOS] MediaSessionCoordinator should have join and leave methods https://bugs.webkit.org/show_bug.cgi?id=223955 <rdar://problem/76021588> Reviewed by Jer Noble. Source/WebCore: Add 'join' and 'leave' methods to MediaSessionCoordinator so a page has to opt-in to participating in a coordinated session and can leave at any time. Don't have the coordinator automatically call session methods when the private coordinator finishes, just signal the promise and let the page handle it. No new tests, updated media/media-session/mock-coordinator.html. * CMakeLists.txt: * DerivedSources-input.xcfilelist: * DerivedSources-output.xcfilelist: * DerivedSources.make: * Modules/mediasession/MediaMetadata.idl: Fix Conditional. * Modules/mediasession/MediaMetadataPlaylistMixin.idl: Ditto. * Modules/mediasession/MediaPositionState.h: Add logging template. (WTF::LogArgument<WebCore::MediaPositionState>::toString): * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Switch from beging a ContextDestructionObserver to an ActiveDOMObject to the wrapper won't be collected while an event dispatch is pending. (WebCore::MediaSession::virtualHasPendingActivity const): Prevent collection while event dispatch is pending. (WebCore::MediaSession::setPositionState): Improve logging. (WebCore::MediaPositionState::toJSONString const): * Modules/mediasession/MediaSession.h: * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::join): New. (WebCore::MediaSessionCoordinator::leave): New. (WebCore::MediaSessionCoordinator::seekTo): Reject unless state is 'joined'. Don't call session method. (WebCore::MediaSessionCoordinator::play): Ditto. (WebCore::MediaSessionCoordinator::pause): Ditto. (WebCore::MediaSessionCoordinator::setTrack): Ditto. (WebCore::MediaSessionCoordinator::positionStateChanged): (WebCore::MediaSessionCoordinator::playbackStateChanged): (WebCore::MediaSessionCoordinator::readyStateChanged): Do nothing unless state is 'joined'. Improve logging. (WebCore::MediaSessionCoordinator::seekSessionToTime): Ditto. (WebCore::MediaSessionCoordinator::playSession): Ditto. (WebCore::MediaSessionCoordinator::pauseSession): Ditto. (WebCore::MediaSessionCoordinator::setSessionTrack): Ditto. * Modules/mediasession/MediaSessionCoordinator.h: (WebCore::MediaSessionCoordinator::identifier const): (WebCore::MediaSessionCoordinator::state const): * Modules/mediasession/MediaSessionCoordinator.idl: * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Fix Conditional. * Modules/mediasession/MediaSessionCoordinatorPrivate.h: Declare new required methods. * Modules/mediasession/MediaSessionCoordinatorState.h: Define states. * Modules/mediasession/MediaSessionCoordinatorState.idl: * Modules/mediasession/MediaSessionPlaylistMixin.idl: Fix Conditional. * Sources.txt: Add JSMediaSessionCoordinatorState.cpp. * WebCore.xcodeproj/project.pbxproj: * testing/MockMediaSessionCoordinator.cpp: (WebCore::MockMediaSessionCoordinator::join): (WebCore::MockMediaSessionCoordinator::leave): (WebCore::MockMediaSessionCoordinator::coordinatorStateChanged): * testing/MockMediaSessionCoordinator.h: Source/WebKit: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::join): (WebKit::RemoteMediaSessionCoordinatorProxy::leave): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::join): (WebKit::RemoteMediaSessionCoordinator::leave): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: LayoutTests: * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275314 268f45cc-cd09-0410-ab3c-d52691b4dbfc Canonical link: https://commits.webkit.org/235995@main
2021-03-31 23:11:14 +00:00
EXPECTED (navigator.mediaSession.readyState == 'havemetadata') OK
RUN(navigator.mediaSession.readyState = 'havecurrentdata')
[macOS] MediaSessionCoordinator should have join and leave methods https://bugs.webkit.org/show_bug.cgi?id=223955 <rdar://problem/76021588> Reviewed by Jer Noble. Source/WebCore: Add 'join' and 'leave' methods to MediaSessionCoordinator so a page has to opt-in to participating in a coordinated session and can leave at any time. Don't have the coordinator automatically call session methods when the private coordinator finishes, just signal the promise and let the page handle it. No new tests, updated media/media-session/mock-coordinator.html. * CMakeLists.txt: * DerivedSources-input.xcfilelist: * DerivedSources-output.xcfilelist: * DerivedSources.make: * Modules/mediasession/MediaMetadata.idl: Fix Conditional. * Modules/mediasession/MediaMetadataPlaylistMixin.idl: Ditto. * Modules/mediasession/MediaPositionState.h: Add logging template. (WTF::LogArgument<WebCore::MediaPositionState>::toString): * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Switch from beging a ContextDestructionObserver to an ActiveDOMObject to the wrapper won't be collected while an event dispatch is pending. (WebCore::MediaSession::virtualHasPendingActivity const): Prevent collection while event dispatch is pending. (WebCore::MediaSession::setPositionState): Improve logging. (WebCore::MediaPositionState::toJSONString const): * Modules/mediasession/MediaSession.h: * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::join): New. (WebCore::MediaSessionCoordinator::leave): New. (WebCore::MediaSessionCoordinator::seekTo): Reject unless state is 'joined'. Don't call session method. (WebCore::MediaSessionCoordinator::play): Ditto. (WebCore::MediaSessionCoordinator::pause): Ditto. (WebCore::MediaSessionCoordinator::setTrack): Ditto. (WebCore::MediaSessionCoordinator::positionStateChanged): (WebCore::MediaSessionCoordinator::playbackStateChanged): (WebCore::MediaSessionCoordinator::readyStateChanged): Do nothing unless state is 'joined'. Improve logging. (WebCore::MediaSessionCoordinator::seekSessionToTime): Ditto. (WebCore::MediaSessionCoordinator::playSession): Ditto. (WebCore::MediaSessionCoordinator::pauseSession): Ditto. (WebCore::MediaSessionCoordinator::setSessionTrack): Ditto. * Modules/mediasession/MediaSessionCoordinator.h: (WebCore::MediaSessionCoordinator::identifier const): (WebCore::MediaSessionCoordinator::state const): * Modules/mediasession/MediaSessionCoordinator.idl: * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Fix Conditional. * Modules/mediasession/MediaSessionCoordinatorPrivate.h: Declare new required methods. * Modules/mediasession/MediaSessionCoordinatorState.h: Define states. * Modules/mediasession/MediaSessionCoordinatorState.idl: * Modules/mediasession/MediaSessionPlaylistMixin.idl: Fix Conditional. * Sources.txt: Add JSMediaSessionCoordinatorState.cpp. * WebCore.xcodeproj/project.pbxproj: * testing/MockMediaSessionCoordinator.cpp: (WebCore::MockMediaSessionCoordinator::join): (WebCore::MockMediaSessionCoordinator::leave): (WebCore::MockMediaSessionCoordinator::coordinatorStateChanged): * testing/MockMediaSessionCoordinator.h: Source/WebKit: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::join): (WebKit::RemoteMediaSessionCoordinatorProxy::leave): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::join): (WebKit::RemoteMediaSessionCoordinator::leave): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: LayoutTests: * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275314 268f45cc-cd09-0410-ab3c-d52691b4dbfc Canonical link: https://commits.webkit.org/235995@main
2021-03-31 23:11:14 +00:00
EXPECTED (latestChange == '') OK
EXPECTED (navigator.mediaSession.readyState == 'havecurrentdata') OK
[macOS] MediaSessionCoordinator should have join and leave methods https://bugs.webkit.org/show_bug.cgi?id=223955 <rdar://problem/76021588> Reviewed by Jer Noble. Source/WebCore: Add 'join' and 'leave' methods to MediaSessionCoordinator so a page has to opt-in to participating in a coordinated session and can leave at any time. Don't have the coordinator automatically call session methods when the private coordinator finishes, just signal the promise and let the page handle it. No new tests, updated media/media-session/mock-coordinator.html. * CMakeLists.txt: * DerivedSources-input.xcfilelist: * DerivedSources-output.xcfilelist: * DerivedSources.make: * Modules/mediasession/MediaMetadata.idl: Fix Conditional. * Modules/mediasession/MediaMetadataPlaylistMixin.idl: Ditto. * Modules/mediasession/MediaPositionState.h: Add logging template. (WTF::LogArgument<WebCore::MediaPositionState>::toString): * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Switch from beging a ContextDestructionObserver to an ActiveDOMObject to the wrapper won't be collected while an event dispatch is pending. (WebCore::MediaSession::virtualHasPendingActivity const): Prevent collection while event dispatch is pending. (WebCore::MediaSession::setPositionState): Improve logging. (WebCore::MediaPositionState::toJSONString const): * Modules/mediasession/MediaSession.h: * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::join): New. (WebCore::MediaSessionCoordinator::leave): New. (WebCore::MediaSessionCoordinator::seekTo): Reject unless state is 'joined'. Don't call session method. (WebCore::MediaSessionCoordinator::play): Ditto. (WebCore::MediaSessionCoordinator::pause): Ditto. (WebCore::MediaSessionCoordinator::setTrack): Ditto. (WebCore::MediaSessionCoordinator::positionStateChanged): (WebCore::MediaSessionCoordinator::playbackStateChanged): (WebCore::MediaSessionCoordinator::readyStateChanged): Do nothing unless state is 'joined'. Improve logging. (WebCore::MediaSessionCoordinator::seekSessionToTime): Ditto. (WebCore::MediaSessionCoordinator::playSession): Ditto. (WebCore::MediaSessionCoordinator::pauseSession): Ditto. (WebCore::MediaSessionCoordinator::setSessionTrack): Ditto. * Modules/mediasession/MediaSessionCoordinator.h: (WebCore::MediaSessionCoordinator::identifier const): (WebCore::MediaSessionCoordinator::state const): * Modules/mediasession/MediaSessionCoordinator.idl: * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Fix Conditional. * Modules/mediasession/MediaSessionCoordinatorPrivate.h: Declare new required methods. * Modules/mediasession/MediaSessionCoordinatorState.h: Define states. * Modules/mediasession/MediaSessionCoordinatorState.idl: * Modules/mediasession/MediaSessionPlaylistMixin.idl: Fix Conditional. * Sources.txt: Add JSMediaSessionCoordinatorState.cpp. * WebCore.xcodeproj/project.pbxproj: * testing/MockMediaSessionCoordinator.cpp: (WebCore::MockMediaSessionCoordinator::join): (WebCore::MockMediaSessionCoordinator::leave): (WebCore::MockMediaSessionCoordinator::coordinatorStateChanged): * testing/MockMediaSessionCoordinator.h: Source/WebKit: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::join): (WebKit::RemoteMediaSessionCoordinatorProxy::leave): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::join): (WebKit::RemoteMediaSessionCoordinator::leave): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: LayoutTests: * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275314 268f45cc-cd09-0410-ab3c-d52691b4dbfc Canonical link: https://commits.webkit.org/235995@main
2021-03-31 23:11:14 +00:00
EXPECTED (navigator.mediaSession.readyState == 'havecurrentdata') OK
RUN(navigator.mediaSession.readyState = 'havefuturedata')
[macOS] MediaSessionCoordinator should have join and leave methods https://bugs.webkit.org/show_bug.cgi?id=223955 <rdar://problem/76021588> Reviewed by Jer Noble. Source/WebCore: Add 'join' and 'leave' methods to MediaSessionCoordinator so a page has to opt-in to participating in a coordinated session and can leave at any time. Don't have the coordinator automatically call session methods when the private coordinator finishes, just signal the promise and let the page handle it. No new tests, updated media/media-session/mock-coordinator.html. * CMakeLists.txt: * DerivedSources-input.xcfilelist: * DerivedSources-output.xcfilelist: * DerivedSources.make: * Modules/mediasession/MediaMetadata.idl: Fix Conditional. * Modules/mediasession/MediaMetadataPlaylistMixin.idl: Ditto. * Modules/mediasession/MediaPositionState.h: Add logging template. (WTF::LogArgument<WebCore::MediaPositionState>::toString): * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Switch from beging a ContextDestructionObserver to an ActiveDOMObject to the wrapper won't be collected while an event dispatch is pending. (WebCore::MediaSession::virtualHasPendingActivity const): Prevent collection while event dispatch is pending. (WebCore::MediaSession::setPositionState): Improve logging. (WebCore::MediaPositionState::toJSONString const): * Modules/mediasession/MediaSession.h: * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::join): New. (WebCore::MediaSessionCoordinator::leave): New. (WebCore::MediaSessionCoordinator::seekTo): Reject unless state is 'joined'. Don't call session method. (WebCore::MediaSessionCoordinator::play): Ditto. (WebCore::MediaSessionCoordinator::pause): Ditto. (WebCore::MediaSessionCoordinator::setTrack): Ditto. (WebCore::MediaSessionCoordinator::positionStateChanged): (WebCore::MediaSessionCoordinator::playbackStateChanged): (WebCore::MediaSessionCoordinator::readyStateChanged): Do nothing unless state is 'joined'. Improve logging. (WebCore::MediaSessionCoordinator::seekSessionToTime): Ditto. (WebCore::MediaSessionCoordinator::playSession): Ditto. (WebCore::MediaSessionCoordinator::pauseSession): Ditto. (WebCore::MediaSessionCoordinator::setSessionTrack): Ditto. * Modules/mediasession/MediaSessionCoordinator.h: (WebCore::MediaSessionCoordinator::identifier const): (WebCore::MediaSessionCoordinator::state const): * Modules/mediasession/MediaSessionCoordinator.idl: * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Fix Conditional. * Modules/mediasession/MediaSessionCoordinatorPrivate.h: Declare new required methods. * Modules/mediasession/MediaSessionCoordinatorState.h: Define states. * Modules/mediasession/MediaSessionCoordinatorState.idl: * Modules/mediasession/MediaSessionPlaylistMixin.idl: Fix Conditional. * Sources.txt: Add JSMediaSessionCoordinatorState.cpp. * WebCore.xcodeproj/project.pbxproj: * testing/MockMediaSessionCoordinator.cpp: (WebCore::MockMediaSessionCoordinator::join): (WebCore::MockMediaSessionCoordinator::leave): (WebCore::MockMediaSessionCoordinator::coordinatorStateChanged): * testing/MockMediaSessionCoordinator.h: Source/WebKit: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::join): (WebKit::RemoteMediaSessionCoordinatorProxy::leave): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::join): (WebKit::RemoteMediaSessionCoordinator::leave): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: LayoutTests: * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275314 268f45cc-cd09-0410-ab3c-d52691b4dbfc Canonical link: https://commits.webkit.org/235995@main
2021-03-31 23:11:14 +00:00
EXPECTED (latestChange == '') OK
EXPECTED (navigator.mediaSession.readyState == 'havefuturedata') OK
[macOS] MediaSessionCoordinator should have join and leave methods https://bugs.webkit.org/show_bug.cgi?id=223955 <rdar://problem/76021588> Reviewed by Jer Noble. Source/WebCore: Add 'join' and 'leave' methods to MediaSessionCoordinator so a page has to opt-in to participating in a coordinated session and can leave at any time. Don't have the coordinator automatically call session methods when the private coordinator finishes, just signal the promise and let the page handle it. No new tests, updated media/media-session/mock-coordinator.html. * CMakeLists.txt: * DerivedSources-input.xcfilelist: * DerivedSources-output.xcfilelist: * DerivedSources.make: * Modules/mediasession/MediaMetadata.idl: Fix Conditional. * Modules/mediasession/MediaMetadataPlaylistMixin.idl: Ditto. * Modules/mediasession/MediaPositionState.h: Add logging template. (WTF::LogArgument<WebCore::MediaPositionState>::toString): * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Switch from beging a ContextDestructionObserver to an ActiveDOMObject to the wrapper won't be collected while an event dispatch is pending. (WebCore::MediaSession::virtualHasPendingActivity const): Prevent collection while event dispatch is pending. (WebCore::MediaSession::setPositionState): Improve logging. (WebCore::MediaPositionState::toJSONString const): * Modules/mediasession/MediaSession.h: * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::join): New. (WebCore::MediaSessionCoordinator::leave): New. (WebCore::MediaSessionCoordinator::seekTo): Reject unless state is 'joined'. Don't call session method. (WebCore::MediaSessionCoordinator::play): Ditto. (WebCore::MediaSessionCoordinator::pause): Ditto. (WebCore::MediaSessionCoordinator::setTrack): Ditto. (WebCore::MediaSessionCoordinator::positionStateChanged): (WebCore::MediaSessionCoordinator::playbackStateChanged): (WebCore::MediaSessionCoordinator::readyStateChanged): Do nothing unless state is 'joined'. Improve logging. (WebCore::MediaSessionCoordinator::seekSessionToTime): Ditto. (WebCore::MediaSessionCoordinator::playSession): Ditto. (WebCore::MediaSessionCoordinator::pauseSession): Ditto. (WebCore::MediaSessionCoordinator::setSessionTrack): Ditto. * Modules/mediasession/MediaSessionCoordinator.h: (WebCore::MediaSessionCoordinator::identifier const): (WebCore::MediaSessionCoordinator::state const): * Modules/mediasession/MediaSessionCoordinator.idl: * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Fix Conditional. * Modules/mediasession/MediaSessionCoordinatorPrivate.h: Declare new required methods. * Modules/mediasession/MediaSessionCoordinatorState.h: Define states. * Modules/mediasession/MediaSessionCoordinatorState.idl: * Modules/mediasession/MediaSessionPlaylistMixin.idl: Fix Conditional. * Sources.txt: Add JSMediaSessionCoordinatorState.cpp. * WebCore.xcodeproj/project.pbxproj: * testing/MockMediaSessionCoordinator.cpp: (WebCore::MockMediaSessionCoordinator::join): (WebCore::MockMediaSessionCoordinator::leave): (WebCore::MockMediaSessionCoordinator::coordinatorStateChanged): * testing/MockMediaSessionCoordinator.h: Source/WebKit: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::join): (WebKit::RemoteMediaSessionCoordinatorProxy::leave): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::join): (WebKit::RemoteMediaSessionCoordinator::leave): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: LayoutTests: * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275314 268f45cc-cd09-0410-ab3c-d52691b4dbfc Canonical link: https://commits.webkit.org/235995@main
2021-03-31 23:11:14 +00:00
EXPECTED (navigator.mediaSession.readyState == 'havefuturedata') OK
RUN(navigator.mediaSession.readyState = 'haveenoughdata')
[macOS] MediaSessionCoordinator should have join and leave methods https://bugs.webkit.org/show_bug.cgi?id=223955 <rdar://problem/76021588> Reviewed by Jer Noble. Source/WebCore: Add 'join' and 'leave' methods to MediaSessionCoordinator so a page has to opt-in to participating in a coordinated session and can leave at any time. Don't have the coordinator automatically call session methods when the private coordinator finishes, just signal the promise and let the page handle it. No new tests, updated media/media-session/mock-coordinator.html. * CMakeLists.txt: * DerivedSources-input.xcfilelist: * DerivedSources-output.xcfilelist: * DerivedSources.make: * Modules/mediasession/MediaMetadata.idl: Fix Conditional. * Modules/mediasession/MediaMetadataPlaylistMixin.idl: Ditto. * Modules/mediasession/MediaPositionState.h: Add logging template. (WTF::LogArgument<WebCore::MediaPositionState>::toString): * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Switch from beging a ContextDestructionObserver to an ActiveDOMObject to the wrapper won't be collected while an event dispatch is pending. (WebCore::MediaSession::virtualHasPendingActivity const): Prevent collection while event dispatch is pending. (WebCore::MediaSession::setPositionState): Improve logging. (WebCore::MediaPositionState::toJSONString const): * Modules/mediasession/MediaSession.h: * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::join): New. (WebCore::MediaSessionCoordinator::leave): New. (WebCore::MediaSessionCoordinator::seekTo): Reject unless state is 'joined'. Don't call session method. (WebCore::MediaSessionCoordinator::play): Ditto. (WebCore::MediaSessionCoordinator::pause): Ditto. (WebCore::MediaSessionCoordinator::setTrack): Ditto. (WebCore::MediaSessionCoordinator::positionStateChanged): (WebCore::MediaSessionCoordinator::playbackStateChanged): (WebCore::MediaSessionCoordinator::readyStateChanged): Do nothing unless state is 'joined'. Improve logging. (WebCore::MediaSessionCoordinator::seekSessionToTime): Ditto. (WebCore::MediaSessionCoordinator::playSession): Ditto. (WebCore::MediaSessionCoordinator::pauseSession): Ditto. (WebCore::MediaSessionCoordinator::setSessionTrack): Ditto. * Modules/mediasession/MediaSessionCoordinator.h: (WebCore::MediaSessionCoordinator::identifier const): (WebCore::MediaSessionCoordinator::state const): * Modules/mediasession/MediaSessionCoordinator.idl: * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Fix Conditional. * Modules/mediasession/MediaSessionCoordinatorPrivate.h: Declare new required methods. * Modules/mediasession/MediaSessionCoordinatorState.h: Define states. * Modules/mediasession/MediaSessionCoordinatorState.idl: * Modules/mediasession/MediaSessionPlaylistMixin.idl: Fix Conditional. * Sources.txt: Add JSMediaSessionCoordinatorState.cpp. * WebCore.xcodeproj/project.pbxproj: * testing/MockMediaSessionCoordinator.cpp: (WebCore::MockMediaSessionCoordinator::join): (WebCore::MockMediaSessionCoordinator::leave): (WebCore::MockMediaSessionCoordinator::coordinatorStateChanged): * testing/MockMediaSessionCoordinator.h: Source/WebKit: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::join): (WebKit::RemoteMediaSessionCoordinatorProxy::leave): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::join): (WebKit::RemoteMediaSessionCoordinator::leave): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: LayoutTests: * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275314 268f45cc-cd09-0410-ab3c-d52691b4dbfc Canonical link: https://commits.webkit.org/235995@main
2021-03-31 23:11:14 +00:00
EXPECTED (latestChange == '') OK
EXPECTED (navigator.mediaSession.readyState == 'haveenoughdata') OK
[macOS] MediaSessionCoordinator should have join and leave methods https://bugs.webkit.org/show_bug.cgi?id=223955 <rdar://problem/76021588> Reviewed by Jer Noble. Source/WebCore: Add 'join' and 'leave' methods to MediaSessionCoordinator so a page has to opt-in to participating in a coordinated session and can leave at any time. Don't have the coordinator automatically call session methods when the private coordinator finishes, just signal the promise and let the page handle it. No new tests, updated media/media-session/mock-coordinator.html. * CMakeLists.txt: * DerivedSources-input.xcfilelist: * DerivedSources-output.xcfilelist: * DerivedSources.make: * Modules/mediasession/MediaMetadata.idl: Fix Conditional. * Modules/mediasession/MediaMetadataPlaylistMixin.idl: Ditto. * Modules/mediasession/MediaPositionState.h: Add logging template. (WTF::LogArgument<WebCore::MediaPositionState>::toString): * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Switch from beging a ContextDestructionObserver to an ActiveDOMObject to the wrapper won't be collected while an event dispatch is pending. (WebCore::MediaSession::virtualHasPendingActivity const): Prevent collection while event dispatch is pending. (WebCore::MediaSession::setPositionState): Improve logging. (WebCore::MediaPositionState::toJSONString const): * Modules/mediasession/MediaSession.h: * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::join): New. (WebCore::MediaSessionCoordinator::leave): New. (WebCore::MediaSessionCoordinator::seekTo): Reject unless state is 'joined'. Don't call session method. (WebCore::MediaSessionCoordinator::play): Ditto. (WebCore::MediaSessionCoordinator::pause): Ditto. (WebCore::MediaSessionCoordinator::setTrack): Ditto. (WebCore::MediaSessionCoordinator::positionStateChanged): (WebCore::MediaSessionCoordinator::playbackStateChanged): (WebCore::MediaSessionCoordinator::readyStateChanged): Do nothing unless state is 'joined'. Improve logging. (WebCore::MediaSessionCoordinator::seekSessionToTime): Ditto. (WebCore::MediaSessionCoordinator::playSession): Ditto. (WebCore::MediaSessionCoordinator::pauseSession): Ditto. (WebCore::MediaSessionCoordinator::setSessionTrack): Ditto. * Modules/mediasession/MediaSessionCoordinator.h: (WebCore::MediaSessionCoordinator::identifier const): (WebCore::MediaSessionCoordinator::state const): * Modules/mediasession/MediaSessionCoordinator.idl: * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Fix Conditional. * Modules/mediasession/MediaSessionCoordinatorPrivate.h: Declare new required methods. * Modules/mediasession/MediaSessionCoordinatorState.h: Define states. * Modules/mediasession/MediaSessionCoordinatorState.idl: * Modules/mediasession/MediaSessionPlaylistMixin.idl: Fix Conditional. * Sources.txt: Add JSMediaSessionCoordinatorState.cpp. * WebCore.xcodeproj/project.pbxproj: * testing/MockMediaSessionCoordinator.cpp: (WebCore::MockMediaSessionCoordinator::join): (WebCore::MockMediaSessionCoordinator::leave): (WebCore::MockMediaSessionCoordinator::coordinatorStateChanged): * testing/MockMediaSessionCoordinator.h: Source/WebKit: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::join): (WebKit::RemoteMediaSessionCoordinatorProxy::leave): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::join): (WebKit::RemoteMediaSessionCoordinator::leave): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: LayoutTests: * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275314 268f45cc-cd09-0410-ab3c-d52691b4dbfc Canonical link: https://commits.webkit.org/235995@main
2021-03-31 23:11:14 +00:00
EXPECTED (navigator.mediaSession.readyState == 'haveenoughdata') OK
RUN(navigator.mediaSession.readyState = 'havenothing')
[macOS] MediaSessionCoordinator should have join and leave methods https://bugs.webkit.org/show_bug.cgi?id=223955 <rdar://problem/76021588> Reviewed by Jer Noble. Source/WebCore: Add 'join' and 'leave' methods to MediaSessionCoordinator so a page has to opt-in to participating in a coordinated session and can leave at any time. Don't have the coordinator automatically call session methods when the private coordinator finishes, just signal the promise and let the page handle it. No new tests, updated media/media-session/mock-coordinator.html. * CMakeLists.txt: * DerivedSources-input.xcfilelist: * DerivedSources-output.xcfilelist: * DerivedSources.make: * Modules/mediasession/MediaMetadata.idl: Fix Conditional. * Modules/mediasession/MediaMetadataPlaylistMixin.idl: Ditto. * Modules/mediasession/MediaPositionState.h: Add logging template. (WTF::LogArgument<WebCore::MediaPositionState>::toString): * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Switch from beging a ContextDestructionObserver to an ActiveDOMObject to the wrapper won't be collected while an event dispatch is pending. (WebCore::MediaSession::virtualHasPendingActivity const): Prevent collection while event dispatch is pending. (WebCore::MediaSession::setPositionState): Improve logging. (WebCore::MediaPositionState::toJSONString const): * Modules/mediasession/MediaSession.h: * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::join): New. (WebCore::MediaSessionCoordinator::leave): New. (WebCore::MediaSessionCoordinator::seekTo): Reject unless state is 'joined'. Don't call session method. (WebCore::MediaSessionCoordinator::play): Ditto. (WebCore::MediaSessionCoordinator::pause): Ditto. (WebCore::MediaSessionCoordinator::setTrack): Ditto. (WebCore::MediaSessionCoordinator::positionStateChanged): (WebCore::MediaSessionCoordinator::playbackStateChanged): (WebCore::MediaSessionCoordinator::readyStateChanged): Do nothing unless state is 'joined'. Improve logging. (WebCore::MediaSessionCoordinator::seekSessionToTime): Ditto. (WebCore::MediaSessionCoordinator::playSession): Ditto. (WebCore::MediaSessionCoordinator::pauseSession): Ditto. (WebCore::MediaSessionCoordinator::setSessionTrack): Ditto. * Modules/mediasession/MediaSessionCoordinator.h: (WebCore::MediaSessionCoordinator::identifier const): (WebCore::MediaSessionCoordinator::state const): * Modules/mediasession/MediaSessionCoordinator.idl: * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Fix Conditional. * Modules/mediasession/MediaSessionCoordinatorPrivate.h: Declare new required methods. * Modules/mediasession/MediaSessionCoordinatorState.h: Define states. * Modules/mediasession/MediaSessionCoordinatorState.idl: * Modules/mediasession/MediaSessionPlaylistMixin.idl: Fix Conditional. * Sources.txt: Add JSMediaSessionCoordinatorState.cpp. * WebCore.xcodeproj/project.pbxproj: * testing/MockMediaSessionCoordinator.cpp: (WebCore::MockMediaSessionCoordinator::join): (WebCore::MockMediaSessionCoordinator::leave): (WebCore::MockMediaSessionCoordinator::coordinatorStateChanged): * testing/MockMediaSessionCoordinator.h: Source/WebKit: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::join): (WebKit::RemoteMediaSessionCoordinatorProxy::leave): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::join): (WebKit::RemoteMediaSessionCoordinator::leave): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: LayoutTests: * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275314 268f45cc-cd09-0410-ab3c-d52691b4dbfc Canonical link: https://commits.webkit.org/235995@main
2021-03-31 23:11:14 +00:00
EXPECTED (latestChange == '') OK
EXPECTED (navigator.mediaSession.readyState == 'havenothing') OK
[macOS] MediaSessionCoordinator should have join and leave methods https://bugs.webkit.org/show_bug.cgi?id=223955 <rdar://problem/76021588> Reviewed by Jer Noble. Source/WebCore: Add 'join' and 'leave' methods to MediaSessionCoordinator so a page has to opt-in to participating in a coordinated session and can leave at any time. Don't have the coordinator automatically call session methods when the private coordinator finishes, just signal the promise and let the page handle it. No new tests, updated media/media-session/mock-coordinator.html. * CMakeLists.txt: * DerivedSources-input.xcfilelist: * DerivedSources-output.xcfilelist: * DerivedSources.make: * Modules/mediasession/MediaMetadata.idl: Fix Conditional. * Modules/mediasession/MediaMetadataPlaylistMixin.idl: Ditto. * Modules/mediasession/MediaPositionState.h: Add logging template. (WTF::LogArgument<WebCore::MediaPositionState>::toString): * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Switch from beging a ContextDestructionObserver to an ActiveDOMObject to the wrapper won't be collected while an event dispatch is pending. (WebCore::MediaSession::virtualHasPendingActivity const): Prevent collection while event dispatch is pending. (WebCore::MediaSession::setPositionState): Improve logging. (WebCore::MediaPositionState::toJSONString const): * Modules/mediasession/MediaSession.h: * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::join): New. (WebCore::MediaSessionCoordinator::leave): New. (WebCore::MediaSessionCoordinator::seekTo): Reject unless state is 'joined'. Don't call session method. (WebCore::MediaSessionCoordinator::play): Ditto. (WebCore::MediaSessionCoordinator::pause): Ditto. (WebCore::MediaSessionCoordinator::setTrack): Ditto. (WebCore::MediaSessionCoordinator::positionStateChanged): (WebCore::MediaSessionCoordinator::playbackStateChanged): (WebCore::MediaSessionCoordinator::readyStateChanged): Do nothing unless state is 'joined'. Improve logging. (WebCore::MediaSessionCoordinator::seekSessionToTime): Ditto. (WebCore::MediaSessionCoordinator::playSession): Ditto. (WebCore::MediaSessionCoordinator::pauseSession): Ditto. (WebCore::MediaSessionCoordinator::setSessionTrack): Ditto. * Modules/mediasession/MediaSessionCoordinator.h: (WebCore::MediaSessionCoordinator::identifier const): (WebCore::MediaSessionCoordinator::state const): * Modules/mediasession/MediaSessionCoordinator.idl: * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Fix Conditional. * Modules/mediasession/MediaSessionCoordinatorPrivate.h: Declare new required methods. * Modules/mediasession/MediaSessionCoordinatorState.h: Define states. * Modules/mediasession/MediaSessionCoordinatorState.idl: * Modules/mediasession/MediaSessionPlaylistMixin.idl: Fix Conditional. * Sources.txt: Add JSMediaSessionCoordinatorState.cpp. * WebCore.xcodeproj/project.pbxproj: * testing/MockMediaSessionCoordinator.cpp: (WebCore::MockMediaSessionCoordinator::join): (WebCore::MockMediaSessionCoordinator::leave): (WebCore::MockMediaSessionCoordinator::coordinatorStateChanged): * testing/MockMediaSessionCoordinator.h: Source/WebKit: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::join): (WebKit::RemoteMediaSessionCoordinatorProxy::leave): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::join): (WebKit::RemoteMediaSessionCoordinator::leave): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: LayoutTests: * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275314 268f45cc-cd09-0410-ab3c-d52691b4dbfc Canonical link: https://commits.webkit.org/235995@main
2021-03-31 23:11:14 +00:00
* PlaybackState
EXPECTED (navigator.mediaSession.playbackState == 'none') OK
RUN(navigator.mediaSession.playbackState = 'paused')
EXPECTED (latestChange == '') OK
EXPECTED (navigator.mediaSession.playbackState == 'paused') OK
EXPECTED (navigator.mediaSession.playbackState == 'paused') OK
RUN(navigator.mediaSession.playbackState = 'playing')
EXPECTED (latestChange == '') OK
EXPECTED (navigator.mediaSession.playbackState == 'playing') OK
EXPECTED (navigator.mediaSession.playbackState == 'playing') OK
RUN(navigator.mediaSession.playbackState = 'none')
EXPECTED (latestChange == '') OK
EXPECTED (navigator.mediaSession.playbackState == 'none') OK
** session.join() should reject on failure
RUN(internals.setMockMediaSessionCoordinatorCommandsShouldFail(true))
RUN(promise = navigator.mediaSession.coordinator.join())
Promise rejected correctly OK
EXPECTED (navigator.mediaSession.coordinator.state == 'waiting') OK
EXPECTED (latestChange == '') OK
RUN(internals.setMockMediaSessionCoordinatorCommandsShouldFail(false))
RUN(promise = navigator.mediaSession.coordinator.join())
LayoutTests/imported/w3c: MediaSession.coordinator should not be optional, relying on coordinator state change instead https://bugs.webkit.org/show_bug.cgi?id=226328 rdar://77461335 Reviewed by Eric Carlson. * web-platform-tests/mediasession/idlharness.window-expected.txt: Source/WebCore: MediaSession.coordinator should not be optional, relying on coordinator state change instead https://bugs.webkit.org/show_bug.cgi?id=226328 rdar://77461335 Reviewed by Eric Carlson. The coordinator was a read-only optional attribute of the MediaSession element. Testing if the attribute was to be used to determine if a MediaSessionCoordinator was now available and for the MediaSession to join it. This made the use of an external polyfill difficult and enforcing the validity of an user created custom MediaSessionCoordinator due to IDL semantics limitations hard. We instead always create a MediaSessionCoordinator which in its default state is Closed. Once this state is changed to Waiting and an event is fire the MediaSession can now join it. * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): MediaSession no longer needs to fire event. Remove no longer necessary inheritance and async event queue. (WebCore::MediaSession::create): Drive-by fix, don't call suspendIfNeeded() in the constructor. (WebCore::MediaSession::createCoordinator): Make method private. * Modules/mediasession/MediaSession.h: (WebCore::MediaSession::coordinator const): MediaSessionCoordinator always exists. Return reference instead. * Modules/mediasession/MediaSession.idl: Amend definition, remove EventHandler * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::create): (WebCore::MediaSessionCoordinator::MediaSessionCoordinator): (WebCore::MediaSessionCoordinator::setMediaSessionCoordinatorPrivate): (WebCore::MediaSessionCoordinator::virtualHasPendingActivity const): (WebCore::MediaSessionCoordinator::join): (WebCore::MediaSessionCoordinator::close): (WebCore::MediaSessionCoordinator::coordinatorStateChanged): * Modules/mediasession/MediaSessionCoordinator.h: * Modules/mediasession/MediaSessionCoordinator.idl: Added new EventHandler attribute. * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Update for new API definition. * dom/EventNames.h: * dom/EventTargetFactory.in: * page/Page.cpp: (WebCore::Page::setMediaSessionCoordinator): (WebCore::Page::invalidateMediaSessionCoordinator): * testing/Internals.cpp: (WebCore::Internals::registerMockMediaSessionCoordinator): Tools: MediaSession.coordinator should not be optional, relying on coordinator readyState change instead https://bugs.webkit.org/show_bug.cgi?id=226328 rdar://77461335 Reviewed by Eric Carlson. * TestWebKitAPI/Tests/WebKit/MediaSessionCoordinatorTest.mm: (TestWebKitAPI::MediaSessionCoordinatorTest::createCoordinator): Change test to match new API, using coordinatorstatechange event instead. * TestWebKitAPI/Tests/WebKitCocoa/media-remote.html: LayoutTests: MediaSession.coordinator should not be optional, relying on coordinator readyState change instead https://bugs.webkit.org/show_bug.cgi?id=226328 rdar://77461335 Reviewed by Eric Carlson. * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: Change test to match new API. Canonical link: https://commits.webkit.org/238369@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@278336 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-06-02 01:20:38 +00:00
EVENT(coordinatorstatechange STATE(joined)
[macOS] MediaSessionCoordinator should have join and leave methods https://bugs.webkit.org/show_bug.cgi?id=223955 <rdar://problem/76021588> Reviewed by Jer Noble. Source/WebCore: Add 'join' and 'leave' methods to MediaSessionCoordinator so a page has to opt-in to participating in a coordinated session and can leave at any time. Don't have the coordinator automatically call session methods when the private coordinator finishes, just signal the promise and let the page handle it. No new tests, updated media/media-session/mock-coordinator.html. * CMakeLists.txt: * DerivedSources-input.xcfilelist: * DerivedSources-output.xcfilelist: * DerivedSources.make: * Modules/mediasession/MediaMetadata.idl: Fix Conditional. * Modules/mediasession/MediaMetadataPlaylistMixin.idl: Ditto. * Modules/mediasession/MediaPositionState.h: Add logging template. (WTF::LogArgument<WebCore::MediaPositionState>::toString): * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Switch from beging a ContextDestructionObserver to an ActiveDOMObject to the wrapper won't be collected while an event dispatch is pending. (WebCore::MediaSession::virtualHasPendingActivity const): Prevent collection while event dispatch is pending. (WebCore::MediaSession::setPositionState): Improve logging. (WebCore::MediaPositionState::toJSONString const): * Modules/mediasession/MediaSession.h: * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::join): New. (WebCore::MediaSessionCoordinator::leave): New. (WebCore::MediaSessionCoordinator::seekTo): Reject unless state is 'joined'. Don't call session method. (WebCore::MediaSessionCoordinator::play): Ditto. (WebCore::MediaSessionCoordinator::pause): Ditto. (WebCore::MediaSessionCoordinator::setTrack): Ditto. (WebCore::MediaSessionCoordinator::positionStateChanged): (WebCore::MediaSessionCoordinator::playbackStateChanged): (WebCore::MediaSessionCoordinator::readyStateChanged): Do nothing unless state is 'joined'. Improve logging. (WebCore::MediaSessionCoordinator::seekSessionToTime): Ditto. (WebCore::MediaSessionCoordinator::playSession): Ditto. (WebCore::MediaSessionCoordinator::pauseSession): Ditto. (WebCore::MediaSessionCoordinator::setSessionTrack): Ditto. * Modules/mediasession/MediaSessionCoordinator.h: (WebCore::MediaSessionCoordinator::identifier const): (WebCore::MediaSessionCoordinator::state const): * Modules/mediasession/MediaSessionCoordinator.idl: * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Fix Conditional. * Modules/mediasession/MediaSessionCoordinatorPrivate.h: Declare new required methods. * Modules/mediasession/MediaSessionCoordinatorState.h: Define states. * Modules/mediasession/MediaSessionCoordinatorState.idl: * Modules/mediasession/MediaSessionPlaylistMixin.idl: Fix Conditional. * Sources.txt: Add JSMediaSessionCoordinatorState.cpp. * WebCore.xcodeproj/project.pbxproj: * testing/MockMediaSessionCoordinator.cpp: (WebCore::MockMediaSessionCoordinator::join): (WebCore::MockMediaSessionCoordinator::leave): (WebCore::MockMediaSessionCoordinator::coordinatorStateChanged): * testing/MockMediaSessionCoordinator.h: Source/WebKit: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::join): (WebKit::RemoteMediaSessionCoordinatorProxy::leave): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::join): (WebKit::RemoteMediaSessionCoordinator::leave): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: LayoutTests: * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275314 268f45cc-cd09-0410-ab3c-d52691b4dbfc Canonical link: https://commits.webkit.org/235995@main
2021-03-31 23:11:14 +00:00
Promise resolved OK
EXPECTED (navigator.mediaSession.coordinator.state == 'joined') OK
[Cocoa] Add Experimental MediaSession coordinator https://bugs.webkit.org/show_bug.cgi?id=222158 <rdar://problem/74508862> Reviewed by Jer Noble. Source/WebCore: Add an experimental MediaSession coordinator, an object that provides an interface that allows script to coordinate changes to MediaSession with the User Agent. Also add an experimental MediaSession playlist interface. The changes are behind new experimental feature flags, MediaSessionCoordinatorEnabled and MediaSessionPlaylistEnabled. Test: media/media-session/mock-coordinator.html * DerivedSources-input.xcfilelist: Add new IDL files. * DerivedSources-output.xcfilelist: Add new derived sources. * DerivedSources.make: Add new IDL. * Modules/mediasession/MediaMetadata.cpp: (WebCore::MediaMetadata::create): Set trackIdentifier from init data. (WebCore::MediaMetadata::setTrackIdentifier): trackIdentifier setter. * Modules/mediasession/MediaMetadata.h: (WebCore::MediaMetadata::trackIdentifier const): * Modules/mediasession/MediaMetadata.idl: * Modules/mediasession/MediaMetadataInit.h: Add trackIdentifier. (WebCore::MediaMetadataInit::encode const): (WebCore::MediaMetadataInit::decode): * Modules/mediasession/MediaMetadataInit.idl: * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Initialize MainThreadGenericEventQueue. (WebCore::MediaSession::setMetadata): metadataUpdated -> notifyMetadataObservers. (WebCore::MediaSession::setReadyState): Session readyState setter. (WebCore::MediaSession::setCoordinator): Coordinator setter. Post 'coordinatorchange' event after change. (WebCore::MediaSession::setPlaylist): Playlist setter. (WebCore::MediaSession::setActionHandler): Call notifyActionHandlerObservers. (WebCore::MediaSession::setPositionState): Call notifyPositionStateObservers. (WebCore::MediaSession::metadataUpdated): Call notifyMetadataObservers. (WebCore::MediaSession::addObserver): New. (WebCore::MediaSession::removeObserver): New. (WebCore::MediaSession::forEachObserver): New. (WebCore::MediaSession::notifyMetadataObservers): New. (WebCore::MediaSession::notifyPositionStateObservers): New. (WebCore::MediaSession::notifyPlaybackStateObservers): New. (WebCore::MediaSession::notifyActionHandlerObservers): New. (WebCore::MediaSession::notifyReadyStateObservers): New. * Modules/mediasession/MediaSession.h: (WebCore::MediaSession::coordinator const): (WebCore::MediaSession::playlist const): (WebCore::MediaSession::logger const): * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionAction.h: * Modules/mediasession/MediaSessionAction.idl: * Modules/mediasession/MediaSessionActionDetails.h: * Modules/mediasession/MediaSessionActionDetails.idl: MediaSessionCoordinator proxies calls through the PlatformMediaSessionCoordinator, and then calls the equivalent MediaSession methode if the platform coordinator is successful. * Modules/mediasession/MediaSessionCoordinator.cpp: Added. (WebCore::nextCoordinatorLogIdentifier): (WebCore::MediaSessionCoordinator::create): (WebCore::MediaSessionCoordinator::MediaSessionCoordinator): (WebCore::MediaSessionCoordinator::seekTo): (WebCore::MediaSessionCoordinator::play): (WebCore::MediaSessionCoordinator::pause): (WebCore::MediaSessionCoordinator::setTrack): (WebCore::MediaSessionCoordinator::setMediaSession): (WebCore::MediaSessionCoordinator::logChannel): * Modules/mediasession/MediaSessionCoordinator.h: New. (WebCore::MediaSessionCoordinator::logger const): (WebCore::MediaSessionCoordinator::logIdentifier const): (WebCore::MediaSessionCoordinator::logClassName): * Modules/mediasession/MediaSessionCoordinator.idl: New. * Modules/mediasession/NavigatorMediaSession.h: * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * bindings/js/WebCoreBuiltinNames.h: * dom/EventNames.h: * dom/EventTargetFactory.in: * platform/graphics/PlatformMediaSessionCoordinator.h: Added. (WebCore::PlatformMediaSessionCoordinator::setLogger): (WebCore::PlatformMediaSessionCoordinator::loggerPtr const): (WebCore::PlatformMediaSessionCoordinator::logIdentifier const): (WebCore::PlatformMediaSessionCoordinator::logClassName const): (WebCore::PlatformMediaSessionCoordinator::logChannel const): * testing/Internals.cpp: (WebCore::Internals::registerMockMediaSessionCoordinator): Register the mock media session coordinator for testing. * testing/Internals.h: * testing/Internals.idl: * testing/MockMediaSessionCoordinator.cpp: Added. (WebCore::MockMediaSessionCoordinator::create): (WebCore::MockMediaSessionCoordinator::MockMediaSessionCoordinator): (WebCore::MockMediaSessionCoordinator::seekTo): (WebCore::MockMediaSessionCoordinator::play): (WebCore::MockMediaSessionCoordinator::pause): (WebCore::MockMediaSessionCoordinator::setTrack): * testing/MockMediaSessionCoordinator.h: New. Source/WTF: * Scripts/Preferences/WebPreferencesExperimental.yaml: * wtf/PlatformEnableCocoa.h: LayoutTests: * platform/TestExpectations: * media/media-session/mock-coordinator-expected.txt: Added. * media/media-session/mock-coordinator.html: Added. Canonical link: https://commits.webkit.org/235728@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@274983 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-03-24 23:14:51 +00:00
** Test that when coordinator methods succeed, promises resolve and mediaSession action handlers are called.
[macOS] MediaSessionCoordinator should have join and leave methods https://bugs.webkit.org/show_bug.cgi?id=223955 <rdar://problem/76021588> Reviewed by Jer Noble. Source/WebCore: Add 'join' and 'leave' methods to MediaSessionCoordinator so a page has to opt-in to participating in a coordinated session and can leave at any time. Don't have the coordinator automatically call session methods when the private coordinator finishes, just signal the promise and let the page handle it. No new tests, updated media/media-session/mock-coordinator.html. * CMakeLists.txt: * DerivedSources-input.xcfilelist: * DerivedSources-output.xcfilelist: * DerivedSources.make: * Modules/mediasession/MediaMetadata.idl: Fix Conditional. * Modules/mediasession/MediaMetadataPlaylistMixin.idl: Ditto. * Modules/mediasession/MediaPositionState.h: Add logging template. (WTF::LogArgument<WebCore::MediaPositionState>::toString): * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Switch from beging a ContextDestructionObserver to an ActiveDOMObject to the wrapper won't be collected while an event dispatch is pending. (WebCore::MediaSession::virtualHasPendingActivity const): Prevent collection while event dispatch is pending. (WebCore::MediaSession::setPositionState): Improve logging. (WebCore::MediaPositionState::toJSONString const): * Modules/mediasession/MediaSession.h: * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::join): New. (WebCore::MediaSessionCoordinator::leave): New. (WebCore::MediaSessionCoordinator::seekTo): Reject unless state is 'joined'. Don't call session method. (WebCore::MediaSessionCoordinator::play): Ditto. (WebCore::MediaSessionCoordinator::pause): Ditto. (WebCore::MediaSessionCoordinator::setTrack): Ditto. (WebCore::MediaSessionCoordinator::positionStateChanged): (WebCore::MediaSessionCoordinator::playbackStateChanged): (WebCore::MediaSessionCoordinator::readyStateChanged): Do nothing unless state is 'joined'. Improve logging. (WebCore::MediaSessionCoordinator::seekSessionToTime): Ditto. (WebCore::MediaSessionCoordinator::playSession): Ditto. (WebCore::MediaSessionCoordinator::pauseSession): Ditto. (WebCore::MediaSessionCoordinator::setSessionTrack): Ditto. * Modules/mediasession/MediaSessionCoordinator.h: (WebCore::MediaSessionCoordinator::identifier const): (WebCore::MediaSessionCoordinator::state const): * Modules/mediasession/MediaSessionCoordinator.idl: * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Fix Conditional. * Modules/mediasession/MediaSessionCoordinatorPrivate.h: Declare new required methods. * Modules/mediasession/MediaSessionCoordinatorState.h: Define states. * Modules/mediasession/MediaSessionCoordinatorState.idl: * Modules/mediasession/MediaSessionPlaylistMixin.idl: Fix Conditional. * Sources.txt: Add JSMediaSessionCoordinatorState.cpp. * WebCore.xcodeproj/project.pbxproj: * testing/MockMediaSessionCoordinator.cpp: (WebCore::MockMediaSessionCoordinator::join): (WebCore::MockMediaSessionCoordinator::leave): (WebCore::MockMediaSessionCoordinator::coordinatorStateChanged): * testing/MockMediaSessionCoordinator.h: Source/WebKit: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::join): (WebKit::RemoteMediaSessionCoordinatorProxy::leave): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::join): (WebKit::RemoteMediaSessionCoordinator::leave): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: LayoutTests: * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275314 268f45cc-cd09-0410-ab3c-d52691b4dbfc Canonical link: https://commits.webkit.org/235995@main
2021-03-31 23:11:14 +00:00
RUN(promise = navigator.mediaSession.coordinator.play())
Promise resolved OK
[Cocoa] Add Experimental MediaSession coordinator https://bugs.webkit.org/show_bug.cgi?id=222158 <rdar://problem/74508862> Reviewed by Jer Noble. Source/WebCore: Add an experimental MediaSession coordinator, an object that provides an interface that allows script to coordinate changes to MediaSession with the User Agent. Also add an experimental MediaSession playlist interface. The changes are behind new experimental feature flags, MediaSessionCoordinatorEnabled and MediaSessionPlaylistEnabled. Test: media/media-session/mock-coordinator.html * DerivedSources-input.xcfilelist: Add new IDL files. * DerivedSources-output.xcfilelist: Add new derived sources. * DerivedSources.make: Add new IDL. * Modules/mediasession/MediaMetadata.cpp: (WebCore::MediaMetadata::create): Set trackIdentifier from init data. (WebCore::MediaMetadata::setTrackIdentifier): trackIdentifier setter. * Modules/mediasession/MediaMetadata.h: (WebCore::MediaMetadata::trackIdentifier const): * Modules/mediasession/MediaMetadata.idl: * Modules/mediasession/MediaMetadataInit.h: Add trackIdentifier. (WebCore::MediaMetadataInit::encode const): (WebCore::MediaMetadataInit::decode): * Modules/mediasession/MediaMetadataInit.idl: * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Initialize MainThreadGenericEventQueue. (WebCore::MediaSession::setMetadata): metadataUpdated -> notifyMetadataObservers. (WebCore::MediaSession::setReadyState): Session readyState setter. (WebCore::MediaSession::setCoordinator): Coordinator setter. Post 'coordinatorchange' event after change. (WebCore::MediaSession::setPlaylist): Playlist setter. (WebCore::MediaSession::setActionHandler): Call notifyActionHandlerObservers. (WebCore::MediaSession::setPositionState): Call notifyPositionStateObservers. (WebCore::MediaSession::metadataUpdated): Call notifyMetadataObservers. (WebCore::MediaSession::addObserver): New. (WebCore::MediaSession::removeObserver): New. (WebCore::MediaSession::forEachObserver): New. (WebCore::MediaSession::notifyMetadataObservers): New. (WebCore::MediaSession::notifyPositionStateObservers): New. (WebCore::MediaSession::notifyPlaybackStateObservers): New. (WebCore::MediaSession::notifyActionHandlerObservers): New. (WebCore::MediaSession::notifyReadyStateObservers): New. * Modules/mediasession/MediaSession.h: (WebCore::MediaSession::coordinator const): (WebCore::MediaSession::playlist const): (WebCore::MediaSession::logger const): * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionAction.h: * Modules/mediasession/MediaSessionAction.idl: * Modules/mediasession/MediaSessionActionDetails.h: * Modules/mediasession/MediaSessionActionDetails.idl: MediaSessionCoordinator proxies calls through the PlatformMediaSessionCoordinator, and then calls the equivalent MediaSession methode if the platform coordinator is successful. * Modules/mediasession/MediaSessionCoordinator.cpp: Added. (WebCore::nextCoordinatorLogIdentifier): (WebCore::MediaSessionCoordinator::create): (WebCore::MediaSessionCoordinator::MediaSessionCoordinator): (WebCore::MediaSessionCoordinator::seekTo): (WebCore::MediaSessionCoordinator::play): (WebCore::MediaSessionCoordinator::pause): (WebCore::MediaSessionCoordinator::setTrack): (WebCore::MediaSessionCoordinator::setMediaSession): (WebCore::MediaSessionCoordinator::logChannel): * Modules/mediasession/MediaSessionCoordinator.h: New. (WebCore::MediaSessionCoordinator::logger const): (WebCore::MediaSessionCoordinator::logIdentifier const): (WebCore::MediaSessionCoordinator::logClassName): * Modules/mediasession/MediaSessionCoordinator.idl: New. * Modules/mediasession/NavigatorMediaSession.h: * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * bindings/js/WebCoreBuiltinNames.h: * dom/EventNames.h: * dom/EventTargetFactory.in: * platform/graphics/PlatformMediaSessionCoordinator.h: Added. (WebCore::PlatformMediaSessionCoordinator::setLogger): (WebCore::PlatformMediaSessionCoordinator::loggerPtr const): (WebCore::PlatformMediaSessionCoordinator::logIdentifier const): (WebCore::PlatformMediaSessionCoordinator::logClassName const): (WebCore::PlatformMediaSessionCoordinator::logChannel const): * testing/Internals.cpp: (WebCore::Internals::registerMockMediaSessionCoordinator): Register the mock media session coordinator for testing. * testing/Internals.h: * testing/Internals.idl: * testing/MockMediaSessionCoordinator.cpp: Added. (WebCore::MockMediaSessionCoordinator::create): (WebCore::MockMediaSessionCoordinator::MockMediaSessionCoordinator): (WebCore::MockMediaSessionCoordinator::seekTo): (WebCore::MockMediaSessionCoordinator::play): (WebCore::MockMediaSessionCoordinator::pause): (WebCore::MockMediaSessionCoordinator::setTrack): * testing/MockMediaSessionCoordinator.h: New. Source/WTF: * Scripts/Preferences/WebPreferencesExperimental.yaml: * wtf/PlatformEnableCocoa.h: LayoutTests: * platform/TestExpectations: * media/media-session/mock-coordinator-expected.txt: Added. * media/media-session/mock-coordinator.html: Added. Canonical link: https://commits.webkit.org/235728@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@274983 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-03-24 23:14:51 +00:00
[macOS] MediaSessionCoordinator should have join and leave methods https://bugs.webkit.org/show_bug.cgi?id=223955 <rdar://problem/76021588> Reviewed by Jer Noble. Source/WebCore: Add 'join' and 'leave' methods to MediaSessionCoordinator so a page has to opt-in to participating in a coordinated session and can leave at any time. Don't have the coordinator automatically call session methods when the private coordinator finishes, just signal the promise and let the page handle it. No new tests, updated media/media-session/mock-coordinator.html. * CMakeLists.txt: * DerivedSources-input.xcfilelist: * DerivedSources-output.xcfilelist: * DerivedSources.make: * Modules/mediasession/MediaMetadata.idl: Fix Conditional. * Modules/mediasession/MediaMetadataPlaylistMixin.idl: Ditto. * Modules/mediasession/MediaPositionState.h: Add logging template. (WTF::LogArgument<WebCore::MediaPositionState>::toString): * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Switch from beging a ContextDestructionObserver to an ActiveDOMObject to the wrapper won't be collected while an event dispatch is pending. (WebCore::MediaSession::virtualHasPendingActivity const): Prevent collection while event dispatch is pending. (WebCore::MediaSession::setPositionState): Improve logging. (WebCore::MediaPositionState::toJSONString const): * Modules/mediasession/MediaSession.h: * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::join): New. (WebCore::MediaSessionCoordinator::leave): New. (WebCore::MediaSessionCoordinator::seekTo): Reject unless state is 'joined'. Don't call session method. (WebCore::MediaSessionCoordinator::play): Ditto. (WebCore::MediaSessionCoordinator::pause): Ditto. (WebCore::MediaSessionCoordinator::setTrack): Ditto. (WebCore::MediaSessionCoordinator::positionStateChanged): (WebCore::MediaSessionCoordinator::playbackStateChanged): (WebCore::MediaSessionCoordinator::readyStateChanged): Do nothing unless state is 'joined'. Improve logging. (WebCore::MediaSessionCoordinator::seekSessionToTime): Ditto. (WebCore::MediaSessionCoordinator::playSession): Ditto. (WebCore::MediaSessionCoordinator::pauseSession): Ditto. (WebCore::MediaSessionCoordinator::setSessionTrack): Ditto. * Modules/mediasession/MediaSessionCoordinator.h: (WebCore::MediaSessionCoordinator::identifier const): (WebCore::MediaSessionCoordinator::state const): * Modules/mediasession/MediaSessionCoordinator.idl: * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Fix Conditional. * Modules/mediasession/MediaSessionCoordinatorPrivate.h: Declare new required methods. * Modules/mediasession/MediaSessionCoordinatorState.h: Define states. * Modules/mediasession/MediaSessionCoordinatorState.idl: * Modules/mediasession/MediaSessionPlaylistMixin.idl: Fix Conditional. * Sources.txt: Add JSMediaSessionCoordinatorState.cpp. * WebCore.xcodeproj/project.pbxproj: * testing/MockMediaSessionCoordinator.cpp: (WebCore::MockMediaSessionCoordinator::join): (WebCore::MockMediaSessionCoordinator::leave): (WebCore::MockMediaSessionCoordinator::coordinatorStateChanged): * testing/MockMediaSessionCoordinator.h: Source/WebKit: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::join): (WebKit::RemoteMediaSessionCoordinatorProxy::leave): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::join): (WebKit::RemoteMediaSessionCoordinator::leave): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: LayoutTests: * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275314 268f45cc-cd09-0410-ab3c-d52691b4dbfc Canonical link: https://commits.webkit.org/235995@main
2021-03-31 23:11:14 +00:00
RUN(promise = navigator.mediaSession.coordinator.pause())
Promise resolved OK
[Cocoa] Add Experimental MediaSession coordinator https://bugs.webkit.org/show_bug.cgi?id=222158 <rdar://problem/74508862> Reviewed by Jer Noble. Source/WebCore: Add an experimental MediaSession coordinator, an object that provides an interface that allows script to coordinate changes to MediaSession with the User Agent. Also add an experimental MediaSession playlist interface. The changes are behind new experimental feature flags, MediaSessionCoordinatorEnabled and MediaSessionPlaylistEnabled. Test: media/media-session/mock-coordinator.html * DerivedSources-input.xcfilelist: Add new IDL files. * DerivedSources-output.xcfilelist: Add new derived sources. * DerivedSources.make: Add new IDL. * Modules/mediasession/MediaMetadata.cpp: (WebCore::MediaMetadata::create): Set trackIdentifier from init data. (WebCore::MediaMetadata::setTrackIdentifier): trackIdentifier setter. * Modules/mediasession/MediaMetadata.h: (WebCore::MediaMetadata::trackIdentifier const): * Modules/mediasession/MediaMetadata.idl: * Modules/mediasession/MediaMetadataInit.h: Add trackIdentifier. (WebCore::MediaMetadataInit::encode const): (WebCore::MediaMetadataInit::decode): * Modules/mediasession/MediaMetadataInit.idl: * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Initialize MainThreadGenericEventQueue. (WebCore::MediaSession::setMetadata): metadataUpdated -> notifyMetadataObservers. (WebCore::MediaSession::setReadyState): Session readyState setter. (WebCore::MediaSession::setCoordinator): Coordinator setter. Post 'coordinatorchange' event after change. (WebCore::MediaSession::setPlaylist): Playlist setter. (WebCore::MediaSession::setActionHandler): Call notifyActionHandlerObservers. (WebCore::MediaSession::setPositionState): Call notifyPositionStateObservers. (WebCore::MediaSession::metadataUpdated): Call notifyMetadataObservers. (WebCore::MediaSession::addObserver): New. (WebCore::MediaSession::removeObserver): New. (WebCore::MediaSession::forEachObserver): New. (WebCore::MediaSession::notifyMetadataObservers): New. (WebCore::MediaSession::notifyPositionStateObservers): New. (WebCore::MediaSession::notifyPlaybackStateObservers): New. (WebCore::MediaSession::notifyActionHandlerObservers): New. (WebCore::MediaSession::notifyReadyStateObservers): New. * Modules/mediasession/MediaSession.h: (WebCore::MediaSession::coordinator const): (WebCore::MediaSession::playlist const): (WebCore::MediaSession::logger const): * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionAction.h: * Modules/mediasession/MediaSessionAction.idl: * Modules/mediasession/MediaSessionActionDetails.h: * Modules/mediasession/MediaSessionActionDetails.idl: MediaSessionCoordinator proxies calls through the PlatformMediaSessionCoordinator, and then calls the equivalent MediaSession methode if the platform coordinator is successful. * Modules/mediasession/MediaSessionCoordinator.cpp: Added. (WebCore::nextCoordinatorLogIdentifier): (WebCore::MediaSessionCoordinator::create): (WebCore::MediaSessionCoordinator::MediaSessionCoordinator): (WebCore::MediaSessionCoordinator::seekTo): (WebCore::MediaSessionCoordinator::play): (WebCore::MediaSessionCoordinator::pause): (WebCore::MediaSessionCoordinator::setTrack): (WebCore::MediaSessionCoordinator::setMediaSession): (WebCore::MediaSessionCoordinator::logChannel): * Modules/mediasession/MediaSessionCoordinator.h: New. (WebCore::MediaSessionCoordinator::logger const): (WebCore::MediaSessionCoordinator::logIdentifier const): (WebCore::MediaSessionCoordinator::logClassName): * Modules/mediasession/MediaSessionCoordinator.idl: New. * Modules/mediasession/NavigatorMediaSession.h: * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * bindings/js/WebCoreBuiltinNames.h: * dom/EventNames.h: * dom/EventTargetFactory.in: * platform/graphics/PlatformMediaSessionCoordinator.h: Added. (WebCore::PlatformMediaSessionCoordinator::setLogger): (WebCore::PlatformMediaSessionCoordinator::loggerPtr const): (WebCore::PlatformMediaSessionCoordinator::logIdentifier const): (WebCore::PlatformMediaSessionCoordinator::logClassName const): (WebCore::PlatformMediaSessionCoordinator::logChannel const): * testing/Internals.cpp: (WebCore::Internals::registerMockMediaSessionCoordinator): Register the mock media session coordinator for testing. * testing/Internals.h: * testing/Internals.idl: * testing/MockMediaSessionCoordinator.cpp: Added. (WebCore::MockMediaSessionCoordinator::create): (WebCore::MockMediaSessionCoordinator::MockMediaSessionCoordinator): (WebCore::MockMediaSessionCoordinator::seekTo): (WebCore::MockMediaSessionCoordinator::play): (WebCore::MockMediaSessionCoordinator::pause): (WebCore::MockMediaSessionCoordinator::setTrack): * testing/MockMediaSessionCoordinator.h: New. Source/WTF: * Scripts/Preferences/WebPreferencesExperimental.yaml: * wtf/PlatformEnableCocoa.h: LayoutTests: * platform/TestExpectations: * media/media-session/mock-coordinator-expected.txt: Added. * media/media-session/mock-coordinator.html: Added. Canonical link: https://commits.webkit.org/235728@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@274983 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-03-24 23:14:51 +00:00
[macOS] MediaSessionCoordinator should have join and leave methods https://bugs.webkit.org/show_bug.cgi?id=223955 <rdar://problem/76021588> Reviewed by Jer Noble. Source/WebCore: Add 'join' and 'leave' methods to MediaSessionCoordinator so a page has to opt-in to participating in a coordinated session and can leave at any time. Don't have the coordinator automatically call session methods when the private coordinator finishes, just signal the promise and let the page handle it. No new tests, updated media/media-session/mock-coordinator.html. * CMakeLists.txt: * DerivedSources-input.xcfilelist: * DerivedSources-output.xcfilelist: * DerivedSources.make: * Modules/mediasession/MediaMetadata.idl: Fix Conditional. * Modules/mediasession/MediaMetadataPlaylistMixin.idl: Ditto. * Modules/mediasession/MediaPositionState.h: Add logging template. (WTF::LogArgument<WebCore::MediaPositionState>::toString): * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Switch from beging a ContextDestructionObserver to an ActiveDOMObject to the wrapper won't be collected while an event dispatch is pending. (WebCore::MediaSession::virtualHasPendingActivity const): Prevent collection while event dispatch is pending. (WebCore::MediaSession::setPositionState): Improve logging. (WebCore::MediaPositionState::toJSONString const): * Modules/mediasession/MediaSession.h: * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::join): New. (WebCore::MediaSessionCoordinator::leave): New. (WebCore::MediaSessionCoordinator::seekTo): Reject unless state is 'joined'. Don't call session method. (WebCore::MediaSessionCoordinator::play): Ditto. (WebCore::MediaSessionCoordinator::pause): Ditto. (WebCore::MediaSessionCoordinator::setTrack): Ditto. (WebCore::MediaSessionCoordinator::positionStateChanged): (WebCore::MediaSessionCoordinator::playbackStateChanged): (WebCore::MediaSessionCoordinator::readyStateChanged): Do nothing unless state is 'joined'. Improve logging. (WebCore::MediaSessionCoordinator::seekSessionToTime): Ditto. (WebCore::MediaSessionCoordinator::playSession): Ditto. (WebCore::MediaSessionCoordinator::pauseSession): Ditto. (WebCore::MediaSessionCoordinator::setSessionTrack): Ditto. * Modules/mediasession/MediaSessionCoordinator.h: (WebCore::MediaSessionCoordinator::identifier const): (WebCore::MediaSessionCoordinator::state const): * Modules/mediasession/MediaSessionCoordinator.idl: * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Fix Conditional. * Modules/mediasession/MediaSessionCoordinatorPrivate.h: Declare new required methods. * Modules/mediasession/MediaSessionCoordinatorState.h: Define states. * Modules/mediasession/MediaSessionCoordinatorState.idl: * Modules/mediasession/MediaSessionPlaylistMixin.idl: Fix Conditional. * Sources.txt: Add JSMediaSessionCoordinatorState.cpp. * WebCore.xcodeproj/project.pbxproj: * testing/MockMediaSessionCoordinator.cpp: (WebCore::MockMediaSessionCoordinator::join): (WebCore::MockMediaSessionCoordinator::leave): (WebCore::MockMediaSessionCoordinator::coordinatorStateChanged): * testing/MockMediaSessionCoordinator.h: Source/WebKit: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::join): (WebKit::RemoteMediaSessionCoordinatorProxy::leave): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::join): (WebKit::RemoteMediaSessionCoordinator::leave): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: LayoutTests: * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275314 268f45cc-cd09-0410-ab3c-d52691b4dbfc Canonical link: https://commits.webkit.org/235995@main
2021-03-31 23:11:14 +00:00
RUN(promise = navigator.mediaSession.coordinator.seekTo(10))
Promise resolved OK
[Cocoa] Add Experimental MediaSession coordinator https://bugs.webkit.org/show_bug.cgi?id=222158 <rdar://problem/74508862> Reviewed by Jer Noble. Source/WebCore: Add an experimental MediaSession coordinator, an object that provides an interface that allows script to coordinate changes to MediaSession with the User Agent. Also add an experimental MediaSession playlist interface. The changes are behind new experimental feature flags, MediaSessionCoordinatorEnabled and MediaSessionPlaylistEnabled. Test: media/media-session/mock-coordinator.html * DerivedSources-input.xcfilelist: Add new IDL files. * DerivedSources-output.xcfilelist: Add new derived sources. * DerivedSources.make: Add new IDL. * Modules/mediasession/MediaMetadata.cpp: (WebCore::MediaMetadata::create): Set trackIdentifier from init data. (WebCore::MediaMetadata::setTrackIdentifier): trackIdentifier setter. * Modules/mediasession/MediaMetadata.h: (WebCore::MediaMetadata::trackIdentifier const): * Modules/mediasession/MediaMetadata.idl: * Modules/mediasession/MediaMetadataInit.h: Add trackIdentifier. (WebCore::MediaMetadataInit::encode const): (WebCore::MediaMetadataInit::decode): * Modules/mediasession/MediaMetadataInit.idl: * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Initialize MainThreadGenericEventQueue. (WebCore::MediaSession::setMetadata): metadataUpdated -> notifyMetadataObservers. (WebCore::MediaSession::setReadyState): Session readyState setter. (WebCore::MediaSession::setCoordinator): Coordinator setter. Post 'coordinatorchange' event after change. (WebCore::MediaSession::setPlaylist): Playlist setter. (WebCore::MediaSession::setActionHandler): Call notifyActionHandlerObservers. (WebCore::MediaSession::setPositionState): Call notifyPositionStateObservers. (WebCore::MediaSession::metadataUpdated): Call notifyMetadataObservers. (WebCore::MediaSession::addObserver): New. (WebCore::MediaSession::removeObserver): New. (WebCore::MediaSession::forEachObserver): New. (WebCore::MediaSession::notifyMetadataObservers): New. (WebCore::MediaSession::notifyPositionStateObservers): New. (WebCore::MediaSession::notifyPlaybackStateObservers): New. (WebCore::MediaSession::notifyActionHandlerObservers): New. (WebCore::MediaSession::notifyReadyStateObservers): New. * Modules/mediasession/MediaSession.h: (WebCore::MediaSession::coordinator const): (WebCore::MediaSession::playlist const): (WebCore::MediaSession::logger const): * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionAction.h: * Modules/mediasession/MediaSessionAction.idl: * Modules/mediasession/MediaSessionActionDetails.h: * Modules/mediasession/MediaSessionActionDetails.idl: MediaSessionCoordinator proxies calls through the PlatformMediaSessionCoordinator, and then calls the equivalent MediaSession methode if the platform coordinator is successful. * Modules/mediasession/MediaSessionCoordinator.cpp: Added. (WebCore::nextCoordinatorLogIdentifier): (WebCore::MediaSessionCoordinator::create): (WebCore::MediaSessionCoordinator::MediaSessionCoordinator): (WebCore::MediaSessionCoordinator::seekTo): (WebCore::MediaSessionCoordinator::play): (WebCore::MediaSessionCoordinator::pause): (WebCore::MediaSessionCoordinator::setTrack): (WebCore::MediaSessionCoordinator::setMediaSession): (WebCore::MediaSessionCoordinator::logChannel): * Modules/mediasession/MediaSessionCoordinator.h: New. (WebCore::MediaSessionCoordinator::logger const): (WebCore::MediaSessionCoordinator::logIdentifier const): (WebCore::MediaSessionCoordinator::logClassName): * Modules/mediasession/MediaSessionCoordinator.idl: New. * Modules/mediasession/NavigatorMediaSession.h: * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * bindings/js/WebCoreBuiltinNames.h: * dom/EventNames.h: * dom/EventTargetFactory.in: * platform/graphics/PlatformMediaSessionCoordinator.h: Added. (WebCore::PlatformMediaSessionCoordinator::setLogger): (WebCore::PlatformMediaSessionCoordinator::loggerPtr const): (WebCore::PlatformMediaSessionCoordinator::logIdentifier const): (WebCore::PlatformMediaSessionCoordinator::logClassName const): (WebCore::PlatformMediaSessionCoordinator::logChannel const): * testing/Internals.cpp: (WebCore::Internals::registerMockMediaSessionCoordinator): Register the mock media session coordinator for testing. * testing/Internals.h: * testing/Internals.idl: * testing/MockMediaSessionCoordinator.cpp: Added. (WebCore::MockMediaSessionCoordinator::create): (WebCore::MockMediaSessionCoordinator::MockMediaSessionCoordinator): (WebCore::MockMediaSessionCoordinator::seekTo): (WebCore::MockMediaSessionCoordinator::play): (WebCore::MockMediaSessionCoordinator::pause): (WebCore::MockMediaSessionCoordinator::setTrack): * testing/MockMediaSessionCoordinator.h: New. Source/WTF: * Scripts/Preferences/WebPreferencesExperimental.yaml: * wtf/PlatformEnableCocoa.h: LayoutTests: * platform/TestExpectations: * media/media-session/mock-coordinator-expected.txt: Added. * media/media-session/mock-coordinator.html: Added. Canonical link: https://commits.webkit.org/235728@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@274983 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-03-24 23:14:51 +00:00
[macOS] MediaSessionCoordinator should have join and leave methods https://bugs.webkit.org/show_bug.cgi?id=223955 <rdar://problem/76021588> Reviewed by Jer Noble. Source/WebCore: Add 'join' and 'leave' methods to MediaSessionCoordinator so a page has to opt-in to participating in a coordinated session and can leave at any time. Don't have the coordinator automatically call session methods when the private coordinator finishes, just signal the promise and let the page handle it. No new tests, updated media/media-session/mock-coordinator.html. * CMakeLists.txt: * DerivedSources-input.xcfilelist: * DerivedSources-output.xcfilelist: * DerivedSources.make: * Modules/mediasession/MediaMetadata.idl: Fix Conditional. * Modules/mediasession/MediaMetadataPlaylistMixin.idl: Ditto. * Modules/mediasession/MediaPositionState.h: Add logging template. (WTF::LogArgument<WebCore::MediaPositionState>::toString): * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Switch from beging a ContextDestructionObserver to an ActiveDOMObject to the wrapper won't be collected while an event dispatch is pending. (WebCore::MediaSession::virtualHasPendingActivity const): Prevent collection while event dispatch is pending. (WebCore::MediaSession::setPositionState): Improve logging. (WebCore::MediaPositionState::toJSONString const): * Modules/mediasession/MediaSession.h: * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::join): New. (WebCore::MediaSessionCoordinator::leave): New. (WebCore::MediaSessionCoordinator::seekTo): Reject unless state is 'joined'. Don't call session method. (WebCore::MediaSessionCoordinator::play): Ditto. (WebCore::MediaSessionCoordinator::pause): Ditto. (WebCore::MediaSessionCoordinator::setTrack): Ditto. (WebCore::MediaSessionCoordinator::positionStateChanged): (WebCore::MediaSessionCoordinator::playbackStateChanged): (WebCore::MediaSessionCoordinator::readyStateChanged): Do nothing unless state is 'joined'. Improve logging. (WebCore::MediaSessionCoordinator::seekSessionToTime): Ditto. (WebCore::MediaSessionCoordinator::playSession): Ditto. (WebCore::MediaSessionCoordinator::pauseSession): Ditto. (WebCore::MediaSessionCoordinator::setSessionTrack): Ditto. * Modules/mediasession/MediaSessionCoordinator.h: (WebCore::MediaSessionCoordinator::identifier const): (WebCore::MediaSessionCoordinator::state const): * Modules/mediasession/MediaSessionCoordinator.idl: * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Fix Conditional. * Modules/mediasession/MediaSessionCoordinatorPrivate.h: Declare new required methods. * Modules/mediasession/MediaSessionCoordinatorState.h: Define states. * Modules/mediasession/MediaSessionCoordinatorState.idl: * Modules/mediasession/MediaSessionPlaylistMixin.idl: Fix Conditional. * Sources.txt: Add JSMediaSessionCoordinatorState.cpp. * WebCore.xcodeproj/project.pbxproj: * testing/MockMediaSessionCoordinator.cpp: (WebCore::MockMediaSessionCoordinator::join): (WebCore::MockMediaSessionCoordinator::leave): (WebCore::MockMediaSessionCoordinator::coordinatorStateChanged): * testing/MockMediaSessionCoordinator.h: Source/WebKit: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::join): (WebKit::RemoteMediaSessionCoordinatorProxy::leave): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::join): (WebKit::RemoteMediaSessionCoordinator::leave): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: LayoutTests: * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275314 268f45cc-cd09-0410-ab3c-d52691b4dbfc Canonical link: https://commits.webkit.org/235995@main
2021-03-31 23:11:14 +00:00
** Test that when coordinator methods fail, promises reject and mediaSession action handlers are not called.
RUN(promise = navigator.mediaSession.coordinator.play())
Promise rejected correctly OK
[Cocoa] Add Experimental MediaSession coordinator https://bugs.webkit.org/show_bug.cgi?id=222158 <rdar://problem/74508862> Reviewed by Jer Noble. Source/WebCore: Add an experimental MediaSession coordinator, an object that provides an interface that allows script to coordinate changes to MediaSession with the User Agent. Also add an experimental MediaSession playlist interface. The changes are behind new experimental feature flags, MediaSessionCoordinatorEnabled and MediaSessionPlaylistEnabled. Test: media/media-session/mock-coordinator.html * DerivedSources-input.xcfilelist: Add new IDL files. * DerivedSources-output.xcfilelist: Add new derived sources. * DerivedSources.make: Add new IDL. * Modules/mediasession/MediaMetadata.cpp: (WebCore::MediaMetadata::create): Set trackIdentifier from init data. (WebCore::MediaMetadata::setTrackIdentifier): trackIdentifier setter. * Modules/mediasession/MediaMetadata.h: (WebCore::MediaMetadata::trackIdentifier const): * Modules/mediasession/MediaMetadata.idl: * Modules/mediasession/MediaMetadataInit.h: Add trackIdentifier. (WebCore::MediaMetadataInit::encode const): (WebCore::MediaMetadataInit::decode): * Modules/mediasession/MediaMetadataInit.idl: * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Initialize MainThreadGenericEventQueue. (WebCore::MediaSession::setMetadata): metadataUpdated -> notifyMetadataObservers. (WebCore::MediaSession::setReadyState): Session readyState setter. (WebCore::MediaSession::setCoordinator): Coordinator setter. Post 'coordinatorchange' event after change. (WebCore::MediaSession::setPlaylist): Playlist setter. (WebCore::MediaSession::setActionHandler): Call notifyActionHandlerObservers. (WebCore::MediaSession::setPositionState): Call notifyPositionStateObservers. (WebCore::MediaSession::metadataUpdated): Call notifyMetadataObservers. (WebCore::MediaSession::addObserver): New. (WebCore::MediaSession::removeObserver): New. (WebCore::MediaSession::forEachObserver): New. (WebCore::MediaSession::notifyMetadataObservers): New. (WebCore::MediaSession::notifyPositionStateObservers): New. (WebCore::MediaSession::notifyPlaybackStateObservers): New. (WebCore::MediaSession::notifyActionHandlerObservers): New. (WebCore::MediaSession::notifyReadyStateObservers): New. * Modules/mediasession/MediaSession.h: (WebCore::MediaSession::coordinator const): (WebCore::MediaSession::playlist const): (WebCore::MediaSession::logger const): * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionAction.h: * Modules/mediasession/MediaSessionAction.idl: * Modules/mediasession/MediaSessionActionDetails.h: * Modules/mediasession/MediaSessionActionDetails.idl: MediaSessionCoordinator proxies calls through the PlatformMediaSessionCoordinator, and then calls the equivalent MediaSession methode if the platform coordinator is successful. * Modules/mediasession/MediaSessionCoordinator.cpp: Added. (WebCore::nextCoordinatorLogIdentifier): (WebCore::MediaSessionCoordinator::create): (WebCore::MediaSessionCoordinator::MediaSessionCoordinator): (WebCore::MediaSessionCoordinator::seekTo): (WebCore::MediaSessionCoordinator::play): (WebCore::MediaSessionCoordinator::pause): (WebCore::MediaSessionCoordinator::setTrack): (WebCore::MediaSessionCoordinator::setMediaSession): (WebCore::MediaSessionCoordinator::logChannel): * Modules/mediasession/MediaSessionCoordinator.h: New. (WebCore::MediaSessionCoordinator::logger const): (WebCore::MediaSessionCoordinator::logIdentifier const): (WebCore::MediaSessionCoordinator::logClassName): * Modules/mediasession/MediaSessionCoordinator.idl: New. * Modules/mediasession/NavigatorMediaSession.h: * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * bindings/js/WebCoreBuiltinNames.h: * dom/EventNames.h: * dom/EventTargetFactory.in: * platform/graphics/PlatformMediaSessionCoordinator.h: Added. (WebCore::PlatformMediaSessionCoordinator::setLogger): (WebCore::PlatformMediaSessionCoordinator::loggerPtr const): (WebCore::PlatformMediaSessionCoordinator::logIdentifier const): (WebCore::PlatformMediaSessionCoordinator::logClassName const): (WebCore::PlatformMediaSessionCoordinator::logChannel const): * testing/Internals.cpp: (WebCore::Internals::registerMockMediaSessionCoordinator): Register the mock media session coordinator for testing. * testing/Internals.h: * testing/Internals.idl: * testing/MockMediaSessionCoordinator.cpp: Added. (WebCore::MockMediaSessionCoordinator::create): (WebCore::MockMediaSessionCoordinator::MockMediaSessionCoordinator): (WebCore::MockMediaSessionCoordinator::seekTo): (WebCore::MockMediaSessionCoordinator::play): (WebCore::MockMediaSessionCoordinator::pause): (WebCore::MockMediaSessionCoordinator::setTrack): * testing/MockMediaSessionCoordinator.h: New. Source/WTF: * Scripts/Preferences/WebPreferencesExperimental.yaml: * wtf/PlatformEnableCocoa.h: LayoutTests: * platform/TestExpectations: * media/media-session/mock-coordinator-expected.txt: Added. * media/media-session/mock-coordinator.html: Added. Canonical link: https://commits.webkit.org/235728@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@274983 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-03-24 23:14:51 +00:00
[macOS] MediaSessionCoordinator should have join and leave methods https://bugs.webkit.org/show_bug.cgi?id=223955 <rdar://problem/76021588> Reviewed by Jer Noble. Source/WebCore: Add 'join' and 'leave' methods to MediaSessionCoordinator so a page has to opt-in to participating in a coordinated session and can leave at any time. Don't have the coordinator automatically call session methods when the private coordinator finishes, just signal the promise and let the page handle it. No new tests, updated media/media-session/mock-coordinator.html. * CMakeLists.txt: * DerivedSources-input.xcfilelist: * DerivedSources-output.xcfilelist: * DerivedSources.make: * Modules/mediasession/MediaMetadata.idl: Fix Conditional. * Modules/mediasession/MediaMetadataPlaylistMixin.idl: Ditto. * Modules/mediasession/MediaPositionState.h: Add logging template. (WTF::LogArgument<WebCore::MediaPositionState>::toString): * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Switch from beging a ContextDestructionObserver to an ActiveDOMObject to the wrapper won't be collected while an event dispatch is pending. (WebCore::MediaSession::virtualHasPendingActivity const): Prevent collection while event dispatch is pending. (WebCore::MediaSession::setPositionState): Improve logging. (WebCore::MediaPositionState::toJSONString const): * Modules/mediasession/MediaSession.h: * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::join): New. (WebCore::MediaSessionCoordinator::leave): New. (WebCore::MediaSessionCoordinator::seekTo): Reject unless state is 'joined'. Don't call session method. (WebCore::MediaSessionCoordinator::play): Ditto. (WebCore::MediaSessionCoordinator::pause): Ditto. (WebCore::MediaSessionCoordinator::setTrack): Ditto. (WebCore::MediaSessionCoordinator::positionStateChanged): (WebCore::MediaSessionCoordinator::playbackStateChanged): (WebCore::MediaSessionCoordinator::readyStateChanged): Do nothing unless state is 'joined'. Improve logging. (WebCore::MediaSessionCoordinator::seekSessionToTime): Ditto. (WebCore::MediaSessionCoordinator::playSession): Ditto. (WebCore::MediaSessionCoordinator::pauseSession): Ditto. (WebCore::MediaSessionCoordinator::setSessionTrack): Ditto. * Modules/mediasession/MediaSessionCoordinator.h: (WebCore::MediaSessionCoordinator::identifier const): (WebCore::MediaSessionCoordinator::state const): * Modules/mediasession/MediaSessionCoordinator.idl: * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Fix Conditional. * Modules/mediasession/MediaSessionCoordinatorPrivate.h: Declare new required methods. * Modules/mediasession/MediaSessionCoordinatorState.h: Define states. * Modules/mediasession/MediaSessionCoordinatorState.idl: * Modules/mediasession/MediaSessionPlaylistMixin.idl: Fix Conditional. * Sources.txt: Add JSMediaSessionCoordinatorState.cpp. * WebCore.xcodeproj/project.pbxproj: * testing/MockMediaSessionCoordinator.cpp: (WebCore::MockMediaSessionCoordinator::join): (WebCore::MockMediaSessionCoordinator::leave): (WebCore::MockMediaSessionCoordinator::coordinatorStateChanged): * testing/MockMediaSessionCoordinator.h: Source/WebKit: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::join): (WebKit::RemoteMediaSessionCoordinatorProxy::leave): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::join): (WebKit::RemoteMediaSessionCoordinator::leave): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: LayoutTests: * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275314 268f45cc-cd09-0410-ab3c-d52691b4dbfc Canonical link: https://commits.webkit.org/235995@main
2021-03-31 23:11:14 +00:00
RUN(promise = navigator.mediaSession.coordinator.pause())
Promise rejected correctly OK
[Cocoa] Add Experimental MediaSession coordinator https://bugs.webkit.org/show_bug.cgi?id=222158 <rdar://problem/74508862> Reviewed by Jer Noble. Source/WebCore: Add an experimental MediaSession coordinator, an object that provides an interface that allows script to coordinate changes to MediaSession with the User Agent. Also add an experimental MediaSession playlist interface. The changes are behind new experimental feature flags, MediaSessionCoordinatorEnabled and MediaSessionPlaylistEnabled. Test: media/media-session/mock-coordinator.html * DerivedSources-input.xcfilelist: Add new IDL files. * DerivedSources-output.xcfilelist: Add new derived sources. * DerivedSources.make: Add new IDL. * Modules/mediasession/MediaMetadata.cpp: (WebCore::MediaMetadata::create): Set trackIdentifier from init data. (WebCore::MediaMetadata::setTrackIdentifier): trackIdentifier setter. * Modules/mediasession/MediaMetadata.h: (WebCore::MediaMetadata::trackIdentifier const): * Modules/mediasession/MediaMetadata.idl: * Modules/mediasession/MediaMetadataInit.h: Add trackIdentifier. (WebCore::MediaMetadataInit::encode const): (WebCore::MediaMetadataInit::decode): * Modules/mediasession/MediaMetadataInit.idl: * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Initialize MainThreadGenericEventQueue. (WebCore::MediaSession::setMetadata): metadataUpdated -> notifyMetadataObservers. (WebCore::MediaSession::setReadyState): Session readyState setter. (WebCore::MediaSession::setCoordinator): Coordinator setter. Post 'coordinatorchange' event after change. (WebCore::MediaSession::setPlaylist): Playlist setter. (WebCore::MediaSession::setActionHandler): Call notifyActionHandlerObservers. (WebCore::MediaSession::setPositionState): Call notifyPositionStateObservers. (WebCore::MediaSession::metadataUpdated): Call notifyMetadataObservers. (WebCore::MediaSession::addObserver): New. (WebCore::MediaSession::removeObserver): New. (WebCore::MediaSession::forEachObserver): New. (WebCore::MediaSession::notifyMetadataObservers): New. (WebCore::MediaSession::notifyPositionStateObservers): New. (WebCore::MediaSession::notifyPlaybackStateObservers): New. (WebCore::MediaSession::notifyActionHandlerObservers): New. (WebCore::MediaSession::notifyReadyStateObservers): New. * Modules/mediasession/MediaSession.h: (WebCore::MediaSession::coordinator const): (WebCore::MediaSession::playlist const): (WebCore::MediaSession::logger const): * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionAction.h: * Modules/mediasession/MediaSessionAction.idl: * Modules/mediasession/MediaSessionActionDetails.h: * Modules/mediasession/MediaSessionActionDetails.idl: MediaSessionCoordinator proxies calls through the PlatformMediaSessionCoordinator, and then calls the equivalent MediaSession methode if the platform coordinator is successful. * Modules/mediasession/MediaSessionCoordinator.cpp: Added. (WebCore::nextCoordinatorLogIdentifier): (WebCore::MediaSessionCoordinator::create): (WebCore::MediaSessionCoordinator::MediaSessionCoordinator): (WebCore::MediaSessionCoordinator::seekTo): (WebCore::MediaSessionCoordinator::play): (WebCore::MediaSessionCoordinator::pause): (WebCore::MediaSessionCoordinator::setTrack): (WebCore::MediaSessionCoordinator::setMediaSession): (WebCore::MediaSessionCoordinator::logChannel): * Modules/mediasession/MediaSessionCoordinator.h: New. (WebCore::MediaSessionCoordinator::logger const): (WebCore::MediaSessionCoordinator::logIdentifier const): (WebCore::MediaSessionCoordinator::logClassName): * Modules/mediasession/MediaSessionCoordinator.idl: New. * Modules/mediasession/NavigatorMediaSession.h: * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * bindings/js/WebCoreBuiltinNames.h: * dom/EventNames.h: * dom/EventTargetFactory.in: * platform/graphics/PlatformMediaSessionCoordinator.h: Added. (WebCore::PlatformMediaSessionCoordinator::setLogger): (WebCore::PlatformMediaSessionCoordinator::loggerPtr const): (WebCore::PlatformMediaSessionCoordinator::logIdentifier const): (WebCore::PlatformMediaSessionCoordinator::logClassName const): (WebCore::PlatformMediaSessionCoordinator::logChannel const): * testing/Internals.cpp: (WebCore::Internals::registerMockMediaSessionCoordinator): Register the mock media session coordinator for testing. * testing/Internals.h: * testing/Internals.idl: * testing/MockMediaSessionCoordinator.cpp: Added. (WebCore::MockMediaSessionCoordinator::create): (WebCore::MockMediaSessionCoordinator::MockMediaSessionCoordinator): (WebCore::MockMediaSessionCoordinator::seekTo): (WebCore::MockMediaSessionCoordinator::play): (WebCore::MockMediaSessionCoordinator::pause): (WebCore::MockMediaSessionCoordinator::setTrack): * testing/MockMediaSessionCoordinator.h: New. Source/WTF: * Scripts/Preferences/WebPreferencesExperimental.yaml: * wtf/PlatformEnableCocoa.h: LayoutTests: * platform/TestExpectations: * media/media-session/mock-coordinator-expected.txt: Added. * media/media-session/mock-coordinator.html: Added. Canonical link: https://commits.webkit.org/235728@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@274983 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-03-24 23:14:51 +00:00
[macOS] MediaSessionCoordinator should have join and leave methods https://bugs.webkit.org/show_bug.cgi?id=223955 <rdar://problem/76021588> Reviewed by Jer Noble. Source/WebCore: Add 'join' and 'leave' methods to MediaSessionCoordinator so a page has to opt-in to participating in a coordinated session and can leave at any time. Don't have the coordinator automatically call session methods when the private coordinator finishes, just signal the promise and let the page handle it. No new tests, updated media/media-session/mock-coordinator.html. * CMakeLists.txt: * DerivedSources-input.xcfilelist: * DerivedSources-output.xcfilelist: * DerivedSources.make: * Modules/mediasession/MediaMetadata.idl: Fix Conditional. * Modules/mediasession/MediaMetadataPlaylistMixin.idl: Ditto. * Modules/mediasession/MediaPositionState.h: Add logging template. (WTF::LogArgument<WebCore::MediaPositionState>::toString): * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Switch from beging a ContextDestructionObserver to an ActiveDOMObject to the wrapper won't be collected while an event dispatch is pending. (WebCore::MediaSession::virtualHasPendingActivity const): Prevent collection while event dispatch is pending. (WebCore::MediaSession::setPositionState): Improve logging. (WebCore::MediaPositionState::toJSONString const): * Modules/mediasession/MediaSession.h: * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::join): New. (WebCore::MediaSessionCoordinator::leave): New. (WebCore::MediaSessionCoordinator::seekTo): Reject unless state is 'joined'. Don't call session method. (WebCore::MediaSessionCoordinator::play): Ditto. (WebCore::MediaSessionCoordinator::pause): Ditto. (WebCore::MediaSessionCoordinator::setTrack): Ditto. (WebCore::MediaSessionCoordinator::positionStateChanged): (WebCore::MediaSessionCoordinator::playbackStateChanged): (WebCore::MediaSessionCoordinator::readyStateChanged): Do nothing unless state is 'joined'. Improve logging. (WebCore::MediaSessionCoordinator::seekSessionToTime): Ditto. (WebCore::MediaSessionCoordinator::playSession): Ditto. (WebCore::MediaSessionCoordinator::pauseSession): Ditto. (WebCore::MediaSessionCoordinator::setSessionTrack): Ditto. * Modules/mediasession/MediaSessionCoordinator.h: (WebCore::MediaSessionCoordinator::identifier const): (WebCore::MediaSessionCoordinator::state const): * Modules/mediasession/MediaSessionCoordinator.idl: * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Fix Conditional. * Modules/mediasession/MediaSessionCoordinatorPrivate.h: Declare new required methods. * Modules/mediasession/MediaSessionCoordinatorState.h: Define states. * Modules/mediasession/MediaSessionCoordinatorState.idl: * Modules/mediasession/MediaSessionPlaylistMixin.idl: Fix Conditional. * Sources.txt: Add JSMediaSessionCoordinatorState.cpp. * WebCore.xcodeproj/project.pbxproj: * testing/MockMediaSessionCoordinator.cpp: (WebCore::MockMediaSessionCoordinator::join): (WebCore::MockMediaSessionCoordinator::leave): (WebCore::MockMediaSessionCoordinator::coordinatorStateChanged): * testing/MockMediaSessionCoordinator.h: Source/WebKit: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::join): (WebKit::RemoteMediaSessionCoordinatorProxy::leave): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::join): (WebKit::RemoteMediaSessionCoordinator::leave): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: LayoutTests: * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275314 268f45cc-cd09-0410-ab3c-d52691b4dbfc Canonical link: https://commits.webkit.org/235995@main
2021-03-31 23:11:14 +00:00
RUN(promise = navigator.mediaSession.coordinator.seekTo(10))
Promise rejected correctly OK
[Cocoa] Add Experimental MediaSession coordinator https://bugs.webkit.org/show_bug.cgi?id=222158 <rdar://problem/74508862> Reviewed by Jer Noble. Source/WebCore: Add an experimental MediaSession coordinator, an object that provides an interface that allows script to coordinate changes to MediaSession with the User Agent. Also add an experimental MediaSession playlist interface. The changes are behind new experimental feature flags, MediaSessionCoordinatorEnabled and MediaSessionPlaylistEnabled. Test: media/media-session/mock-coordinator.html * DerivedSources-input.xcfilelist: Add new IDL files. * DerivedSources-output.xcfilelist: Add new derived sources. * DerivedSources.make: Add new IDL. * Modules/mediasession/MediaMetadata.cpp: (WebCore::MediaMetadata::create): Set trackIdentifier from init data. (WebCore::MediaMetadata::setTrackIdentifier): trackIdentifier setter. * Modules/mediasession/MediaMetadata.h: (WebCore::MediaMetadata::trackIdentifier const): * Modules/mediasession/MediaMetadata.idl: * Modules/mediasession/MediaMetadataInit.h: Add trackIdentifier. (WebCore::MediaMetadataInit::encode const): (WebCore::MediaMetadataInit::decode): * Modules/mediasession/MediaMetadataInit.idl: * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Initialize MainThreadGenericEventQueue. (WebCore::MediaSession::setMetadata): metadataUpdated -> notifyMetadataObservers. (WebCore::MediaSession::setReadyState): Session readyState setter. (WebCore::MediaSession::setCoordinator): Coordinator setter. Post 'coordinatorchange' event after change. (WebCore::MediaSession::setPlaylist): Playlist setter. (WebCore::MediaSession::setActionHandler): Call notifyActionHandlerObservers. (WebCore::MediaSession::setPositionState): Call notifyPositionStateObservers. (WebCore::MediaSession::metadataUpdated): Call notifyMetadataObservers. (WebCore::MediaSession::addObserver): New. (WebCore::MediaSession::removeObserver): New. (WebCore::MediaSession::forEachObserver): New. (WebCore::MediaSession::notifyMetadataObservers): New. (WebCore::MediaSession::notifyPositionStateObservers): New. (WebCore::MediaSession::notifyPlaybackStateObservers): New. (WebCore::MediaSession::notifyActionHandlerObservers): New. (WebCore::MediaSession::notifyReadyStateObservers): New. * Modules/mediasession/MediaSession.h: (WebCore::MediaSession::coordinator const): (WebCore::MediaSession::playlist const): (WebCore::MediaSession::logger const): * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionAction.h: * Modules/mediasession/MediaSessionAction.idl: * Modules/mediasession/MediaSessionActionDetails.h: * Modules/mediasession/MediaSessionActionDetails.idl: MediaSessionCoordinator proxies calls through the PlatformMediaSessionCoordinator, and then calls the equivalent MediaSession methode if the platform coordinator is successful. * Modules/mediasession/MediaSessionCoordinator.cpp: Added. (WebCore::nextCoordinatorLogIdentifier): (WebCore::MediaSessionCoordinator::create): (WebCore::MediaSessionCoordinator::MediaSessionCoordinator): (WebCore::MediaSessionCoordinator::seekTo): (WebCore::MediaSessionCoordinator::play): (WebCore::MediaSessionCoordinator::pause): (WebCore::MediaSessionCoordinator::setTrack): (WebCore::MediaSessionCoordinator::setMediaSession): (WebCore::MediaSessionCoordinator::logChannel): * Modules/mediasession/MediaSessionCoordinator.h: New. (WebCore::MediaSessionCoordinator::logger const): (WebCore::MediaSessionCoordinator::logIdentifier const): (WebCore::MediaSessionCoordinator::logClassName): * Modules/mediasession/MediaSessionCoordinator.idl: New. * Modules/mediasession/NavigatorMediaSession.h: * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * bindings/js/WebCoreBuiltinNames.h: * dom/EventNames.h: * dom/EventTargetFactory.in: * platform/graphics/PlatformMediaSessionCoordinator.h: Added. (WebCore::PlatformMediaSessionCoordinator::setLogger): (WebCore::PlatformMediaSessionCoordinator::loggerPtr const): (WebCore::PlatformMediaSessionCoordinator::logIdentifier const): (WebCore::PlatformMediaSessionCoordinator::logClassName const): (WebCore::PlatformMediaSessionCoordinator::logChannel const): * testing/Internals.cpp: (WebCore::Internals::registerMockMediaSessionCoordinator): Register the mock media session coordinator for testing. * testing/Internals.h: * testing/Internals.idl: * testing/MockMediaSessionCoordinator.cpp: Added. (WebCore::MockMediaSessionCoordinator::create): (WebCore::MockMediaSessionCoordinator::MockMediaSessionCoordinator): (WebCore::MockMediaSessionCoordinator::seekTo): (WebCore::MockMediaSessionCoordinator::play): (WebCore::MockMediaSessionCoordinator::pause): (WebCore::MockMediaSessionCoordinator::setTrack): * testing/MockMediaSessionCoordinator.h: New. Source/WTF: * Scripts/Preferences/WebPreferencesExperimental.yaml: * wtf/PlatformEnableCocoa.h: LayoutTests: * platform/TestExpectations: * media/media-session/mock-coordinator-expected.txt: Added. * media/media-session/mock-coordinator.html: Added. Canonical link: https://commits.webkit.org/235728@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@274983 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-03-24 23:14:51 +00:00
** Test that mediaSession notifies coordinator when positionState changes.
RUN(navigator.mediaSession.setPositionState({ duration: 1, playbackRate: 1, position: 0 }))
EXPECTED (latestChange == 'positionStateChanged') OK
** Test that mediaSession notifies coordinator when readyState changes.
EXPECTED (navigator.mediaSession.readyState == 'havenothing') OK
RUN(navigator.mediaSession.readyState = 'havemetadata')
[Cocoa] Add Experimental MediaSession coordinator https://bugs.webkit.org/show_bug.cgi?id=222158 <rdar://problem/74508862> Reviewed by Jer Noble. Source/WebCore: Add an experimental MediaSession coordinator, an object that provides an interface that allows script to coordinate changes to MediaSession with the User Agent. Also add an experimental MediaSession playlist interface. The changes are behind new experimental feature flags, MediaSessionCoordinatorEnabled and MediaSessionPlaylistEnabled. Test: media/media-session/mock-coordinator.html * DerivedSources-input.xcfilelist: Add new IDL files. * DerivedSources-output.xcfilelist: Add new derived sources. * DerivedSources.make: Add new IDL. * Modules/mediasession/MediaMetadata.cpp: (WebCore::MediaMetadata::create): Set trackIdentifier from init data. (WebCore::MediaMetadata::setTrackIdentifier): trackIdentifier setter. * Modules/mediasession/MediaMetadata.h: (WebCore::MediaMetadata::trackIdentifier const): * Modules/mediasession/MediaMetadata.idl: * Modules/mediasession/MediaMetadataInit.h: Add trackIdentifier. (WebCore::MediaMetadataInit::encode const): (WebCore::MediaMetadataInit::decode): * Modules/mediasession/MediaMetadataInit.idl: * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Initialize MainThreadGenericEventQueue. (WebCore::MediaSession::setMetadata): metadataUpdated -> notifyMetadataObservers. (WebCore::MediaSession::setReadyState): Session readyState setter. (WebCore::MediaSession::setCoordinator): Coordinator setter. Post 'coordinatorchange' event after change. (WebCore::MediaSession::setPlaylist): Playlist setter. (WebCore::MediaSession::setActionHandler): Call notifyActionHandlerObservers. (WebCore::MediaSession::setPositionState): Call notifyPositionStateObservers. (WebCore::MediaSession::metadataUpdated): Call notifyMetadataObservers. (WebCore::MediaSession::addObserver): New. (WebCore::MediaSession::removeObserver): New. (WebCore::MediaSession::forEachObserver): New. (WebCore::MediaSession::notifyMetadataObservers): New. (WebCore::MediaSession::notifyPositionStateObservers): New. (WebCore::MediaSession::notifyPlaybackStateObservers): New. (WebCore::MediaSession::notifyActionHandlerObservers): New. (WebCore::MediaSession::notifyReadyStateObservers): New. * Modules/mediasession/MediaSession.h: (WebCore::MediaSession::coordinator const): (WebCore::MediaSession::playlist const): (WebCore::MediaSession::logger const): * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionAction.h: * Modules/mediasession/MediaSessionAction.idl: * Modules/mediasession/MediaSessionActionDetails.h: * Modules/mediasession/MediaSessionActionDetails.idl: MediaSessionCoordinator proxies calls through the PlatformMediaSessionCoordinator, and then calls the equivalent MediaSession methode if the platform coordinator is successful. * Modules/mediasession/MediaSessionCoordinator.cpp: Added. (WebCore::nextCoordinatorLogIdentifier): (WebCore::MediaSessionCoordinator::create): (WebCore::MediaSessionCoordinator::MediaSessionCoordinator): (WebCore::MediaSessionCoordinator::seekTo): (WebCore::MediaSessionCoordinator::play): (WebCore::MediaSessionCoordinator::pause): (WebCore::MediaSessionCoordinator::setTrack): (WebCore::MediaSessionCoordinator::setMediaSession): (WebCore::MediaSessionCoordinator::logChannel): * Modules/mediasession/MediaSessionCoordinator.h: New. (WebCore::MediaSessionCoordinator::logger const): (WebCore::MediaSessionCoordinator::logIdentifier const): (WebCore::MediaSessionCoordinator::logClassName): * Modules/mediasession/MediaSessionCoordinator.idl: New. * Modules/mediasession/NavigatorMediaSession.h: * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * bindings/js/WebCoreBuiltinNames.h: * dom/EventNames.h: * dom/EventTargetFactory.in: * platform/graphics/PlatformMediaSessionCoordinator.h: Added. (WebCore::PlatformMediaSessionCoordinator::setLogger): (WebCore::PlatformMediaSessionCoordinator::loggerPtr const): (WebCore::PlatformMediaSessionCoordinator::logIdentifier const): (WebCore::PlatformMediaSessionCoordinator::logClassName const): (WebCore::PlatformMediaSessionCoordinator::logChannel const): * testing/Internals.cpp: (WebCore::Internals::registerMockMediaSessionCoordinator): Register the mock media session coordinator for testing. * testing/Internals.h: * testing/Internals.idl: * testing/MockMediaSessionCoordinator.cpp: Added. (WebCore::MockMediaSessionCoordinator::create): (WebCore::MockMediaSessionCoordinator::MockMediaSessionCoordinator): (WebCore::MockMediaSessionCoordinator::seekTo): (WebCore::MockMediaSessionCoordinator::play): (WebCore::MockMediaSessionCoordinator::pause): (WebCore::MockMediaSessionCoordinator::setTrack): * testing/MockMediaSessionCoordinator.h: New. Source/WTF: * Scripts/Preferences/WebPreferencesExperimental.yaml: * wtf/PlatformEnableCocoa.h: LayoutTests: * platform/TestExpectations: * media/media-session/mock-coordinator-expected.txt: Added. * media/media-session/mock-coordinator.html: Added. Canonical link: https://commits.webkit.org/235728@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@274983 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-03-24 23:14:51 +00:00
EXPECTED (latestChange == 'readyStateChanged') OK
EXPECTED (navigator.mediaSession.readyState == 'havemetadata') OK
[Cocoa] Add Experimental MediaSession coordinator https://bugs.webkit.org/show_bug.cgi?id=222158 <rdar://problem/74508862> Reviewed by Jer Noble. Source/WebCore: Add an experimental MediaSession coordinator, an object that provides an interface that allows script to coordinate changes to MediaSession with the User Agent. Also add an experimental MediaSession playlist interface. The changes are behind new experimental feature flags, MediaSessionCoordinatorEnabled and MediaSessionPlaylistEnabled. Test: media/media-session/mock-coordinator.html * DerivedSources-input.xcfilelist: Add new IDL files. * DerivedSources-output.xcfilelist: Add new derived sources. * DerivedSources.make: Add new IDL. * Modules/mediasession/MediaMetadata.cpp: (WebCore::MediaMetadata::create): Set trackIdentifier from init data. (WebCore::MediaMetadata::setTrackIdentifier): trackIdentifier setter. * Modules/mediasession/MediaMetadata.h: (WebCore::MediaMetadata::trackIdentifier const): * Modules/mediasession/MediaMetadata.idl: * Modules/mediasession/MediaMetadataInit.h: Add trackIdentifier. (WebCore::MediaMetadataInit::encode const): (WebCore::MediaMetadataInit::decode): * Modules/mediasession/MediaMetadataInit.idl: * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Initialize MainThreadGenericEventQueue. (WebCore::MediaSession::setMetadata): metadataUpdated -> notifyMetadataObservers. (WebCore::MediaSession::setReadyState): Session readyState setter. (WebCore::MediaSession::setCoordinator): Coordinator setter. Post 'coordinatorchange' event after change. (WebCore::MediaSession::setPlaylist): Playlist setter. (WebCore::MediaSession::setActionHandler): Call notifyActionHandlerObservers. (WebCore::MediaSession::setPositionState): Call notifyPositionStateObservers. (WebCore::MediaSession::metadataUpdated): Call notifyMetadataObservers. (WebCore::MediaSession::addObserver): New. (WebCore::MediaSession::removeObserver): New. (WebCore::MediaSession::forEachObserver): New. (WebCore::MediaSession::notifyMetadataObservers): New. (WebCore::MediaSession::notifyPositionStateObservers): New. (WebCore::MediaSession::notifyPlaybackStateObservers): New. (WebCore::MediaSession::notifyActionHandlerObservers): New. (WebCore::MediaSession::notifyReadyStateObservers): New. * Modules/mediasession/MediaSession.h: (WebCore::MediaSession::coordinator const): (WebCore::MediaSession::playlist const): (WebCore::MediaSession::logger const): * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionAction.h: * Modules/mediasession/MediaSessionAction.idl: * Modules/mediasession/MediaSessionActionDetails.h: * Modules/mediasession/MediaSessionActionDetails.idl: MediaSessionCoordinator proxies calls through the PlatformMediaSessionCoordinator, and then calls the equivalent MediaSession methode if the platform coordinator is successful. * Modules/mediasession/MediaSessionCoordinator.cpp: Added. (WebCore::nextCoordinatorLogIdentifier): (WebCore::MediaSessionCoordinator::create): (WebCore::MediaSessionCoordinator::MediaSessionCoordinator): (WebCore::MediaSessionCoordinator::seekTo): (WebCore::MediaSessionCoordinator::play): (WebCore::MediaSessionCoordinator::pause): (WebCore::MediaSessionCoordinator::setTrack): (WebCore::MediaSessionCoordinator::setMediaSession): (WebCore::MediaSessionCoordinator::logChannel): * Modules/mediasession/MediaSessionCoordinator.h: New. (WebCore::MediaSessionCoordinator::logger const): (WebCore::MediaSessionCoordinator::logIdentifier const): (WebCore::MediaSessionCoordinator::logClassName): * Modules/mediasession/MediaSessionCoordinator.idl: New. * Modules/mediasession/NavigatorMediaSession.h: * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * bindings/js/WebCoreBuiltinNames.h: * dom/EventNames.h: * dom/EventTargetFactory.in: * platform/graphics/PlatformMediaSessionCoordinator.h: Added. (WebCore::PlatformMediaSessionCoordinator::setLogger): (WebCore::PlatformMediaSessionCoordinator::loggerPtr const): (WebCore::PlatformMediaSessionCoordinator::logIdentifier const): (WebCore::PlatformMediaSessionCoordinator::logClassName const): (WebCore::PlatformMediaSessionCoordinator::logChannel const): * testing/Internals.cpp: (WebCore::Internals::registerMockMediaSessionCoordinator): Register the mock media session coordinator for testing. * testing/Internals.h: * testing/Internals.idl: * testing/MockMediaSessionCoordinator.cpp: Added. (WebCore::MockMediaSessionCoordinator::create): (WebCore::MockMediaSessionCoordinator::MockMediaSessionCoordinator): (WebCore::MockMediaSessionCoordinator::seekTo): (WebCore::MockMediaSessionCoordinator::play): (WebCore::MockMediaSessionCoordinator::pause): (WebCore::MockMediaSessionCoordinator::setTrack): * testing/MockMediaSessionCoordinator.h: New. Source/WTF: * Scripts/Preferences/WebPreferencesExperimental.yaml: * wtf/PlatformEnableCocoa.h: LayoutTests: * platform/TestExpectations: * media/media-session/mock-coordinator-expected.txt: Added. * media/media-session/mock-coordinator.html: Added. Canonical link: https://commits.webkit.org/235728@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@274983 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-03-24 23:14:51 +00:00
EXPECTED (navigator.mediaSession.readyState == 'havemetadata') OK
RUN(navigator.mediaSession.readyState = 'havecurrentdata')
[Cocoa] Add Experimental MediaSession coordinator https://bugs.webkit.org/show_bug.cgi?id=222158 <rdar://problem/74508862> Reviewed by Jer Noble. Source/WebCore: Add an experimental MediaSession coordinator, an object that provides an interface that allows script to coordinate changes to MediaSession with the User Agent. Also add an experimental MediaSession playlist interface. The changes are behind new experimental feature flags, MediaSessionCoordinatorEnabled and MediaSessionPlaylistEnabled. Test: media/media-session/mock-coordinator.html * DerivedSources-input.xcfilelist: Add new IDL files. * DerivedSources-output.xcfilelist: Add new derived sources. * DerivedSources.make: Add new IDL. * Modules/mediasession/MediaMetadata.cpp: (WebCore::MediaMetadata::create): Set trackIdentifier from init data. (WebCore::MediaMetadata::setTrackIdentifier): trackIdentifier setter. * Modules/mediasession/MediaMetadata.h: (WebCore::MediaMetadata::trackIdentifier const): * Modules/mediasession/MediaMetadata.idl: * Modules/mediasession/MediaMetadataInit.h: Add trackIdentifier. (WebCore::MediaMetadataInit::encode const): (WebCore::MediaMetadataInit::decode): * Modules/mediasession/MediaMetadataInit.idl: * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Initialize MainThreadGenericEventQueue. (WebCore::MediaSession::setMetadata): metadataUpdated -> notifyMetadataObservers. (WebCore::MediaSession::setReadyState): Session readyState setter. (WebCore::MediaSession::setCoordinator): Coordinator setter. Post 'coordinatorchange' event after change. (WebCore::MediaSession::setPlaylist): Playlist setter. (WebCore::MediaSession::setActionHandler): Call notifyActionHandlerObservers. (WebCore::MediaSession::setPositionState): Call notifyPositionStateObservers. (WebCore::MediaSession::metadataUpdated): Call notifyMetadataObservers. (WebCore::MediaSession::addObserver): New. (WebCore::MediaSession::removeObserver): New. (WebCore::MediaSession::forEachObserver): New. (WebCore::MediaSession::notifyMetadataObservers): New. (WebCore::MediaSession::notifyPositionStateObservers): New. (WebCore::MediaSession::notifyPlaybackStateObservers): New. (WebCore::MediaSession::notifyActionHandlerObservers): New. (WebCore::MediaSession::notifyReadyStateObservers): New. * Modules/mediasession/MediaSession.h: (WebCore::MediaSession::coordinator const): (WebCore::MediaSession::playlist const): (WebCore::MediaSession::logger const): * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionAction.h: * Modules/mediasession/MediaSessionAction.idl: * Modules/mediasession/MediaSessionActionDetails.h: * Modules/mediasession/MediaSessionActionDetails.idl: MediaSessionCoordinator proxies calls through the PlatformMediaSessionCoordinator, and then calls the equivalent MediaSession methode if the platform coordinator is successful. * Modules/mediasession/MediaSessionCoordinator.cpp: Added. (WebCore::nextCoordinatorLogIdentifier): (WebCore::MediaSessionCoordinator::create): (WebCore::MediaSessionCoordinator::MediaSessionCoordinator): (WebCore::MediaSessionCoordinator::seekTo): (WebCore::MediaSessionCoordinator::play): (WebCore::MediaSessionCoordinator::pause): (WebCore::MediaSessionCoordinator::setTrack): (WebCore::MediaSessionCoordinator::setMediaSession): (WebCore::MediaSessionCoordinator::logChannel): * Modules/mediasession/MediaSessionCoordinator.h: New. (WebCore::MediaSessionCoordinator::logger const): (WebCore::MediaSessionCoordinator::logIdentifier const): (WebCore::MediaSessionCoordinator::logClassName): * Modules/mediasession/MediaSessionCoordinator.idl: New. * Modules/mediasession/NavigatorMediaSession.h: * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * bindings/js/WebCoreBuiltinNames.h: * dom/EventNames.h: * dom/EventTargetFactory.in: * platform/graphics/PlatformMediaSessionCoordinator.h: Added. (WebCore::PlatformMediaSessionCoordinator::setLogger): (WebCore::PlatformMediaSessionCoordinator::loggerPtr const): (WebCore::PlatformMediaSessionCoordinator::logIdentifier const): (WebCore::PlatformMediaSessionCoordinator::logClassName const): (WebCore::PlatformMediaSessionCoordinator::logChannel const): * testing/Internals.cpp: (WebCore::Internals::registerMockMediaSessionCoordinator): Register the mock media session coordinator for testing. * testing/Internals.h: * testing/Internals.idl: * testing/MockMediaSessionCoordinator.cpp: Added. (WebCore::MockMediaSessionCoordinator::create): (WebCore::MockMediaSessionCoordinator::MockMediaSessionCoordinator): (WebCore::MockMediaSessionCoordinator::seekTo): (WebCore::MockMediaSessionCoordinator::play): (WebCore::MockMediaSessionCoordinator::pause): (WebCore::MockMediaSessionCoordinator::setTrack): * testing/MockMediaSessionCoordinator.h: New. Source/WTF: * Scripts/Preferences/WebPreferencesExperimental.yaml: * wtf/PlatformEnableCocoa.h: LayoutTests: * platform/TestExpectations: * media/media-session/mock-coordinator-expected.txt: Added. * media/media-session/mock-coordinator.html: Added. Canonical link: https://commits.webkit.org/235728@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@274983 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-03-24 23:14:51 +00:00
EXPECTED (latestChange == 'readyStateChanged') OK
EXPECTED (navigator.mediaSession.readyState == 'havecurrentdata') OK
[Cocoa] Add Experimental MediaSession coordinator https://bugs.webkit.org/show_bug.cgi?id=222158 <rdar://problem/74508862> Reviewed by Jer Noble. Source/WebCore: Add an experimental MediaSession coordinator, an object that provides an interface that allows script to coordinate changes to MediaSession with the User Agent. Also add an experimental MediaSession playlist interface. The changes are behind new experimental feature flags, MediaSessionCoordinatorEnabled and MediaSessionPlaylistEnabled. Test: media/media-session/mock-coordinator.html * DerivedSources-input.xcfilelist: Add new IDL files. * DerivedSources-output.xcfilelist: Add new derived sources. * DerivedSources.make: Add new IDL. * Modules/mediasession/MediaMetadata.cpp: (WebCore::MediaMetadata::create): Set trackIdentifier from init data. (WebCore::MediaMetadata::setTrackIdentifier): trackIdentifier setter. * Modules/mediasession/MediaMetadata.h: (WebCore::MediaMetadata::trackIdentifier const): * Modules/mediasession/MediaMetadata.idl: * Modules/mediasession/MediaMetadataInit.h: Add trackIdentifier. (WebCore::MediaMetadataInit::encode const): (WebCore::MediaMetadataInit::decode): * Modules/mediasession/MediaMetadataInit.idl: * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Initialize MainThreadGenericEventQueue. (WebCore::MediaSession::setMetadata): metadataUpdated -> notifyMetadataObservers. (WebCore::MediaSession::setReadyState): Session readyState setter. (WebCore::MediaSession::setCoordinator): Coordinator setter. Post 'coordinatorchange' event after change. (WebCore::MediaSession::setPlaylist): Playlist setter. (WebCore::MediaSession::setActionHandler): Call notifyActionHandlerObservers. (WebCore::MediaSession::setPositionState): Call notifyPositionStateObservers. (WebCore::MediaSession::metadataUpdated): Call notifyMetadataObservers. (WebCore::MediaSession::addObserver): New. (WebCore::MediaSession::removeObserver): New. (WebCore::MediaSession::forEachObserver): New. (WebCore::MediaSession::notifyMetadataObservers): New. (WebCore::MediaSession::notifyPositionStateObservers): New. (WebCore::MediaSession::notifyPlaybackStateObservers): New. (WebCore::MediaSession::notifyActionHandlerObservers): New. (WebCore::MediaSession::notifyReadyStateObservers): New. * Modules/mediasession/MediaSession.h: (WebCore::MediaSession::coordinator const): (WebCore::MediaSession::playlist const): (WebCore::MediaSession::logger const): * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionAction.h: * Modules/mediasession/MediaSessionAction.idl: * Modules/mediasession/MediaSessionActionDetails.h: * Modules/mediasession/MediaSessionActionDetails.idl: MediaSessionCoordinator proxies calls through the PlatformMediaSessionCoordinator, and then calls the equivalent MediaSession methode if the platform coordinator is successful. * Modules/mediasession/MediaSessionCoordinator.cpp: Added. (WebCore::nextCoordinatorLogIdentifier): (WebCore::MediaSessionCoordinator::create): (WebCore::MediaSessionCoordinator::MediaSessionCoordinator): (WebCore::MediaSessionCoordinator::seekTo): (WebCore::MediaSessionCoordinator::play): (WebCore::MediaSessionCoordinator::pause): (WebCore::MediaSessionCoordinator::setTrack): (WebCore::MediaSessionCoordinator::setMediaSession): (WebCore::MediaSessionCoordinator::logChannel): * Modules/mediasession/MediaSessionCoordinator.h: New. (WebCore::MediaSessionCoordinator::logger const): (WebCore::MediaSessionCoordinator::logIdentifier const): (WebCore::MediaSessionCoordinator::logClassName): * Modules/mediasession/MediaSessionCoordinator.idl: New. * Modules/mediasession/NavigatorMediaSession.h: * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * bindings/js/WebCoreBuiltinNames.h: * dom/EventNames.h: * dom/EventTargetFactory.in: * platform/graphics/PlatformMediaSessionCoordinator.h: Added. (WebCore::PlatformMediaSessionCoordinator::setLogger): (WebCore::PlatformMediaSessionCoordinator::loggerPtr const): (WebCore::PlatformMediaSessionCoordinator::logIdentifier const): (WebCore::PlatformMediaSessionCoordinator::logClassName const): (WebCore::PlatformMediaSessionCoordinator::logChannel const): * testing/Internals.cpp: (WebCore::Internals::registerMockMediaSessionCoordinator): Register the mock media session coordinator for testing. * testing/Internals.h: * testing/Internals.idl: * testing/MockMediaSessionCoordinator.cpp: Added. (WebCore::MockMediaSessionCoordinator::create): (WebCore::MockMediaSessionCoordinator::MockMediaSessionCoordinator): (WebCore::MockMediaSessionCoordinator::seekTo): (WebCore::MockMediaSessionCoordinator::play): (WebCore::MockMediaSessionCoordinator::pause): (WebCore::MockMediaSessionCoordinator::setTrack): * testing/MockMediaSessionCoordinator.h: New. Source/WTF: * Scripts/Preferences/WebPreferencesExperimental.yaml: * wtf/PlatformEnableCocoa.h: LayoutTests: * platform/TestExpectations: * media/media-session/mock-coordinator-expected.txt: Added. * media/media-session/mock-coordinator.html: Added. Canonical link: https://commits.webkit.org/235728@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@274983 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-03-24 23:14:51 +00:00
EXPECTED (navigator.mediaSession.readyState == 'havecurrentdata') OK
RUN(navigator.mediaSession.readyState = 'havefuturedata')
[Cocoa] Add Experimental MediaSession coordinator https://bugs.webkit.org/show_bug.cgi?id=222158 <rdar://problem/74508862> Reviewed by Jer Noble. Source/WebCore: Add an experimental MediaSession coordinator, an object that provides an interface that allows script to coordinate changes to MediaSession with the User Agent. Also add an experimental MediaSession playlist interface. The changes are behind new experimental feature flags, MediaSessionCoordinatorEnabled and MediaSessionPlaylistEnabled. Test: media/media-session/mock-coordinator.html * DerivedSources-input.xcfilelist: Add new IDL files. * DerivedSources-output.xcfilelist: Add new derived sources. * DerivedSources.make: Add new IDL. * Modules/mediasession/MediaMetadata.cpp: (WebCore::MediaMetadata::create): Set trackIdentifier from init data. (WebCore::MediaMetadata::setTrackIdentifier): trackIdentifier setter. * Modules/mediasession/MediaMetadata.h: (WebCore::MediaMetadata::trackIdentifier const): * Modules/mediasession/MediaMetadata.idl: * Modules/mediasession/MediaMetadataInit.h: Add trackIdentifier. (WebCore::MediaMetadataInit::encode const): (WebCore::MediaMetadataInit::decode): * Modules/mediasession/MediaMetadataInit.idl: * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Initialize MainThreadGenericEventQueue. (WebCore::MediaSession::setMetadata): metadataUpdated -> notifyMetadataObservers. (WebCore::MediaSession::setReadyState): Session readyState setter. (WebCore::MediaSession::setCoordinator): Coordinator setter. Post 'coordinatorchange' event after change. (WebCore::MediaSession::setPlaylist): Playlist setter. (WebCore::MediaSession::setActionHandler): Call notifyActionHandlerObservers. (WebCore::MediaSession::setPositionState): Call notifyPositionStateObservers. (WebCore::MediaSession::metadataUpdated): Call notifyMetadataObservers. (WebCore::MediaSession::addObserver): New. (WebCore::MediaSession::removeObserver): New. (WebCore::MediaSession::forEachObserver): New. (WebCore::MediaSession::notifyMetadataObservers): New. (WebCore::MediaSession::notifyPositionStateObservers): New. (WebCore::MediaSession::notifyPlaybackStateObservers): New. (WebCore::MediaSession::notifyActionHandlerObservers): New. (WebCore::MediaSession::notifyReadyStateObservers): New. * Modules/mediasession/MediaSession.h: (WebCore::MediaSession::coordinator const): (WebCore::MediaSession::playlist const): (WebCore::MediaSession::logger const): * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionAction.h: * Modules/mediasession/MediaSessionAction.idl: * Modules/mediasession/MediaSessionActionDetails.h: * Modules/mediasession/MediaSessionActionDetails.idl: MediaSessionCoordinator proxies calls through the PlatformMediaSessionCoordinator, and then calls the equivalent MediaSession methode if the platform coordinator is successful. * Modules/mediasession/MediaSessionCoordinator.cpp: Added. (WebCore::nextCoordinatorLogIdentifier): (WebCore::MediaSessionCoordinator::create): (WebCore::MediaSessionCoordinator::MediaSessionCoordinator): (WebCore::MediaSessionCoordinator::seekTo): (WebCore::MediaSessionCoordinator::play): (WebCore::MediaSessionCoordinator::pause): (WebCore::MediaSessionCoordinator::setTrack): (WebCore::MediaSessionCoordinator::setMediaSession): (WebCore::MediaSessionCoordinator::logChannel): * Modules/mediasession/MediaSessionCoordinator.h: New. (WebCore::MediaSessionCoordinator::logger const): (WebCore::MediaSessionCoordinator::logIdentifier const): (WebCore::MediaSessionCoordinator::logClassName): * Modules/mediasession/MediaSessionCoordinator.idl: New. * Modules/mediasession/NavigatorMediaSession.h: * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * bindings/js/WebCoreBuiltinNames.h: * dom/EventNames.h: * dom/EventTargetFactory.in: * platform/graphics/PlatformMediaSessionCoordinator.h: Added. (WebCore::PlatformMediaSessionCoordinator::setLogger): (WebCore::PlatformMediaSessionCoordinator::loggerPtr const): (WebCore::PlatformMediaSessionCoordinator::logIdentifier const): (WebCore::PlatformMediaSessionCoordinator::logClassName const): (WebCore::PlatformMediaSessionCoordinator::logChannel const): * testing/Internals.cpp: (WebCore::Internals::registerMockMediaSessionCoordinator): Register the mock media session coordinator for testing. * testing/Internals.h: * testing/Internals.idl: * testing/MockMediaSessionCoordinator.cpp: Added. (WebCore::MockMediaSessionCoordinator::create): (WebCore::MockMediaSessionCoordinator::MockMediaSessionCoordinator): (WebCore::MockMediaSessionCoordinator::seekTo): (WebCore::MockMediaSessionCoordinator::play): (WebCore::MockMediaSessionCoordinator::pause): (WebCore::MockMediaSessionCoordinator::setTrack): * testing/MockMediaSessionCoordinator.h: New. Source/WTF: * Scripts/Preferences/WebPreferencesExperimental.yaml: * wtf/PlatformEnableCocoa.h: LayoutTests: * platform/TestExpectations: * media/media-session/mock-coordinator-expected.txt: Added. * media/media-session/mock-coordinator.html: Added. Canonical link: https://commits.webkit.org/235728@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@274983 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-03-24 23:14:51 +00:00
EXPECTED (latestChange == 'readyStateChanged') OK
EXPECTED (navigator.mediaSession.readyState == 'havefuturedata') OK
[Cocoa] Add Experimental MediaSession coordinator https://bugs.webkit.org/show_bug.cgi?id=222158 <rdar://problem/74508862> Reviewed by Jer Noble. Source/WebCore: Add an experimental MediaSession coordinator, an object that provides an interface that allows script to coordinate changes to MediaSession with the User Agent. Also add an experimental MediaSession playlist interface. The changes are behind new experimental feature flags, MediaSessionCoordinatorEnabled and MediaSessionPlaylistEnabled. Test: media/media-session/mock-coordinator.html * DerivedSources-input.xcfilelist: Add new IDL files. * DerivedSources-output.xcfilelist: Add new derived sources. * DerivedSources.make: Add new IDL. * Modules/mediasession/MediaMetadata.cpp: (WebCore::MediaMetadata::create): Set trackIdentifier from init data. (WebCore::MediaMetadata::setTrackIdentifier): trackIdentifier setter. * Modules/mediasession/MediaMetadata.h: (WebCore::MediaMetadata::trackIdentifier const): * Modules/mediasession/MediaMetadata.idl: * Modules/mediasession/MediaMetadataInit.h: Add trackIdentifier. (WebCore::MediaMetadataInit::encode const): (WebCore::MediaMetadataInit::decode): * Modules/mediasession/MediaMetadataInit.idl: * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Initialize MainThreadGenericEventQueue. (WebCore::MediaSession::setMetadata): metadataUpdated -> notifyMetadataObservers. (WebCore::MediaSession::setReadyState): Session readyState setter. (WebCore::MediaSession::setCoordinator): Coordinator setter. Post 'coordinatorchange' event after change. (WebCore::MediaSession::setPlaylist): Playlist setter. (WebCore::MediaSession::setActionHandler): Call notifyActionHandlerObservers. (WebCore::MediaSession::setPositionState): Call notifyPositionStateObservers. (WebCore::MediaSession::metadataUpdated): Call notifyMetadataObservers. (WebCore::MediaSession::addObserver): New. (WebCore::MediaSession::removeObserver): New. (WebCore::MediaSession::forEachObserver): New. (WebCore::MediaSession::notifyMetadataObservers): New. (WebCore::MediaSession::notifyPositionStateObservers): New. (WebCore::MediaSession::notifyPlaybackStateObservers): New. (WebCore::MediaSession::notifyActionHandlerObservers): New. (WebCore::MediaSession::notifyReadyStateObservers): New. * Modules/mediasession/MediaSession.h: (WebCore::MediaSession::coordinator const): (WebCore::MediaSession::playlist const): (WebCore::MediaSession::logger const): * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionAction.h: * Modules/mediasession/MediaSessionAction.idl: * Modules/mediasession/MediaSessionActionDetails.h: * Modules/mediasession/MediaSessionActionDetails.idl: MediaSessionCoordinator proxies calls through the PlatformMediaSessionCoordinator, and then calls the equivalent MediaSession methode if the platform coordinator is successful. * Modules/mediasession/MediaSessionCoordinator.cpp: Added. (WebCore::nextCoordinatorLogIdentifier): (WebCore::MediaSessionCoordinator::create): (WebCore::MediaSessionCoordinator::MediaSessionCoordinator): (WebCore::MediaSessionCoordinator::seekTo): (WebCore::MediaSessionCoordinator::play): (WebCore::MediaSessionCoordinator::pause): (WebCore::MediaSessionCoordinator::setTrack): (WebCore::MediaSessionCoordinator::setMediaSession): (WebCore::MediaSessionCoordinator::logChannel): * Modules/mediasession/MediaSessionCoordinator.h: New. (WebCore::MediaSessionCoordinator::logger const): (WebCore::MediaSessionCoordinator::logIdentifier const): (WebCore::MediaSessionCoordinator::logClassName): * Modules/mediasession/MediaSessionCoordinator.idl: New. * Modules/mediasession/NavigatorMediaSession.h: * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * bindings/js/WebCoreBuiltinNames.h: * dom/EventNames.h: * dom/EventTargetFactory.in: * platform/graphics/PlatformMediaSessionCoordinator.h: Added. (WebCore::PlatformMediaSessionCoordinator::setLogger): (WebCore::PlatformMediaSessionCoordinator::loggerPtr const): (WebCore::PlatformMediaSessionCoordinator::logIdentifier const): (WebCore::PlatformMediaSessionCoordinator::logClassName const): (WebCore::PlatformMediaSessionCoordinator::logChannel const): * testing/Internals.cpp: (WebCore::Internals::registerMockMediaSessionCoordinator): Register the mock media session coordinator for testing. * testing/Internals.h: * testing/Internals.idl: * testing/MockMediaSessionCoordinator.cpp: Added. (WebCore::MockMediaSessionCoordinator::create): (WebCore::MockMediaSessionCoordinator::MockMediaSessionCoordinator): (WebCore::MockMediaSessionCoordinator::seekTo): (WebCore::MockMediaSessionCoordinator::play): (WebCore::MockMediaSessionCoordinator::pause): (WebCore::MockMediaSessionCoordinator::setTrack): * testing/MockMediaSessionCoordinator.h: New. Source/WTF: * Scripts/Preferences/WebPreferencesExperimental.yaml: * wtf/PlatformEnableCocoa.h: LayoutTests: * platform/TestExpectations: * media/media-session/mock-coordinator-expected.txt: Added. * media/media-session/mock-coordinator.html: Added. Canonical link: https://commits.webkit.org/235728@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@274983 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-03-24 23:14:51 +00:00
EXPECTED (navigator.mediaSession.readyState == 'havefuturedata') OK
RUN(navigator.mediaSession.readyState = 'haveenoughdata')
[Cocoa] Add Experimental MediaSession coordinator https://bugs.webkit.org/show_bug.cgi?id=222158 <rdar://problem/74508862> Reviewed by Jer Noble. Source/WebCore: Add an experimental MediaSession coordinator, an object that provides an interface that allows script to coordinate changes to MediaSession with the User Agent. Also add an experimental MediaSession playlist interface. The changes are behind new experimental feature flags, MediaSessionCoordinatorEnabled and MediaSessionPlaylistEnabled. Test: media/media-session/mock-coordinator.html * DerivedSources-input.xcfilelist: Add new IDL files. * DerivedSources-output.xcfilelist: Add new derived sources. * DerivedSources.make: Add new IDL. * Modules/mediasession/MediaMetadata.cpp: (WebCore::MediaMetadata::create): Set trackIdentifier from init data. (WebCore::MediaMetadata::setTrackIdentifier): trackIdentifier setter. * Modules/mediasession/MediaMetadata.h: (WebCore::MediaMetadata::trackIdentifier const): * Modules/mediasession/MediaMetadata.idl: * Modules/mediasession/MediaMetadataInit.h: Add trackIdentifier. (WebCore::MediaMetadataInit::encode const): (WebCore::MediaMetadataInit::decode): * Modules/mediasession/MediaMetadataInit.idl: * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Initialize MainThreadGenericEventQueue. (WebCore::MediaSession::setMetadata): metadataUpdated -> notifyMetadataObservers. (WebCore::MediaSession::setReadyState): Session readyState setter. (WebCore::MediaSession::setCoordinator): Coordinator setter. Post 'coordinatorchange' event after change. (WebCore::MediaSession::setPlaylist): Playlist setter. (WebCore::MediaSession::setActionHandler): Call notifyActionHandlerObservers. (WebCore::MediaSession::setPositionState): Call notifyPositionStateObservers. (WebCore::MediaSession::metadataUpdated): Call notifyMetadataObservers. (WebCore::MediaSession::addObserver): New. (WebCore::MediaSession::removeObserver): New. (WebCore::MediaSession::forEachObserver): New. (WebCore::MediaSession::notifyMetadataObservers): New. (WebCore::MediaSession::notifyPositionStateObservers): New. (WebCore::MediaSession::notifyPlaybackStateObservers): New. (WebCore::MediaSession::notifyActionHandlerObservers): New. (WebCore::MediaSession::notifyReadyStateObservers): New. * Modules/mediasession/MediaSession.h: (WebCore::MediaSession::coordinator const): (WebCore::MediaSession::playlist const): (WebCore::MediaSession::logger const): * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionAction.h: * Modules/mediasession/MediaSessionAction.idl: * Modules/mediasession/MediaSessionActionDetails.h: * Modules/mediasession/MediaSessionActionDetails.idl: MediaSessionCoordinator proxies calls through the PlatformMediaSessionCoordinator, and then calls the equivalent MediaSession methode if the platform coordinator is successful. * Modules/mediasession/MediaSessionCoordinator.cpp: Added. (WebCore::nextCoordinatorLogIdentifier): (WebCore::MediaSessionCoordinator::create): (WebCore::MediaSessionCoordinator::MediaSessionCoordinator): (WebCore::MediaSessionCoordinator::seekTo): (WebCore::MediaSessionCoordinator::play): (WebCore::MediaSessionCoordinator::pause): (WebCore::MediaSessionCoordinator::setTrack): (WebCore::MediaSessionCoordinator::setMediaSession): (WebCore::MediaSessionCoordinator::logChannel): * Modules/mediasession/MediaSessionCoordinator.h: New. (WebCore::MediaSessionCoordinator::logger const): (WebCore::MediaSessionCoordinator::logIdentifier const): (WebCore::MediaSessionCoordinator::logClassName): * Modules/mediasession/MediaSessionCoordinator.idl: New. * Modules/mediasession/NavigatorMediaSession.h: * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * bindings/js/WebCoreBuiltinNames.h: * dom/EventNames.h: * dom/EventTargetFactory.in: * platform/graphics/PlatformMediaSessionCoordinator.h: Added. (WebCore::PlatformMediaSessionCoordinator::setLogger): (WebCore::PlatformMediaSessionCoordinator::loggerPtr const): (WebCore::PlatformMediaSessionCoordinator::logIdentifier const): (WebCore::PlatformMediaSessionCoordinator::logClassName const): (WebCore::PlatformMediaSessionCoordinator::logChannel const): * testing/Internals.cpp: (WebCore::Internals::registerMockMediaSessionCoordinator): Register the mock media session coordinator for testing. * testing/Internals.h: * testing/Internals.idl: * testing/MockMediaSessionCoordinator.cpp: Added. (WebCore::MockMediaSessionCoordinator::create): (WebCore::MockMediaSessionCoordinator::MockMediaSessionCoordinator): (WebCore::MockMediaSessionCoordinator::seekTo): (WebCore::MockMediaSessionCoordinator::play): (WebCore::MockMediaSessionCoordinator::pause): (WebCore::MockMediaSessionCoordinator::setTrack): * testing/MockMediaSessionCoordinator.h: New. Source/WTF: * Scripts/Preferences/WebPreferencesExperimental.yaml: * wtf/PlatformEnableCocoa.h: LayoutTests: * platform/TestExpectations: * media/media-session/mock-coordinator-expected.txt: Added. * media/media-session/mock-coordinator.html: Added. Canonical link: https://commits.webkit.org/235728@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@274983 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-03-24 23:14:51 +00:00
EXPECTED (latestChange == 'readyStateChanged') OK
EXPECTED (navigator.mediaSession.readyState == 'haveenoughdata') OK
[Cocoa] Add Experimental MediaSession coordinator https://bugs.webkit.org/show_bug.cgi?id=222158 <rdar://problem/74508862> Reviewed by Jer Noble. Source/WebCore: Add an experimental MediaSession coordinator, an object that provides an interface that allows script to coordinate changes to MediaSession with the User Agent. Also add an experimental MediaSession playlist interface. The changes are behind new experimental feature flags, MediaSessionCoordinatorEnabled and MediaSessionPlaylistEnabled. Test: media/media-session/mock-coordinator.html * DerivedSources-input.xcfilelist: Add new IDL files. * DerivedSources-output.xcfilelist: Add new derived sources. * DerivedSources.make: Add new IDL. * Modules/mediasession/MediaMetadata.cpp: (WebCore::MediaMetadata::create): Set trackIdentifier from init data. (WebCore::MediaMetadata::setTrackIdentifier): trackIdentifier setter. * Modules/mediasession/MediaMetadata.h: (WebCore::MediaMetadata::trackIdentifier const): * Modules/mediasession/MediaMetadata.idl: * Modules/mediasession/MediaMetadataInit.h: Add trackIdentifier. (WebCore::MediaMetadataInit::encode const): (WebCore::MediaMetadataInit::decode): * Modules/mediasession/MediaMetadataInit.idl: * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Initialize MainThreadGenericEventQueue. (WebCore::MediaSession::setMetadata): metadataUpdated -> notifyMetadataObservers. (WebCore::MediaSession::setReadyState): Session readyState setter. (WebCore::MediaSession::setCoordinator): Coordinator setter. Post 'coordinatorchange' event after change. (WebCore::MediaSession::setPlaylist): Playlist setter. (WebCore::MediaSession::setActionHandler): Call notifyActionHandlerObservers. (WebCore::MediaSession::setPositionState): Call notifyPositionStateObservers. (WebCore::MediaSession::metadataUpdated): Call notifyMetadataObservers. (WebCore::MediaSession::addObserver): New. (WebCore::MediaSession::removeObserver): New. (WebCore::MediaSession::forEachObserver): New. (WebCore::MediaSession::notifyMetadataObservers): New. (WebCore::MediaSession::notifyPositionStateObservers): New. (WebCore::MediaSession::notifyPlaybackStateObservers): New. (WebCore::MediaSession::notifyActionHandlerObservers): New. (WebCore::MediaSession::notifyReadyStateObservers): New. * Modules/mediasession/MediaSession.h: (WebCore::MediaSession::coordinator const): (WebCore::MediaSession::playlist const): (WebCore::MediaSession::logger const): * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionAction.h: * Modules/mediasession/MediaSessionAction.idl: * Modules/mediasession/MediaSessionActionDetails.h: * Modules/mediasession/MediaSessionActionDetails.idl: MediaSessionCoordinator proxies calls through the PlatformMediaSessionCoordinator, and then calls the equivalent MediaSession methode if the platform coordinator is successful. * Modules/mediasession/MediaSessionCoordinator.cpp: Added. (WebCore::nextCoordinatorLogIdentifier): (WebCore::MediaSessionCoordinator::create): (WebCore::MediaSessionCoordinator::MediaSessionCoordinator): (WebCore::MediaSessionCoordinator::seekTo): (WebCore::MediaSessionCoordinator::play): (WebCore::MediaSessionCoordinator::pause): (WebCore::MediaSessionCoordinator::setTrack): (WebCore::MediaSessionCoordinator::setMediaSession): (WebCore::MediaSessionCoordinator::logChannel): * Modules/mediasession/MediaSessionCoordinator.h: New. (WebCore::MediaSessionCoordinator::logger const): (WebCore::MediaSessionCoordinator::logIdentifier const): (WebCore::MediaSessionCoordinator::logClassName): * Modules/mediasession/MediaSessionCoordinator.idl: New. * Modules/mediasession/NavigatorMediaSession.h: * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * bindings/js/WebCoreBuiltinNames.h: * dom/EventNames.h: * dom/EventTargetFactory.in: * platform/graphics/PlatformMediaSessionCoordinator.h: Added. (WebCore::PlatformMediaSessionCoordinator::setLogger): (WebCore::PlatformMediaSessionCoordinator::loggerPtr const): (WebCore::PlatformMediaSessionCoordinator::logIdentifier const): (WebCore::PlatformMediaSessionCoordinator::logClassName const): (WebCore::PlatformMediaSessionCoordinator::logChannel const): * testing/Internals.cpp: (WebCore::Internals::registerMockMediaSessionCoordinator): Register the mock media session coordinator for testing. * testing/Internals.h: * testing/Internals.idl: * testing/MockMediaSessionCoordinator.cpp: Added. (WebCore::MockMediaSessionCoordinator::create): (WebCore::MockMediaSessionCoordinator::MockMediaSessionCoordinator): (WebCore::MockMediaSessionCoordinator::seekTo): (WebCore::MockMediaSessionCoordinator::play): (WebCore::MockMediaSessionCoordinator::pause): (WebCore::MockMediaSessionCoordinator::setTrack): * testing/MockMediaSessionCoordinator.h: New. Source/WTF: * Scripts/Preferences/WebPreferencesExperimental.yaml: * wtf/PlatformEnableCocoa.h: LayoutTests: * platform/TestExpectations: * media/media-session/mock-coordinator-expected.txt: Added. * media/media-session/mock-coordinator.html: Added. Canonical link: https://commits.webkit.org/235728@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@274983 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-03-24 23:14:51 +00:00
EXPECTED (navigator.mediaSession.readyState == 'haveenoughdata') OK
RUN(navigator.mediaSession.readyState = 'havenothing')
[Cocoa] Add Experimental MediaSession coordinator https://bugs.webkit.org/show_bug.cgi?id=222158 <rdar://problem/74508862> Reviewed by Jer Noble. Source/WebCore: Add an experimental MediaSession coordinator, an object that provides an interface that allows script to coordinate changes to MediaSession with the User Agent. Also add an experimental MediaSession playlist interface. The changes are behind new experimental feature flags, MediaSessionCoordinatorEnabled and MediaSessionPlaylistEnabled. Test: media/media-session/mock-coordinator.html * DerivedSources-input.xcfilelist: Add new IDL files. * DerivedSources-output.xcfilelist: Add new derived sources. * DerivedSources.make: Add new IDL. * Modules/mediasession/MediaMetadata.cpp: (WebCore::MediaMetadata::create): Set trackIdentifier from init data. (WebCore::MediaMetadata::setTrackIdentifier): trackIdentifier setter. * Modules/mediasession/MediaMetadata.h: (WebCore::MediaMetadata::trackIdentifier const): * Modules/mediasession/MediaMetadata.idl: * Modules/mediasession/MediaMetadataInit.h: Add trackIdentifier. (WebCore::MediaMetadataInit::encode const): (WebCore::MediaMetadataInit::decode): * Modules/mediasession/MediaMetadataInit.idl: * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Initialize MainThreadGenericEventQueue. (WebCore::MediaSession::setMetadata): metadataUpdated -> notifyMetadataObservers. (WebCore::MediaSession::setReadyState): Session readyState setter. (WebCore::MediaSession::setCoordinator): Coordinator setter. Post 'coordinatorchange' event after change. (WebCore::MediaSession::setPlaylist): Playlist setter. (WebCore::MediaSession::setActionHandler): Call notifyActionHandlerObservers. (WebCore::MediaSession::setPositionState): Call notifyPositionStateObservers. (WebCore::MediaSession::metadataUpdated): Call notifyMetadataObservers. (WebCore::MediaSession::addObserver): New. (WebCore::MediaSession::removeObserver): New. (WebCore::MediaSession::forEachObserver): New. (WebCore::MediaSession::notifyMetadataObservers): New. (WebCore::MediaSession::notifyPositionStateObservers): New. (WebCore::MediaSession::notifyPlaybackStateObservers): New. (WebCore::MediaSession::notifyActionHandlerObservers): New. (WebCore::MediaSession::notifyReadyStateObservers): New. * Modules/mediasession/MediaSession.h: (WebCore::MediaSession::coordinator const): (WebCore::MediaSession::playlist const): (WebCore::MediaSession::logger const): * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionAction.h: * Modules/mediasession/MediaSessionAction.idl: * Modules/mediasession/MediaSessionActionDetails.h: * Modules/mediasession/MediaSessionActionDetails.idl: MediaSessionCoordinator proxies calls through the PlatformMediaSessionCoordinator, and then calls the equivalent MediaSession methode if the platform coordinator is successful. * Modules/mediasession/MediaSessionCoordinator.cpp: Added. (WebCore::nextCoordinatorLogIdentifier): (WebCore::MediaSessionCoordinator::create): (WebCore::MediaSessionCoordinator::MediaSessionCoordinator): (WebCore::MediaSessionCoordinator::seekTo): (WebCore::MediaSessionCoordinator::play): (WebCore::MediaSessionCoordinator::pause): (WebCore::MediaSessionCoordinator::setTrack): (WebCore::MediaSessionCoordinator::setMediaSession): (WebCore::MediaSessionCoordinator::logChannel): * Modules/mediasession/MediaSessionCoordinator.h: New. (WebCore::MediaSessionCoordinator::logger const): (WebCore::MediaSessionCoordinator::logIdentifier const): (WebCore::MediaSessionCoordinator::logClassName): * Modules/mediasession/MediaSessionCoordinator.idl: New. * Modules/mediasession/NavigatorMediaSession.h: * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * bindings/js/WebCoreBuiltinNames.h: * dom/EventNames.h: * dom/EventTargetFactory.in: * platform/graphics/PlatformMediaSessionCoordinator.h: Added. (WebCore::PlatformMediaSessionCoordinator::setLogger): (WebCore::PlatformMediaSessionCoordinator::loggerPtr const): (WebCore::PlatformMediaSessionCoordinator::logIdentifier const): (WebCore::PlatformMediaSessionCoordinator::logClassName const): (WebCore::PlatformMediaSessionCoordinator::logChannel const): * testing/Internals.cpp: (WebCore::Internals::registerMockMediaSessionCoordinator): Register the mock media session coordinator for testing. * testing/Internals.h: * testing/Internals.idl: * testing/MockMediaSessionCoordinator.cpp: Added. (WebCore::MockMediaSessionCoordinator::create): (WebCore::MockMediaSessionCoordinator::MockMediaSessionCoordinator): (WebCore::MockMediaSessionCoordinator::seekTo): (WebCore::MockMediaSessionCoordinator::play): (WebCore::MockMediaSessionCoordinator::pause): (WebCore::MockMediaSessionCoordinator::setTrack): * testing/MockMediaSessionCoordinator.h: New. Source/WTF: * Scripts/Preferences/WebPreferencesExperimental.yaml: * wtf/PlatformEnableCocoa.h: LayoutTests: * platform/TestExpectations: * media/media-session/mock-coordinator-expected.txt: Added. * media/media-session/mock-coordinator.html: Added. Canonical link: https://commits.webkit.org/235728@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@274983 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-03-24 23:14:51 +00:00
EXPECTED (latestChange == 'readyStateChanged') OK
EXPECTED (navigator.mediaSession.readyState == 'havenothing') OK
[Cocoa] Add Experimental MediaSession coordinator https://bugs.webkit.org/show_bug.cgi?id=222158 <rdar://problem/74508862> Reviewed by Jer Noble. Source/WebCore: Add an experimental MediaSession coordinator, an object that provides an interface that allows script to coordinate changes to MediaSession with the User Agent. Also add an experimental MediaSession playlist interface. The changes are behind new experimental feature flags, MediaSessionCoordinatorEnabled and MediaSessionPlaylistEnabled. Test: media/media-session/mock-coordinator.html * DerivedSources-input.xcfilelist: Add new IDL files. * DerivedSources-output.xcfilelist: Add new derived sources. * DerivedSources.make: Add new IDL. * Modules/mediasession/MediaMetadata.cpp: (WebCore::MediaMetadata::create): Set trackIdentifier from init data. (WebCore::MediaMetadata::setTrackIdentifier): trackIdentifier setter. * Modules/mediasession/MediaMetadata.h: (WebCore::MediaMetadata::trackIdentifier const): * Modules/mediasession/MediaMetadata.idl: * Modules/mediasession/MediaMetadataInit.h: Add trackIdentifier. (WebCore::MediaMetadataInit::encode const): (WebCore::MediaMetadataInit::decode): * Modules/mediasession/MediaMetadataInit.idl: * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Initialize MainThreadGenericEventQueue. (WebCore::MediaSession::setMetadata): metadataUpdated -> notifyMetadataObservers. (WebCore::MediaSession::setReadyState): Session readyState setter. (WebCore::MediaSession::setCoordinator): Coordinator setter. Post 'coordinatorchange' event after change. (WebCore::MediaSession::setPlaylist): Playlist setter. (WebCore::MediaSession::setActionHandler): Call notifyActionHandlerObservers. (WebCore::MediaSession::setPositionState): Call notifyPositionStateObservers. (WebCore::MediaSession::metadataUpdated): Call notifyMetadataObservers. (WebCore::MediaSession::addObserver): New. (WebCore::MediaSession::removeObserver): New. (WebCore::MediaSession::forEachObserver): New. (WebCore::MediaSession::notifyMetadataObservers): New. (WebCore::MediaSession::notifyPositionStateObservers): New. (WebCore::MediaSession::notifyPlaybackStateObservers): New. (WebCore::MediaSession::notifyActionHandlerObservers): New. (WebCore::MediaSession::notifyReadyStateObservers): New. * Modules/mediasession/MediaSession.h: (WebCore::MediaSession::coordinator const): (WebCore::MediaSession::playlist const): (WebCore::MediaSession::logger const): * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionAction.h: * Modules/mediasession/MediaSessionAction.idl: * Modules/mediasession/MediaSessionActionDetails.h: * Modules/mediasession/MediaSessionActionDetails.idl: MediaSessionCoordinator proxies calls through the PlatformMediaSessionCoordinator, and then calls the equivalent MediaSession methode if the platform coordinator is successful. * Modules/mediasession/MediaSessionCoordinator.cpp: Added. (WebCore::nextCoordinatorLogIdentifier): (WebCore::MediaSessionCoordinator::create): (WebCore::MediaSessionCoordinator::MediaSessionCoordinator): (WebCore::MediaSessionCoordinator::seekTo): (WebCore::MediaSessionCoordinator::play): (WebCore::MediaSessionCoordinator::pause): (WebCore::MediaSessionCoordinator::setTrack): (WebCore::MediaSessionCoordinator::setMediaSession): (WebCore::MediaSessionCoordinator::logChannel): * Modules/mediasession/MediaSessionCoordinator.h: New. (WebCore::MediaSessionCoordinator::logger const): (WebCore::MediaSessionCoordinator::logIdentifier const): (WebCore::MediaSessionCoordinator::logClassName): * Modules/mediasession/MediaSessionCoordinator.idl: New. * Modules/mediasession/NavigatorMediaSession.h: * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * bindings/js/WebCoreBuiltinNames.h: * dom/EventNames.h: * dom/EventTargetFactory.in: * platform/graphics/PlatformMediaSessionCoordinator.h: Added. (WebCore::PlatformMediaSessionCoordinator::setLogger): (WebCore::PlatformMediaSessionCoordinator::loggerPtr const): (WebCore::PlatformMediaSessionCoordinator::logIdentifier const): (WebCore::PlatformMediaSessionCoordinator::logClassName const): (WebCore::PlatformMediaSessionCoordinator::logChannel const): * testing/Internals.cpp: (WebCore::Internals::registerMockMediaSessionCoordinator): Register the mock media session coordinator for testing. * testing/Internals.h: * testing/Internals.idl: * testing/MockMediaSessionCoordinator.cpp: Added. (WebCore::MockMediaSessionCoordinator::create): (WebCore::MockMediaSessionCoordinator::MockMediaSessionCoordinator): (WebCore::MockMediaSessionCoordinator::seekTo): (WebCore::MockMediaSessionCoordinator::play): (WebCore::MockMediaSessionCoordinator::pause): (WebCore::MockMediaSessionCoordinator::setTrack): * testing/MockMediaSessionCoordinator.h: New. Source/WTF: * Scripts/Preferences/WebPreferencesExperimental.yaml: * wtf/PlatformEnableCocoa.h: LayoutTests: * platform/TestExpectations: * media/media-session/mock-coordinator-expected.txt: Added. * media/media-session/mock-coordinator.html: Added. Canonical link: https://commits.webkit.org/235728@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@274983 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-03-24 23:14:51 +00:00
** Test that mediaSession notifies coordinator when playbackState changes.
EXPECTED (navigator.mediaSession.playbackState == 'none') OK
RUN(navigator.mediaSession.playbackState = 'paused')
EXPECTED (navigator.mediaSession.playbackState == 'paused') OK
EXPECTED (navigator.mediaSession.playbackState == 'paused') OK
RUN(navigator.mediaSession.playbackState = 'playing')
EXPECTED (navigator.mediaSession.playbackState == 'playing') OK
EXPECTED (navigator.mediaSession.playbackState == 'playing') OK
RUN(navigator.mediaSession.playbackState = 'none')
EXPECTED (navigator.mediaSession.playbackState == 'none') OK
[macOS] MediaSessionCoordinator should have join and leave methods https://bugs.webkit.org/show_bug.cgi?id=223955 <rdar://problem/76021588> Reviewed by Jer Noble. Source/WebCore: Add 'join' and 'leave' methods to MediaSessionCoordinator so a page has to opt-in to participating in a coordinated session and can leave at any time. Don't have the coordinator automatically call session methods when the private coordinator finishes, just signal the promise and let the page handle it. No new tests, updated media/media-session/mock-coordinator.html. * CMakeLists.txt: * DerivedSources-input.xcfilelist: * DerivedSources-output.xcfilelist: * DerivedSources.make: * Modules/mediasession/MediaMetadata.idl: Fix Conditional. * Modules/mediasession/MediaMetadataPlaylistMixin.idl: Ditto. * Modules/mediasession/MediaPositionState.h: Add logging template. (WTF::LogArgument<WebCore::MediaPositionState>::toString): * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Switch from beging a ContextDestructionObserver to an ActiveDOMObject to the wrapper won't be collected while an event dispatch is pending. (WebCore::MediaSession::virtualHasPendingActivity const): Prevent collection while event dispatch is pending. (WebCore::MediaSession::setPositionState): Improve logging. (WebCore::MediaPositionState::toJSONString const): * Modules/mediasession/MediaSession.h: * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::join): New. (WebCore::MediaSessionCoordinator::leave): New. (WebCore::MediaSessionCoordinator::seekTo): Reject unless state is 'joined'. Don't call session method. (WebCore::MediaSessionCoordinator::play): Ditto. (WebCore::MediaSessionCoordinator::pause): Ditto. (WebCore::MediaSessionCoordinator::setTrack): Ditto. (WebCore::MediaSessionCoordinator::positionStateChanged): (WebCore::MediaSessionCoordinator::playbackStateChanged): (WebCore::MediaSessionCoordinator::readyStateChanged): Do nothing unless state is 'joined'. Improve logging. (WebCore::MediaSessionCoordinator::seekSessionToTime): Ditto. (WebCore::MediaSessionCoordinator::playSession): Ditto. (WebCore::MediaSessionCoordinator::pauseSession): Ditto. (WebCore::MediaSessionCoordinator::setSessionTrack): Ditto. * Modules/mediasession/MediaSessionCoordinator.h: (WebCore::MediaSessionCoordinator::identifier const): (WebCore::MediaSessionCoordinator::state const): * Modules/mediasession/MediaSessionCoordinator.idl: * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Fix Conditional. * Modules/mediasession/MediaSessionCoordinatorPrivate.h: Declare new required methods. * Modules/mediasession/MediaSessionCoordinatorState.h: Define states. * Modules/mediasession/MediaSessionCoordinatorState.idl: * Modules/mediasession/MediaSessionPlaylistMixin.idl: Fix Conditional. * Sources.txt: Add JSMediaSessionCoordinatorState.cpp. * WebCore.xcodeproj/project.pbxproj: * testing/MockMediaSessionCoordinator.cpp: (WebCore::MockMediaSessionCoordinator::join): (WebCore::MockMediaSessionCoordinator::leave): (WebCore::MockMediaSessionCoordinator::coordinatorStateChanged): * testing/MockMediaSessionCoordinator.h: Source/WebKit: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::join): (WebKit::RemoteMediaSessionCoordinatorProxy::leave): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::join): (WebKit::RemoteMediaSessionCoordinator::leave): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: LayoutTests: * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275314 268f45cc-cd09-0410-ab3c-d52691b4dbfc Canonical link: https://commits.webkit.org/235995@main
2021-03-31 23:11:14 +00:00
** Leave the session
RUN(navigator.mediaSession.coordinator.leave())
LayoutTests/imported/w3c: MediaSession.coordinator should not be optional, relying on coordinator state change instead https://bugs.webkit.org/show_bug.cgi?id=226328 rdar://77461335 Reviewed by Eric Carlson. * web-platform-tests/mediasession/idlharness.window-expected.txt: Source/WebCore: MediaSession.coordinator should not be optional, relying on coordinator state change instead https://bugs.webkit.org/show_bug.cgi?id=226328 rdar://77461335 Reviewed by Eric Carlson. The coordinator was a read-only optional attribute of the MediaSession element. Testing if the attribute was to be used to determine if a MediaSessionCoordinator was now available and for the MediaSession to join it. This made the use of an external polyfill difficult and enforcing the validity of an user created custom MediaSessionCoordinator due to IDL semantics limitations hard. We instead always create a MediaSessionCoordinator which in its default state is Closed. Once this state is changed to Waiting and an event is fire the MediaSession can now join it. * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): MediaSession no longer needs to fire event. Remove no longer necessary inheritance and async event queue. (WebCore::MediaSession::create): Drive-by fix, don't call suspendIfNeeded() in the constructor. (WebCore::MediaSession::createCoordinator): Make method private. * Modules/mediasession/MediaSession.h: (WebCore::MediaSession::coordinator const): MediaSessionCoordinator always exists. Return reference instead. * Modules/mediasession/MediaSession.idl: Amend definition, remove EventHandler * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::create): (WebCore::MediaSessionCoordinator::MediaSessionCoordinator): (WebCore::MediaSessionCoordinator::setMediaSessionCoordinatorPrivate): (WebCore::MediaSessionCoordinator::virtualHasPendingActivity const): (WebCore::MediaSessionCoordinator::join): (WebCore::MediaSessionCoordinator::close): (WebCore::MediaSessionCoordinator::coordinatorStateChanged): * Modules/mediasession/MediaSessionCoordinator.h: * Modules/mediasession/MediaSessionCoordinator.idl: Added new EventHandler attribute. * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Update for new API definition. * dom/EventNames.h: * dom/EventTargetFactory.in: * page/Page.cpp: (WebCore::Page::setMediaSessionCoordinator): (WebCore::Page::invalidateMediaSessionCoordinator): * testing/Internals.cpp: (WebCore::Internals::registerMockMediaSessionCoordinator): Tools: MediaSession.coordinator should not be optional, relying on coordinator readyState change instead https://bugs.webkit.org/show_bug.cgi?id=226328 rdar://77461335 Reviewed by Eric Carlson. * TestWebKitAPI/Tests/WebKit/MediaSessionCoordinatorTest.mm: (TestWebKitAPI::MediaSessionCoordinatorTest::createCoordinator): Change test to match new API, using coordinatorstatechange event instead. * TestWebKitAPI/Tests/WebKitCocoa/media-remote.html: LayoutTests: MediaSession.coordinator should not be optional, relying on coordinator readyState change instead https://bugs.webkit.org/show_bug.cgi?id=226328 rdar://77461335 Reviewed by Eric Carlson. * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: Change test to match new API. Canonical link: https://commits.webkit.org/238369@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@278336 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-06-02 01:20:38 +00:00
EXPECTED (latestChange == 'playbackStateChanged') OK
EXPECTED (latestChange == 'playbackStateChanged') OK
EXPECTED (latestChange == 'playbackStateChanged') OK
EVENT(coordinatorstatechange STATE(closed)
[macOS] MediaSessionCoordinator should have join and leave methods https://bugs.webkit.org/show_bug.cgi?id=223955 <rdar://problem/76021588> Reviewed by Jer Noble. Source/WebCore: Add 'join' and 'leave' methods to MediaSessionCoordinator so a page has to opt-in to participating in a coordinated session and can leave at any time. Don't have the coordinator automatically call session methods when the private coordinator finishes, just signal the promise and let the page handle it. No new tests, updated media/media-session/mock-coordinator.html. * CMakeLists.txt: * DerivedSources-input.xcfilelist: * DerivedSources-output.xcfilelist: * DerivedSources.make: * Modules/mediasession/MediaMetadata.idl: Fix Conditional. * Modules/mediasession/MediaMetadataPlaylistMixin.idl: Ditto. * Modules/mediasession/MediaPositionState.h: Add logging template. (WTF::LogArgument<WebCore::MediaPositionState>::toString): * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Switch from beging a ContextDestructionObserver to an ActiveDOMObject to the wrapper won't be collected while an event dispatch is pending. (WebCore::MediaSession::virtualHasPendingActivity const): Prevent collection while event dispatch is pending. (WebCore::MediaSession::setPositionState): Improve logging. (WebCore::MediaPositionState::toJSONString const): * Modules/mediasession/MediaSession.h: * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::join): New. (WebCore::MediaSessionCoordinator::leave): New. (WebCore::MediaSessionCoordinator::seekTo): Reject unless state is 'joined'. Don't call session method. (WebCore::MediaSessionCoordinator::play): Ditto. (WebCore::MediaSessionCoordinator::pause): Ditto. (WebCore::MediaSessionCoordinator::setTrack): Ditto. (WebCore::MediaSessionCoordinator::positionStateChanged): (WebCore::MediaSessionCoordinator::playbackStateChanged): (WebCore::MediaSessionCoordinator::readyStateChanged): Do nothing unless state is 'joined'. Improve logging. (WebCore::MediaSessionCoordinator::seekSessionToTime): Ditto. (WebCore::MediaSessionCoordinator::playSession): Ditto. (WebCore::MediaSessionCoordinator::pauseSession): Ditto. (WebCore::MediaSessionCoordinator::setSessionTrack): Ditto. * Modules/mediasession/MediaSessionCoordinator.h: (WebCore::MediaSessionCoordinator::identifier const): (WebCore::MediaSessionCoordinator::state const): * Modules/mediasession/MediaSessionCoordinator.idl: * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Fix Conditional. * Modules/mediasession/MediaSessionCoordinatorPrivate.h: Declare new required methods. * Modules/mediasession/MediaSessionCoordinatorState.h: Define states. * Modules/mediasession/MediaSessionCoordinatorState.idl: * Modules/mediasession/MediaSessionPlaylistMixin.idl: Fix Conditional. * Sources.txt: Add JSMediaSessionCoordinatorState.cpp. * WebCore.xcodeproj/project.pbxproj: * testing/MockMediaSessionCoordinator.cpp: (WebCore::MockMediaSessionCoordinator::join): (WebCore::MockMediaSessionCoordinator::leave): (WebCore::MockMediaSessionCoordinator::coordinatorStateChanged): * testing/MockMediaSessionCoordinator.h: Source/WebKit: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::join): (WebKit::RemoteMediaSessionCoordinatorProxy::leave): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::join): (WebKit::RemoteMediaSessionCoordinator::leave): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: LayoutTests: * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275314 268f45cc-cd09-0410-ab3c-d52691b4dbfc Canonical link: https://commits.webkit.org/235995@main
2021-03-31 23:11:14 +00:00
EXPECTED (navigator.mediaSession.coordinator.state == 'closed') OK
** Test that when coordinator methods fail and promises reject after mediaSession.leave() has been called.
RUN(promise = navigator.mediaSession.coordinator.play())
Promise rejected correctly OK
RUN(promise = navigator.mediaSession.coordinator.pause())
Promise rejected correctly OK
RUN(promise = navigator.mediaSession.coordinator.seekTo(10))
Promise rejected correctly OK
** Test that mediaSession does not notify coordinator when states change after mediaSession.leave() has been called.
* PositionState
RUN(navigator.mediaSession.setPositionState({ duration: 1, playbackRate: 1, position: 0 }))
EXPECTED (latestChange == '') OK
* ReadyState
EXPECTED (navigator.mediaSession.readyState == 'havenothing') OK
RUN(navigator.mediaSession.readyState = 'havemetadata')
[macOS] MediaSessionCoordinator should have join and leave methods https://bugs.webkit.org/show_bug.cgi?id=223955 <rdar://problem/76021588> Reviewed by Jer Noble. Source/WebCore: Add 'join' and 'leave' methods to MediaSessionCoordinator so a page has to opt-in to participating in a coordinated session and can leave at any time. Don't have the coordinator automatically call session methods when the private coordinator finishes, just signal the promise and let the page handle it. No new tests, updated media/media-session/mock-coordinator.html. * CMakeLists.txt: * DerivedSources-input.xcfilelist: * DerivedSources-output.xcfilelist: * DerivedSources.make: * Modules/mediasession/MediaMetadata.idl: Fix Conditional. * Modules/mediasession/MediaMetadataPlaylistMixin.idl: Ditto. * Modules/mediasession/MediaPositionState.h: Add logging template. (WTF::LogArgument<WebCore::MediaPositionState>::toString): * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Switch from beging a ContextDestructionObserver to an ActiveDOMObject to the wrapper won't be collected while an event dispatch is pending. (WebCore::MediaSession::virtualHasPendingActivity const): Prevent collection while event dispatch is pending. (WebCore::MediaSession::setPositionState): Improve logging. (WebCore::MediaPositionState::toJSONString const): * Modules/mediasession/MediaSession.h: * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::join): New. (WebCore::MediaSessionCoordinator::leave): New. (WebCore::MediaSessionCoordinator::seekTo): Reject unless state is 'joined'. Don't call session method. (WebCore::MediaSessionCoordinator::play): Ditto. (WebCore::MediaSessionCoordinator::pause): Ditto. (WebCore::MediaSessionCoordinator::setTrack): Ditto. (WebCore::MediaSessionCoordinator::positionStateChanged): (WebCore::MediaSessionCoordinator::playbackStateChanged): (WebCore::MediaSessionCoordinator::readyStateChanged): Do nothing unless state is 'joined'. Improve logging. (WebCore::MediaSessionCoordinator::seekSessionToTime): Ditto. (WebCore::MediaSessionCoordinator::playSession): Ditto. (WebCore::MediaSessionCoordinator::pauseSession): Ditto. (WebCore::MediaSessionCoordinator::setSessionTrack): Ditto. * Modules/mediasession/MediaSessionCoordinator.h: (WebCore::MediaSessionCoordinator::identifier const): (WebCore::MediaSessionCoordinator::state const): * Modules/mediasession/MediaSessionCoordinator.idl: * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Fix Conditional. * Modules/mediasession/MediaSessionCoordinatorPrivate.h: Declare new required methods. * Modules/mediasession/MediaSessionCoordinatorState.h: Define states. * Modules/mediasession/MediaSessionCoordinatorState.idl: * Modules/mediasession/MediaSessionPlaylistMixin.idl: Fix Conditional. * Sources.txt: Add JSMediaSessionCoordinatorState.cpp. * WebCore.xcodeproj/project.pbxproj: * testing/MockMediaSessionCoordinator.cpp: (WebCore::MockMediaSessionCoordinator::join): (WebCore::MockMediaSessionCoordinator::leave): (WebCore::MockMediaSessionCoordinator::coordinatorStateChanged): * testing/MockMediaSessionCoordinator.h: Source/WebKit: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::join): (WebKit::RemoteMediaSessionCoordinatorProxy::leave): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::join): (WebKit::RemoteMediaSessionCoordinator::leave): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: LayoutTests: * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275314 268f45cc-cd09-0410-ab3c-d52691b4dbfc Canonical link: https://commits.webkit.org/235995@main
2021-03-31 23:11:14 +00:00
EXPECTED (latestChange == '') OK
EXPECTED (navigator.mediaSession.readyState == 'havemetadata') OK
[macOS] MediaSessionCoordinator should have join and leave methods https://bugs.webkit.org/show_bug.cgi?id=223955 <rdar://problem/76021588> Reviewed by Jer Noble. Source/WebCore: Add 'join' and 'leave' methods to MediaSessionCoordinator so a page has to opt-in to participating in a coordinated session and can leave at any time. Don't have the coordinator automatically call session methods when the private coordinator finishes, just signal the promise and let the page handle it. No new tests, updated media/media-session/mock-coordinator.html. * CMakeLists.txt: * DerivedSources-input.xcfilelist: * DerivedSources-output.xcfilelist: * DerivedSources.make: * Modules/mediasession/MediaMetadata.idl: Fix Conditional. * Modules/mediasession/MediaMetadataPlaylistMixin.idl: Ditto. * Modules/mediasession/MediaPositionState.h: Add logging template. (WTF::LogArgument<WebCore::MediaPositionState>::toString): * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Switch from beging a ContextDestructionObserver to an ActiveDOMObject to the wrapper won't be collected while an event dispatch is pending. (WebCore::MediaSession::virtualHasPendingActivity const): Prevent collection while event dispatch is pending. (WebCore::MediaSession::setPositionState): Improve logging. (WebCore::MediaPositionState::toJSONString const): * Modules/mediasession/MediaSession.h: * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::join): New. (WebCore::MediaSessionCoordinator::leave): New. (WebCore::MediaSessionCoordinator::seekTo): Reject unless state is 'joined'. Don't call session method. (WebCore::MediaSessionCoordinator::play): Ditto. (WebCore::MediaSessionCoordinator::pause): Ditto. (WebCore::MediaSessionCoordinator::setTrack): Ditto. (WebCore::MediaSessionCoordinator::positionStateChanged): (WebCore::MediaSessionCoordinator::playbackStateChanged): (WebCore::MediaSessionCoordinator::readyStateChanged): Do nothing unless state is 'joined'. Improve logging. (WebCore::MediaSessionCoordinator::seekSessionToTime): Ditto. (WebCore::MediaSessionCoordinator::playSession): Ditto. (WebCore::MediaSessionCoordinator::pauseSession): Ditto. (WebCore::MediaSessionCoordinator::setSessionTrack): Ditto. * Modules/mediasession/MediaSessionCoordinator.h: (WebCore::MediaSessionCoordinator::identifier const): (WebCore::MediaSessionCoordinator::state const): * Modules/mediasession/MediaSessionCoordinator.idl: * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Fix Conditional. * Modules/mediasession/MediaSessionCoordinatorPrivate.h: Declare new required methods. * Modules/mediasession/MediaSessionCoordinatorState.h: Define states. * Modules/mediasession/MediaSessionCoordinatorState.idl: * Modules/mediasession/MediaSessionPlaylistMixin.idl: Fix Conditional. * Sources.txt: Add JSMediaSessionCoordinatorState.cpp. * WebCore.xcodeproj/project.pbxproj: * testing/MockMediaSessionCoordinator.cpp: (WebCore::MockMediaSessionCoordinator::join): (WebCore::MockMediaSessionCoordinator::leave): (WebCore::MockMediaSessionCoordinator::coordinatorStateChanged): * testing/MockMediaSessionCoordinator.h: Source/WebKit: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::join): (WebKit::RemoteMediaSessionCoordinatorProxy::leave): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::join): (WebKit::RemoteMediaSessionCoordinator::leave): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: LayoutTests: * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275314 268f45cc-cd09-0410-ab3c-d52691b4dbfc Canonical link: https://commits.webkit.org/235995@main
2021-03-31 23:11:14 +00:00
EXPECTED (navigator.mediaSession.readyState == 'havemetadata') OK
RUN(navigator.mediaSession.readyState = 'havecurrentdata')
[macOS] MediaSessionCoordinator should have join and leave methods https://bugs.webkit.org/show_bug.cgi?id=223955 <rdar://problem/76021588> Reviewed by Jer Noble. Source/WebCore: Add 'join' and 'leave' methods to MediaSessionCoordinator so a page has to opt-in to participating in a coordinated session and can leave at any time. Don't have the coordinator automatically call session methods when the private coordinator finishes, just signal the promise and let the page handle it. No new tests, updated media/media-session/mock-coordinator.html. * CMakeLists.txt: * DerivedSources-input.xcfilelist: * DerivedSources-output.xcfilelist: * DerivedSources.make: * Modules/mediasession/MediaMetadata.idl: Fix Conditional. * Modules/mediasession/MediaMetadataPlaylistMixin.idl: Ditto. * Modules/mediasession/MediaPositionState.h: Add logging template. (WTF::LogArgument<WebCore::MediaPositionState>::toString): * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Switch from beging a ContextDestructionObserver to an ActiveDOMObject to the wrapper won't be collected while an event dispatch is pending. (WebCore::MediaSession::virtualHasPendingActivity const): Prevent collection while event dispatch is pending. (WebCore::MediaSession::setPositionState): Improve logging. (WebCore::MediaPositionState::toJSONString const): * Modules/mediasession/MediaSession.h: * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::join): New. (WebCore::MediaSessionCoordinator::leave): New. (WebCore::MediaSessionCoordinator::seekTo): Reject unless state is 'joined'. Don't call session method. (WebCore::MediaSessionCoordinator::play): Ditto. (WebCore::MediaSessionCoordinator::pause): Ditto. (WebCore::MediaSessionCoordinator::setTrack): Ditto. (WebCore::MediaSessionCoordinator::positionStateChanged): (WebCore::MediaSessionCoordinator::playbackStateChanged): (WebCore::MediaSessionCoordinator::readyStateChanged): Do nothing unless state is 'joined'. Improve logging. (WebCore::MediaSessionCoordinator::seekSessionToTime): Ditto. (WebCore::MediaSessionCoordinator::playSession): Ditto. (WebCore::MediaSessionCoordinator::pauseSession): Ditto. (WebCore::MediaSessionCoordinator::setSessionTrack): Ditto. * Modules/mediasession/MediaSessionCoordinator.h: (WebCore::MediaSessionCoordinator::identifier const): (WebCore::MediaSessionCoordinator::state const): * Modules/mediasession/MediaSessionCoordinator.idl: * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Fix Conditional. * Modules/mediasession/MediaSessionCoordinatorPrivate.h: Declare new required methods. * Modules/mediasession/MediaSessionCoordinatorState.h: Define states. * Modules/mediasession/MediaSessionCoordinatorState.idl: * Modules/mediasession/MediaSessionPlaylistMixin.idl: Fix Conditional. * Sources.txt: Add JSMediaSessionCoordinatorState.cpp. * WebCore.xcodeproj/project.pbxproj: * testing/MockMediaSessionCoordinator.cpp: (WebCore::MockMediaSessionCoordinator::join): (WebCore::MockMediaSessionCoordinator::leave): (WebCore::MockMediaSessionCoordinator::coordinatorStateChanged): * testing/MockMediaSessionCoordinator.h: Source/WebKit: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::join): (WebKit::RemoteMediaSessionCoordinatorProxy::leave): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::join): (WebKit::RemoteMediaSessionCoordinator::leave): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: LayoutTests: * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275314 268f45cc-cd09-0410-ab3c-d52691b4dbfc Canonical link: https://commits.webkit.org/235995@main
2021-03-31 23:11:14 +00:00
EXPECTED (latestChange == '') OK
EXPECTED (navigator.mediaSession.readyState == 'havecurrentdata') OK
[macOS] MediaSessionCoordinator should have join and leave methods https://bugs.webkit.org/show_bug.cgi?id=223955 <rdar://problem/76021588> Reviewed by Jer Noble. Source/WebCore: Add 'join' and 'leave' methods to MediaSessionCoordinator so a page has to opt-in to participating in a coordinated session and can leave at any time. Don't have the coordinator automatically call session methods when the private coordinator finishes, just signal the promise and let the page handle it. No new tests, updated media/media-session/mock-coordinator.html. * CMakeLists.txt: * DerivedSources-input.xcfilelist: * DerivedSources-output.xcfilelist: * DerivedSources.make: * Modules/mediasession/MediaMetadata.idl: Fix Conditional. * Modules/mediasession/MediaMetadataPlaylistMixin.idl: Ditto. * Modules/mediasession/MediaPositionState.h: Add logging template. (WTF::LogArgument<WebCore::MediaPositionState>::toString): * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Switch from beging a ContextDestructionObserver to an ActiveDOMObject to the wrapper won't be collected while an event dispatch is pending. (WebCore::MediaSession::virtualHasPendingActivity const): Prevent collection while event dispatch is pending. (WebCore::MediaSession::setPositionState): Improve logging. (WebCore::MediaPositionState::toJSONString const): * Modules/mediasession/MediaSession.h: * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::join): New. (WebCore::MediaSessionCoordinator::leave): New. (WebCore::MediaSessionCoordinator::seekTo): Reject unless state is 'joined'. Don't call session method. (WebCore::MediaSessionCoordinator::play): Ditto. (WebCore::MediaSessionCoordinator::pause): Ditto. (WebCore::MediaSessionCoordinator::setTrack): Ditto. (WebCore::MediaSessionCoordinator::positionStateChanged): (WebCore::MediaSessionCoordinator::playbackStateChanged): (WebCore::MediaSessionCoordinator::readyStateChanged): Do nothing unless state is 'joined'. Improve logging. (WebCore::MediaSessionCoordinator::seekSessionToTime): Ditto. (WebCore::MediaSessionCoordinator::playSession): Ditto. (WebCore::MediaSessionCoordinator::pauseSession): Ditto. (WebCore::MediaSessionCoordinator::setSessionTrack): Ditto. * Modules/mediasession/MediaSessionCoordinator.h: (WebCore::MediaSessionCoordinator::identifier const): (WebCore::MediaSessionCoordinator::state const): * Modules/mediasession/MediaSessionCoordinator.idl: * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Fix Conditional. * Modules/mediasession/MediaSessionCoordinatorPrivate.h: Declare new required methods. * Modules/mediasession/MediaSessionCoordinatorState.h: Define states. * Modules/mediasession/MediaSessionCoordinatorState.idl: * Modules/mediasession/MediaSessionPlaylistMixin.idl: Fix Conditional. * Sources.txt: Add JSMediaSessionCoordinatorState.cpp. * WebCore.xcodeproj/project.pbxproj: * testing/MockMediaSessionCoordinator.cpp: (WebCore::MockMediaSessionCoordinator::join): (WebCore::MockMediaSessionCoordinator::leave): (WebCore::MockMediaSessionCoordinator::coordinatorStateChanged): * testing/MockMediaSessionCoordinator.h: Source/WebKit: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::join): (WebKit::RemoteMediaSessionCoordinatorProxy::leave): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::join): (WebKit::RemoteMediaSessionCoordinator::leave): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: LayoutTests: * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275314 268f45cc-cd09-0410-ab3c-d52691b4dbfc Canonical link: https://commits.webkit.org/235995@main
2021-03-31 23:11:14 +00:00
EXPECTED (navigator.mediaSession.readyState == 'havecurrentdata') OK
RUN(navigator.mediaSession.readyState = 'havefuturedata')
[macOS] MediaSessionCoordinator should have join and leave methods https://bugs.webkit.org/show_bug.cgi?id=223955 <rdar://problem/76021588> Reviewed by Jer Noble. Source/WebCore: Add 'join' and 'leave' methods to MediaSessionCoordinator so a page has to opt-in to participating in a coordinated session and can leave at any time. Don't have the coordinator automatically call session methods when the private coordinator finishes, just signal the promise and let the page handle it. No new tests, updated media/media-session/mock-coordinator.html. * CMakeLists.txt: * DerivedSources-input.xcfilelist: * DerivedSources-output.xcfilelist: * DerivedSources.make: * Modules/mediasession/MediaMetadata.idl: Fix Conditional. * Modules/mediasession/MediaMetadataPlaylistMixin.idl: Ditto. * Modules/mediasession/MediaPositionState.h: Add logging template. (WTF::LogArgument<WebCore::MediaPositionState>::toString): * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Switch from beging a ContextDestructionObserver to an ActiveDOMObject to the wrapper won't be collected while an event dispatch is pending. (WebCore::MediaSession::virtualHasPendingActivity const): Prevent collection while event dispatch is pending. (WebCore::MediaSession::setPositionState): Improve logging. (WebCore::MediaPositionState::toJSONString const): * Modules/mediasession/MediaSession.h: * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::join): New. (WebCore::MediaSessionCoordinator::leave): New. (WebCore::MediaSessionCoordinator::seekTo): Reject unless state is 'joined'. Don't call session method. (WebCore::MediaSessionCoordinator::play): Ditto. (WebCore::MediaSessionCoordinator::pause): Ditto. (WebCore::MediaSessionCoordinator::setTrack): Ditto. (WebCore::MediaSessionCoordinator::positionStateChanged): (WebCore::MediaSessionCoordinator::playbackStateChanged): (WebCore::MediaSessionCoordinator::readyStateChanged): Do nothing unless state is 'joined'. Improve logging. (WebCore::MediaSessionCoordinator::seekSessionToTime): Ditto. (WebCore::MediaSessionCoordinator::playSession): Ditto. (WebCore::MediaSessionCoordinator::pauseSession): Ditto. (WebCore::MediaSessionCoordinator::setSessionTrack): Ditto. * Modules/mediasession/MediaSessionCoordinator.h: (WebCore::MediaSessionCoordinator::identifier const): (WebCore::MediaSessionCoordinator::state const): * Modules/mediasession/MediaSessionCoordinator.idl: * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Fix Conditional. * Modules/mediasession/MediaSessionCoordinatorPrivate.h: Declare new required methods. * Modules/mediasession/MediaSessionCoordinatorState.h: Define states. * Modules/mediasession/MediaSessionCoordinatorState.idl: * Modules/mediasession/MediaSessionPlaylistMixin.idl: Fix Conditional. * Sources.txt: Add JSMediaSessionCoordinatorState.cpp. * WebCore.xcodeproj/project.pbxproj: * testing/MockMediaSessionCoordinator.cpp: (WebCore::MockMediaSessionCoordinator::join): (WebCore::MockMediaSessionCoordinator::leave): (WebCore::MockMediaSessionCoordinator::coordinatorStateChanged): * testing/MockMediaSessionCoordinator.h: Source/WebKit: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::join): (WebKit::RemoteMediaSessionCoordinatorProxy::leave): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::join): (WebKit::RemoteMediaSessionCoordinator::leave): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: LayoutTests: * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275314 268f45cc-cd09-0410-ab3c-d52691b4dbfc Canonical link: https://commits.webkit.org/235995@main
2021-03-31 23:11:14 +00:00
EXPECTED (latestChange == '') OK
EXPECTED (navigator.mediaSession.readyState == 'havefuturedata') OK
[macOS] MediaSessionCoordinator should have join and leave methods https://bugs.webkit.org/show_bug.cgi?id=223955 <rdar://problem/76021588> Reviewed by Jer Noble. Source/WebCore: Add 'join' and 'leave' methods to MediaSessionCoordinator so a page has to opt-in to participating in a coordinated session and can leave at any time. Don't have the coordinator automatically call session methods when the private coordinator finishes, just signal the promise and let the page handle it. No new tests, updated media/media-session/mock-coordinator.html. * CMakeLists.txt: * DerivedSources-input.xcfilelist: * DerivedSources-output.xcfilelist: * DerivedSources.make: * Modules/mediasession/MediaMetadata.idl: Fix Conditional. * Modules/mediasession/MediaMetadataPlaylistMixin.idl: Ditto. * Modules/mediasession/MediaPositionState.h: Add logging template. (WTF::LogArgument<WebCore::MediaPositionState>::toString): * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Switch from beging a ContextDestructionObserver to an ActiveDOMObject to the wrapper won't be collected while an event dispatch is pending. (WebCore::MediaSession::virtualHasPendingActivity const): Prevent collection while event dispatch is pending. (WebCore::MediaSession::setPositionState): Improve logging. (WebCore::MediaPositionState::toJSONString const): * Modules/mediasession/MediaSession.h: * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::join): New. (WebCore::MediaSessionCoordinator::leave): New. (WebCore::MediaSessionCoordinator::seekTo): Reject unless state is 'joined'. Don't call session method. (WebCore::MediaSessionCoordinator::play): Ditto. (WebCore::MediaSessionCoordinator::pause): Ditto. (WebCore::MediaSessionCoordinator::setTrack): Ditto. (WebCore::MediaSessionCoordinator::positionStateChanged): (WebCore::MediaSessionCoordinator::playbackStateChanged): (WebCore::MediaSessionCoordinator::readyStateChanged): Do nothing unless state is 'joined'. Improve logging. (WebCore::MediaSessionCoordinator::seekSessionToTime): Ditto. (WebCore::MediaSessionCoordinator::playSession): Ditto. (WebCore::MediaSessionCoordinator::pauseSession): Ditto. (WebCore::MediaSessionCoordinator::setSessionTrack): Ditto. * Modules/mediasession/MediaSessionCoordinator.h: (WebCore::MediaSessionCoordinator::identifier const): (WebCore::MediaSessionCoordinator::state const): * Modules/mediasession/MediaSessionCoordinator.idl: * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Fix Conditional. * Modules/mediasession/MediaSessionCoordinatorPrivate.h: Declare new required methods. * Modules/mediasession/MediaSessionCoordinatorState.h: Define states. * Modules/mediasession/MediaSessionCoordinatorState.idl: * Modules/mediasession/MediaSessionPlaylistMixin.idl: Fix Conditional. * Sources.txt: Add JSMediaSessionCoordinatorState.cpp. * WebCore.xcodeproj/project.pbxproj: * testing/MockMediaSessionCoordinator.cpp: (WebCore::MockMediaSessionCoordinator::join): (WebCore::MockMediaSessionCoordinator::leave): (WebCore::MockMediaSessionCoordinator::coordinatorStateChanged): * testing/MockMediaSessionCoordinator.h: Source/WebKit: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::join): (WebKit::RemoteMediaSessionCoordinatorProxy::leave): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::join): (WebKit::RemoteMediaSessionCoordinator::leave): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: LayoutTests: * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275314 268f45cc-cd09-0410-ab3c-d52691b4dbfc Canonical link: https://commits.webkit.org/235995@main
2021-03-31 23:11:14 +00:00
EXPECTED (navigator.mediaSession.readyState == 'havefuturedata') OK
RUN(navigator.mediaSession.readyState = 'haveenoughdata')
[macOS] MediaSessionCoordinator should have join and leave methods https://bugs.webkit.org/show_bug.cgi?id=223955 <rdar://problem/76021588> Reviewed by Jer Noble. Source/WebCore: Add 'join' and 'leave' methods to MediaSessionCoordinator so a page has to opt-in to participating in a coordinated session and can leave at any time. Don't have the coordinator automatically call session methods when the private coordinator finishes, just signal the promise and let the page handle it. No new tests, updated media/media-session/mock-coordinator.html. * CMakeLists.txt: * DerivedSources-input.xcfilelist: * DerivedSources-output.xcfilelist: * DerivedSources.make: * Modules/mediasession/MediaMetadata.idl: Fix Conditional. * Modules/mediasession/MediaMetadataPlaylistMixin.idl: Ditto. * Modules/mediasession/MediaPositionState.h: Add logging template. (WTF::LogArgument<WebCore::MediaPositionState>::toString): * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Switch from beging a ContextDestructionObserver to an ActiveDOMObject to the wrapper won't be collected while an event dispatch is pending. (WebCore::MediaSession::virtualHasPendingActivity const): Prevent collection while event dispatch is pending. (WebCore::MediaSession::setPositionState): Improve logging. (WebCore::MediaPositionState::toJSONString const): * Modules/mediasession/MediaSession.h: * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::join): New. (WebCore::MediaSessionCoordinator::leave): New. (WebCore::MediaSessionCoordinator::seekTo): Reject unless state is 'joined'. Don't call session method. (WebCore::MediaSessionCoordinator::play): Ditto. (WebCore::MediaSessionCoordinator::pause): Ditto. (WebCore::MediaSessionCoordinator::setTrack): Ditto. (WebCore::MediaSessionCoordinator::positionStateChanged): (WebCore::MediaSessionCoordinator::playbackStateChanged): (WebCore::MediaSessionCoordinator::readyStateChanged): Do nothing unless state is 'joined'. Improve logging. (WebCore::MediaSessionCoordinator::seekSessionToTime): Ditto. (WebCore::MediaSessionCoordinator::playSession): Ditto. (WebCore::MediaSessionCoordinator::pauseSession): Ditto. (WebCore::MediaSessionCoordinator::setSessionTrack): Ditto. * Modules/mediasession/MediaSessionCoordinator.h: (WebCore::MediaSessionCoordinator::identifier const): (WebCore::MediaSessionCoordinator::state const): * Modules/mediasession/MediaSessionCoordinator.idl: * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Fix Conditional. * Modules/mediasession/MediaSessionCoordinatorPrivate.h: Declare new required methods. * Modules/mediasession/MediaSessionCoordinatorState.h: Define states. * Modules/mediasession/MediaSessionCoordinatorState.idl: * Modules/mediasession/MediaSessionPlaylistMixin.idl: Fix Conditional. * Sources.txt: Add JSMediaSessionCoordinatorState.cpp. * WebCore.xcodeproj/project.pbxproj: * testing/MockMediaSessionCoordinator.cpp: (WebCore::MockMediaSessionCoordinator::join): (WebCore::MockMediaSessionCoordinator::leave): (WebCore::MockMediaSessionCoordinator::coordinatorStateChanged): * testing/MockMediaSessionCoordinator.h: Source/WebKit: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::join): (WebKit::RemoteMediaSessionCoordinatorProxy::leave): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::join): (WebKit::RemoteMediaSessionCoordinator::leave): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: LayoutTests: * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275314 268f45cc-cd09-0410-ab3c-d52691b4dbfc Canonical link: https://commits.webkit.org/235995@main
2021-03-31 23:11:14 +00:00
EXPECTED (latestChange == '') OK
EXPECTED (navigator.mediaSession.readyState == 'haveenoughdata') OK
[macOS] MediaSessionCoordinator should have join and leave methods https://bugs.webkit.org/show_bug.cgi?id=223955 <rdar://problem/76021588> Reviewed by Jer Noble. Source/WebCore: Add 'join' and 'leave' methods to MediaSessionCoordinator so a page has to opt-in to participating in a coordinated session and can leave at any time. Don't have the coordinator automatically call session methods when the private coordinator finishes, just signal the promise and let the page handle it. No new tests, updated media/media-session/mock-coordinator.html. * CMakeLists.txt: * DerivedSources-input.xcfilelist: * DerivedSources-output.xcfilelist: * DerivedSources.make: * Modules/mediasession/MediaMetadata.idl: Fix Conditional. * Modules/mediasession/MediaMetadataPlaylistMixin.idl: Ditto. * Modules/mediasession/MediaPositionState.h: Add logging template. (WTF::LogArgument<WebCore::MediaPositionState>::toString): * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Switch from beging a ContextDestructionObserver to an ActiveDOMObject to the wrapper won't be collected while an event dispatch is pending. (WebCore::MediaSession::virtualHasPendingActivity const): Prevent collection while event dispatch is pending. (WebCore::MediaSession::setPositionState): Improve logging. (WebCore::MediaPositionState::toJSONString const): * Modules/mediasession/MediaSession.h: * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::join): New. (WebCore::MediaSessionCoordinator::leave): New. (WebCore::MediaSessionCoordinator::seekTo): Reject unless state is 'joined'. Don't call session method. (WebCore::MediaSessionCoordinator::play): Ditto. (WebCore::MediaSessionCoordinator::pause): Ditto. (WebCore::MediaSessionCoordinator::setTrack): Ditto. (WebCore::MediaSessionCoordinator::positionStateChanged): (WebCore::MediaSessionCoordinator::playbackStateChanged): (WebCore::MediaSessionCoordinator::readyStateChanged): Do nothing unless state is 'joined'. Improve logging. (WebCore::MediaSessionCoordinator::seekSessionToTime): Ditto. (WebCore::MediaSessionCoordinator::playSession): Ditto. (WebCore::MediaSessionCoordinator::pauseSession): Ditto. (WebCore::MediaSessionCoordinator::setSessionTrack): Ditto. * Modules/mediasession/MediaSessionCoordinator.h: (WebCore::MediaSessionCoordinator::identifier const): (WebCore::MediaSessionCoordinator::state const): * Modules/mediasession/MediaSessionCoordinator.idl: * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Fix Conditional. * Modules/mediasession/MediaSessionCoordinatorPrivate.h: Declare new required methods. * Modules/mediasession/MediaSessionCoordinatorState.h: Define states. * Modules/mediasession/MediaSessionCoordinatorState.idl: * Modules/mediasession/MediaSessionPlaylistMixin.idl: Fix Conditional. * Sources.txt: Add JSMediaSessionCoordinatorState.cpp. * WebCore.xcodeproj/project.pbxproj: * testing/MockMediaSessionCoordinator.cpp: (WebCore::MockMediaSessionCoordinator::join): (WebCore::MockMediaSessionCoordinator::leave): (WebCore::MockMediaSessionCoordinator::coordinatorStateChanged): * testing/MockMediaSessionCoordinator.h: Source/WebKit: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::join): (WebKit::RemoteMediaSessionCoordinatorProxy::leave): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::join): (WebKit::RemoteMediaSessionCoordinator::leave): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: LayoutTests: * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275314 268f45cc-cd09-0410-ab3c-d52691b4dbfc Canonical link: https://commits.webkit.org/235995@main
2021-03-31 23:11:14 +00:00
EXPECTED (navigator.mediaSession.readyState == 'haveenoughdata') OK
RUN(navigator.mediaSession.readyState = 'havenothing')
[macOS] MediaSessionCoordinator should have join and leave methods https://bugs.webkit.org/show_bug.cgi?id=223955 <rdar://problem/76021588> Reviewed by Jer Noble. Source/WebCore: Add 'join' and 'leave' methods to MediaSessionCoordinator so a page has to opt-in to participating in a coordinated session and can leave at any time. Don't have the coordinator automatically call session methods when the private coordinator finishes, just signal the promise and let the page handle it. No new tests, updated media/media-session/mock-coordinator.html. * CMakeLists.txt: * DerivedSources-input.xcfilelist: * DerivedSources-output.xcfilelist: * DerivedSources.make: * Modules/mediasession/MediaMetadata.idl: Fix Conditional. * Modules/mediasession/MediaMetadataPlaylistMixin.idl: Ditto. * Modules/mediasession/MediaPositionState.h: Add logging template. (WTF::LogArgument<WebCore::MediaPositionState>::toString): * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Switch from beging a ContextDestructionObserver to an ActiveDOMObject to the wrapper won't be collected while an event dispatch is pending. (WebCore::MediaSession::virtualHasPendingActivity const): Prevent collection while event dispatch is pending. (WebCore::MediaSession::setPositionState): Improve logging. (WebCore::MediaPositionState::toJSONString const): * Modules/mediasession/MediaSession.h: * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::join): New. (WebCore::MediaSessionCoordinator::leave): New. (WebCore::MediaSessionCoordinator::seekTo): Reject unless state is 'joined'. Don't call session method. (WebCore::MediaSessionCoordinator::play): Ditto. (WebCore::MediaSessionCoordinator::pause): Ditto. (WebCore::MediaSessionCoordinator::setTrack): Ditto. (WebCore::MediaSessionCoordinator::positionStateChanged): (WebCore::MediaSessionCoordinator::playbackStateChanged): (WebCore::MediaSessionCoordinator::readyStateChanged): Do nothing unless state is 'joined'. Improve logging. (WebCore::MediaSessionCoordinator::seekSessionToTime): Ditto. (WebCore::MediaSessionCoordinator::playSession): Ditto. (WebCore::MediaSessionCoordinator::pauseSession): Ditto. (WebCore::MediaSessionCoordinator::setSessionTrack): Ditto. * Modules/mediasession/MediaSessionCoordinator.h: (WebCore::MediaSessionCoordinator::identifier const): (WebCore::MediaSessionCoordinator::state const): * Modules/mediasession/MediaSessionCoordinator.idl: * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Fix Conditional. * Modules/mediasession/MediaSessionCoordinatorPrivate.h: Declare new required methods. * Modules/mediasession/MediaSessionCoordinatorState.h: Define states. * Modules/mediasession/MediaSessionCoordinatorState.idl: * Modules/mediasession/MediaSessionPlaylistMixin.idl: Fix Conditional. * Sources.txt: Add JSMediaSessionCoordinatorState.cpp. * WebCore.xcodeproj/project.pbxproj: * testing/MockMediaSessionCoordinator.cpp: (WebCore::MockMediaSessionCoordinator::join): (WebCore::MockMediaSessionCoordinator::leave): (WebCore::MockMediaSessionCoordinator::coordinatorStateChanged): * testing/MockMediaSessionCoordinator.h: Source/WebKit: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::join): (WebKit::RemoteMediaSessionCoordinatorProxy::leave): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::join): (WebKit::RemoteMediaSessionCoordinator::leave): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: LayoutTests: * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275314 268f45cc-cd09-0410-ab3c-d52691b4dbfc Canonical link: https://commits.webkit.org/235995@main
2021-03-31 23:11:14 +00:00
EXPECTED (latestChange == '') OK
EXPECTED (navigator.mediaSession.readyState == 'havenothing') OK
[macOS] MediaSessionCoordinator should have join and leave methods https://bugs.webkit.org/show_bug.cgi?id=223955 <rdar://problem/76021588> Reviewed by Jer Noble. Source/WebCore: Add 'join' and 'leave' methods to MediaSessionCoordinator so a page has to opt-in to participating in a coordinated session and can leave at any time. Don't have the coordinator automatically call session methods when the private coordinator finishes, just signal the promise and let the page handle it. No new tests, updated media/media-session/mock-coordinator.html. * CMakeLists.txt: * DerivedSources-input.xcfilelist: * DerivedSources-output.xcfilelist: * DerivedSources.make: * Modules/mediasession/MediaMetadata.idl: Fix Conditional. * Modules/mediasession/MediaMetadataPlaylistMixin.idl: Ditto. * Modules/mediasession/MediaPositionState.h: Add logging template. (WTF::LogArgument<WebCore::MediaPositionState>::toString): * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Switch from beging a ContextDestructionObserver to an ActiveDOMObject to the wrapper won't be collected while an event dispatch is pending. (WebCore::MediaSession::virtualHasPendingActivity const): Prevent collection while event dispatch is pending. (WebCore::MediaSession::setPositionState): Improve logging. (WebCore::MediaPositionState::toJSONString const): * Modules/mediasession/MediaSession.h: * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionCoordinator.cpp: (WebCore::MediaSessionCoordinator::join): New. (WebCore::MediaSessionCoordinator::leave): New. (WebCore::MediaSessionCoordinator::seekTo): Reject unless state is 'joined'. Don't call session method. (WebCore::MediaSessionCoordinator::play): Ditto. (WebCore::MediaSessionCoordinator::pause): Ditto. (WebCore::MediaSessionCoordinator::setTrack): Ditto. (WebCore::MediaSessionCoordinator::positionStateChanged): (WebCore::MediaSessionCoordinator::playbackStateChanged): (WebCore::MediaSessionCoordinator::readyStateChanged): Do nothing unless state is 'joined'. Improve logging. (WebCore::MediaSessionCoordinator::seekSessionToTime): Ditto. (WebCore::MediaSessionCoordinator::playSession): Ditto. (WebCore::MediaSessionCoordinator::pauseSession): Ditto. (WebCore::MediaSessionCoordinator::setSessionTrack): Ditto. * Modules/mediasession/MediaSessionCoordinator.h: (WebCore::MediaSessionCoordinator::identifier const): (WebCore::MediaSessionCoordinator::state const): * Modules/mediasession/MediaSessionCoordinator.idl: * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Fix Conditional. * Modules/mediasession/MediaSessionCoordinatorPrivate.h: Declare new required methods. * Modules/mediasession/MediaSessionCoordinatorState.h: Define states. * Modules/mediasession/MediaSessionCoordinatorState.idl: * Modules/mediasession/MediaSessionPlaylistMixin.idl: Fix Conditional. * Sources.txt: Add JSMediaSessionCoordinatorState.cpp. * WebCore.xcodeproj/project.pbxproj: * testing/MockMediaSessionCoordinator.cpp: (WebCore::MockMediaSessionCoordinator::join): (WebCore::MockMediaSessionCoordinator::leave): (WebCore::MockMediaSessionCoordinator::coordinatorStateChanged): * testing/MockMediaSessionCoordinator.h: Source/WebKit: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::join): (WebKit::RemoteMediaSessionCoordinatorProxy::leave): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::join): (WebKit::RemoteMediaSessionCoordinator::leave): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Renamed from Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h. * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: (WebKit::RemoteMediaSessionCoordinatorProxy::create): (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.messages.in: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::createMediaSessionCoordinator): * UIProcess/WebPageProxy.h: * WebKit.xcodeproj/project.pbxproj: * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: (WebKit::RemoteMediaSessionCoordinator::create): (WebKit::RemoteMediaSessionCoordinator::RemoteMediaSessionCoordinator): (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::createMediaSessionCoordinator): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: LayoutTests: * media/media-session/mock-coordinator-expected.txt: * media/media-session/mock-coordinator.html: git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275314 268f45cc-cd09-0410-ab3c-d52691b4dbfc Canonical link: https://commits.webkit.org/235995@main
2021-03-31 23:11:14 +00:00
* PlaybackState
EXPECTED (navigator.mediaSession.playbackState == 'none') OK
RUN(navigator.mediaSession.playbackState = 'paused')
EXPECTED (latestChange == '') OK
EXPECTED (navigator.mediaSession.playbackState == 'paused') OK
EXPECTED (navigator.mediaSession.playbackState == 'paused') OK
RUN(navigator.mediaSession.playbackState = 'playing')
EXPECTED (latestChange == '') OK
EXPECTED (navigator.mediaSession.playbackState == 'playing') OK
EXPECTED (navigator.mediaSession.playbackState == 'playing') OK
RUN(navigator.mediaSession.playbackState = 'none')
EXPECTED (latestChange == '') OK
EXPECTED (navigator.mediaSession.playbackState == 'none') OK
** It should not be possible to join or leave a closed session
RUN(promise = navigator.mediaSession.coordinator.join())
Promise rejected correctly OK
TEST(navigator.mediaSession.coordinator.leave()) THROWS(InvalidStateError: Unable to leave when state is closed) OK
[Cocoa] Add Experimental MediaSession coordinator https://bugs.webkit.org/show_bug.cgi?id=222158 <rdar://problem/74508862> Reviewed by Jer Noble. Source/WebCore: Add an experimental MediaSession coordinator, an object that provides an interface that allows script to coordinate changes to MediaSession with the User Agent. Also add an experimental MediaSession playlist interface. The changes are behind new experimental feature flags, MediaSessionCoordinatorEnabled and MediaSessionPlaylistEnabled. Test: media/media-session/mock-coordinator.html * DerivedSources-input.xcfilelist: Add new IDL files. * DerivedSources-output.xcfilelist: Add new derived sources. * DerivedSources.make: Add new IDL. * Modules/mediasession/MediaMetadata.cpp: (WebCore::MediaMetadata::create): Set trackIdentifier from init data. (WebCore::MediaMetadata::setTrackIdentifier): trackIdentifier setter. * Modules/mediasession/MediaMetadata.h: (WebCore::MediaMetadata::trackIdentifier const): * Modules/mediasession/MediaMetadata.idl: * Modules/mediasession/MediaMetadataInit.h: Add trackIdentifier. (WebCore::MediaMetadataInit::encode const): (WebCore::MediaMetadataInit::decode): * Modules/mediasession/MediaMetadataInit.idl: * Modules/mediasession/MediaSession.cpp: (WebCore::MediaSession::MediaSession): Initialize MainThreadGenericEventQueue. (WebCore::MediaSession::setMetadata): metadataUpdated -> notifyMetadataObservers. (WebCore::MediaSession::setReadyState): Session readyState setter. (WebCore::MediaSession::setCoordinator): Coordinator setter. Post 'coordinatorchange' event after change. (WebCore::MediaSession::setPlaylist): Playlist setter. (WebCore::MediaSession::setActionHandler): Call notifyActionHandlerObservers. (WebCore::MediaSession::setPositionState): Call notifyPositionStateObservers. (WebCore::MediaSession::metadataUpdated): Call notifyMetadataObservers. (WebCore::MediaSession::addObserver): New. (WebCore::MediaSession::removeObserver): New. (WebCore::MediaSession::forEachObserver): New. (WebCore::MediaSession::notifyMetadataObservers): New. (WebCore::MediaSession::notifyPositionStateObservers): New. (WebCore::MediaSession::notifyPlaybackStateObservers): New. (WebCore::MediaSession::notifyActionHandlerObservers): New. (WebCore::MediaSession::notifyReadyStateObservers): New. * Modules/mediasession/MediaSession.h: (WebCore::MediaSession::coordinator const): (WebCore::MediaSession::playlist const): (WebCore::MediaSession::logger const): * Modules/mediasession/MediaSession.idl: * Modules/mediasession/MediaSessionAction.h: * Modules/mediasession/MediaSessionAction.idl: * Modules/mediasession/MediaSessionActionDetails.h: * Modules/mediasession/MediaSessionActionDetails.idl: MediaSessionCoordinator proxies calls through the PlatformMediaSessionCoordinator, and then calls the equivalent MediaSession methode if the platform coordinator is successful. * Modules/mediasession/MediaSessionCoordinator.cpp: Added. (WebCore::nextCoordinatorLogIdentifier): (WebCore::MediaSessionCoordinator::create): (WebCore::MediaSessionCoordinator::MediaSessionCoordinator): (WebCore::MediaSessionCoordinator::seekTo): (WebCore::MediaSessionCoordinator::play): (WebCore::MediaSessionCoordinator::pause): (WebCore::MediaSessionCoordinator::setTrack): (WebCore::MediaSessionCoordinator::setMediaSession): (WebCore::MediaSessionCoordinator::logChannel): * Modules/mediasession/MediaSessionCoordinator.h: New. (WebCore::MediaSessionCoordinator::logger const): (WebCore::MediaSessionCoordinator::logIdentifier const): (WebCore::MediaSessionCoordinator::logClassName): * Modules/mediasession/MediaSessionCoordinator.idl: New. * Modules/mediasession/NavigatorMediaSession.h: * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * bindings/js/WebCoreBuiltinNames.h: * dom/EventNames.h: * dom/EventTargetFactory.in: * platform/graphics/PlatformMediaSessionCoordinator.h: Added. (WebCore::PlatformMediaSessionCoordinator::setLogger): (WebCore::PlatformMediaSessionCoordinator::loggerPtr const): (WebCore::PlatformMediaSessionCoordinator::logIdentifier const): (WebCore::PlatformMediaSessionCoordinator::logClassName const): (WebCore::PlatformMediaSessionCoordinator::logChannel const): * testing/Internals.cpp: (WebCore::Internals::registerMockMediaSessionCoordinator): Register the mock media session coordinator for testing. * testing/Internals.h: * testing/Internals.idl: * testing/MockMediaSessionCoordinator.cpp: Added. (WebCore::MockMediaSessionCoordinator::create): (WebCore::MockMediaSessionCoordinator::MockMediaSessionCoordinator): (WebCore::MockMediaSessionCoordinator::seekTo): (WebCore::MockMediaSessionCoordinator::play): (WebCore::MockMediaSessionCoordinator::pause): (WebCore::MockMediaSessionCoordinator::setTrack): * testing/MockMediaSessionCoordinator.h: New. Source/WTF: * Scripts/Preferences/WebPreferencesExperimental.yaml: * wtf/PlatformEnableCocoa.h: LayoutTests: * platform/TestExpectations: * media/media-session/mock-coordinator-expected.txt: Added. * media/media-session/mock-coordinator.html: Added. Canonical link: https://commits.webkit.org/235728@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@274983 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-03-24 23:14:51 +00:00
END OF TEST