Changeset 278336 in webkit
- Timestamp:
- Jun 1, 2021, 6:20:38 PM (5 years ago)
- Location:
- trunk
- Files:
-
- 20 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/imported/w3c/ChangeLog (modified) (1 diff)
-
LayoutTests/imported/w3c/web-platform-tests/mediasession/idlharness.window-expected.txt (modified) (1 diff)
-
LayoutTests/media/media-session/mock-coordinator-expected.txt (modified) (3 diffs)
-
LayoutTests/media/media-session/mock-coordinator.html (modified) (5 diffs)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/Modules/mediasession/MediaSession.cpp (modified) (6 diffs)
-
Source/WebCore/Modules/mediasession/MediaSession.h (modified) (6 diffs)
-
Source/WebCore/Modules/mediasession/MediaSession.idl (modified) (1 diff)
-
Source/WebCore/Modules/mediasession/MediaSessionCoordinator.cpp (modified) (7 diffs)
-
Source/WebCore/Modules/mediasession/MediaSessionCoordinator.h (modified) (4 diffs)
-
Source/WebCore/Modules/mediasession/MediaSessionCoordinator.idl (modified) (2 diffs)
-
Source/WebCore/Modules/mediasession/MediaSessionCoordinatorMixin.idl (modified) (1 diff)
-
Source/WebCore/dom/EventNames.h (modified) (1 diff)
-
Source/WebCore/dom/EventTargetFactory.in (modified) (1 diff)
-
Source/WebCore/page/Page.cpp (modified) (2 diffs)
-
Source/WebCore/testing/Internals.cpp (modified) (1 diff)
-
Tools/ChangeLog (modified) (1 diff)
-
Tools/TestWebKitAPI/Tests/WebKit/MediaSessionCoordinatorTest.mm (modified) (2 diffs)
-
Tools/TestWebKitAPI/Tests/WebKitCocoa/media-remote.html (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r278329 r278336 1 2021-06-01 Jean-Yves Avenard <jya@apple.com> 2 3 MediaSession.coordinator should not be optional, relying on coordinator readyState change instead 4 https://bugs.webkit.org/show_bug.cgi?id=226328 5 rdar://77461335 6 7 Reviewed by Eric Carlson. 8 9 * media/media-session/mock-coordinator-expected.txt: 10 * media/media-session/mock-coordinator.html: Change test to match new API. 11 1 12 2021-06-01 Chris Dumez <cdumez@apple.com> 2 13 -
trunk/LayoutTests/imported/w3c/ChangeLog
r278299 r278336 1 2021-06-01 Jean-Yves Avenard <jya@apple.com> 2 3 MediaSession.coordinator should not be optional, relying on coordinator state change instead 4 https://bugs.webkit.org/show_bug.cgi?id=226328 5 rdar://77461335 6 7 Reviewed by Eric Carlson. 8 9 * web-platform-tests/mediasession/idlharness.window-expected.txt: 10 1 11 2021-06-01 Cathie Chen <cathiechen@igalia.com> 2 12 -
trunk/LayoutTests/imported/w3c/web-platform-tests/mediasession/idlharness.window-expected.txt
r274983 r278336 13 13 PASS Navigator includes NavigatorPlugins: member names are unique 14 14 PASS Navigator includes NavigatorConcurrentHardware: member names are unique 15 FAIL MediaSession interface: existence and properties of interface object assert_equals: prototype of self's property "MediaSession" is not Function.prototype expected function "function () { 16 [native code] 17 }" but got function "function EventTarget() { 18 [native code] 19 }" 15 PASS MediaSession interface: existence and properties of interface object 20 16 PASS MediaSession interface object length 21 17 PASS MediaSession interface object name 22 FAIL MediaSession interface: existence and properties of interface prototype object assert_equals: prototype of MediaSession.prototype is not Object.prototype expected object "[object Object]" but got object "[object EventTarget]" 18 PASS MediaSession interface: existence and properties of interface prototype object 23 19 PASS MediaSession interface: existence and properties of interface prototype object's "constructor" property 24 20 PASS MediaSession interface: existence and properties of interface prototype object's @@unscopables property -
trunk/LayoutTests/media/media-session/mock-coordinator-expected.txt
r278143 r278336 1 1 2 ** There should be no mediaSession.coordinatorinitially.3 EXPECTED (navigator.mediaSession.coordinator == 'undefined') OK4 5 ** Test that mediaSession.coordinator change event is fired when it changes.2 ** There mediaSession.coordinator.state should be closed initially. 3 EXPECTED (navigator.mediaSession.coordinator.state == 'closed') OK 4 5 ** Test that mediaSession.coordinator.coordinatorstatechange event is fired when it changes. 6 6 RUN(internals.registerMockMediaSessionCoordinator(changeHandler)) 7 EVENT(coordinatorchange) 8 EXPECTED (navigator.mediaSession.coordinator != 'undefined') OK 9 10 ** navigator.mediaSession.coordinator.state should be "waiting" intitially 7 EVENT(coordinatorstatechange STATE(waiting) 8 9 ** navigator.mediaSession.coordinator.state should be "waiting" initially 11 10 EXPECTED (navigator.mediaSession.coordinator.state == 'waiting') OK 12 11 … … 79 78 RUN(internals.setMockMediaSessionCoordinatorCommandsShouldFail(false)) 80 79 RUN(promise = navigator.mediaSession.coordinator.join()) 80 EVENT(coordinatorstatechange STATE(joined) 81 81 Promise resolved OK 82 82 EXPECTED (navigator.mediaSession.coordinator.state == 'joined') OK 83 EXPECTED (latestChange == 'coordinatorStateChanged') OK84 83 85 84 ** Test that when coordinator methods succeed, promises resolve and mediaSession action handlers are called. … … 150 149 ** Leave the session 151 150 RUN(navigator.mediaSession.coordinator.leave()) 151 EXPECTED (latestChange == 'playbackStateChanged') OK 152 EXPECTED (latestChange == 'playbackStateChanged') OK 153 EXPECTED (latestChange == 'playbackStateChanged') OK 154 EVENT(coordinatorstatechange STATE(closed) 152 155 EXPECTED (navigator.mediaSession.coordinator.state == 'closed') OK 153 EXPECTED (latestChange == 'coordinatorStateChanged') OK154 156 155 157 ** Test that when coordinator methods fail and promises reject after mediaSession.leave() has been called. -
trunk/LayoutTests/media/media-session/mock-coordinator.html
r278143 r278336 34 34 let changePromise = () => { 35 35 return new Promise(resolve => { 36 navigator.mediaSession. addEventListener('coordinatorchange', (event) => {37 consoleWrite(`EVENT(${event.type} )`);36 navigator.mediaSession.coordinator.addEventListener('coordinatorstatechange', (event) => { 37 consoleWrite(`EVENT(${event.type} STATE(${navigator.mediaSession.coordinator.state})`); 38 38 resolve(); 39 } );39 }, { once: true }); 40 40 }); 41 41 } … … 44 44 45 45 consoleWrite(''); 46 consoleWrite('** There should be no mediaSession.coordinator initially.')47 48 testExpected('navigator.mediaSession.coordinator ', undefined);49 50 consoleWrite(''); 51 consoleWrite('** Test that mediaSession.coordinator change event is fired when it changes.')46 consoleWrite('** There mediaSession.coordinator.state should be closed initially.'); 47 48 testExpected('navigator.mediaSession.coordinator.state', "closed"); 49 50 consoleWrite(''); 51 consoleWrite('** Test that mediaSession.coordinator.coordinatorstatechange event is fired when it changes.'); 52 52 53 53 run('internals.registerMockMediaSessionCoordinator(changeHandler)'); 54 54 55 55 await changePromise(); 56 57 testExpected('navigator.mediaSession.coordinator', undefined, '!=');58 56 59 57 ['play', 'pause', 'seekto'].forEach(action => { … … 121 119 // Before joining 122 120 consoleWrite(''); 123 consoleWrite('** navigator.mediaSession.coordinator.state should be "waiting" in titially')121 consoleWrite('** navigator.mediaSession.coordinator.state should be "waiting" initially') 124 122 testExpected('navigator.mediaSession.coordinator.state', 'waiting'); 125 123 … … 160 158 run('internals.setMockMediaSessionCoordinatorCommandsShouldFail(false)'); 161 159 run('promise = navigator.mediaSession.coordinator.join()'); 160 await changePromise(); 162 161 await shouldResolve(promise).then(() => { }).catch(() => { }); 163 162 testExpected('navigator.mediaSession.coordinator.state', 'joined'); 164 testExpected('latestChange', 'coordinatorStateChanged');165 163 166 164 consoleWrite(''); … … 190 188 consoleWrite('** Leave the session') 191 189 run('navigator.mediaSession.coordinator.leave()'); 190 await changePromise(); 192 191 testExpected('navigator.mediaSession.coordinator.state', 'closed'); 193 await testExpectedEventually('latestChange', 'coordinatorStateChanged', '==', 100); 192 194 193 latestChange = ''; 195 194 -
trunk/Source/WebCore/ChangeLog
r278333 r278336 1 2021-06-01 Jean-Yves Avenard <jya@apple.com> 2 3 MediaSession.coordinator should not be optional, relying on coordinator state change instead 4 https://bugs.webkit.org/show_bug.cgi?id=226328 5 rdar://77461335 6 7 Reviewed by Eric Carlson. 8 9 The coordinator was a read-only optional attribute of the MediaSession element. 10 Testing if the attribute was to be used to determine if a MediaSessionCoordinator 11 was now available and for the MediaSession to join it. This made the use of an external 12 polyfill difficult and enforcing the validity of an user created custom 13 MediaSessionCoordinator due to IDL semantics limitations hard. 14 We instead always create a MediaSessionCoordinator which in its default state is Closed. 15 Once this state is changed to Waiting and an event is fire the MediaSession can now 16 join it. 17 18 * Modules/mediasession/MediaSession.cpp: 19 (WebCore::MediaSession::MediaSession): MediaSession no longer needs to fire event. 20 Remove no longer necessary inheritance and async event queue. 21 (WebCore::MediaSession::create): Drive-by fix, don't call suspendIfNeeded() in the constructor. 22 (WebCore::MediaSession::createCoordinator): Make method private. 23 * Modules/mediasession/MediaSession.h: 24 (WebCore::MediaSession::coordinator const): MediaSessionCoordinator always exists. Return reference instead. 25 * Modules/mediasession/MediaSession.idl: Amend definition, remove EventHandler 26 * Modules/mediasession/MediaSessionCoordinator.cpp: 27 (WebCore::MediaSessionCoordinator::create): 28 (WebCore::MediaSessionCoordinator::MediaSessionCoordinator): 29 (WebCore::MediaSessionCoordinator::setMediaSessionCoordinatorPrivate): 30 (WebCore::MediaSessionCoordinator::virtualHasPendingActivity const): 31 (WebCore::MediaSessionCoordinator::join): 32 (WebCore::MediaSessionCoordinator::close): 33 (WebCore::MediaSessionCoordinator::coordinatorStateChanged): 34 * Modules/mediasession/MediaSessionCoordinator.h: 35 * Modules/mediasession/MediaSessionCoordinator.idl: Added new EventHandler attribute. 36 * Modules/mediasession/MediaSessionCoordinatorMixin.idl: Update for new API definition. 37 * dom/EventNames.h: 38 * dom/EventTargetFactory.in: 39 * page/Page.cpp: 40 (WebCore::Page::setMediaSessionCoordinator): 41 (WebCore::Page::invalidateMediaSessionCoordinator): 42 * testing/Internals.cpp: 43 (WebCore::Internals::registerMockMediaSessionCoordinator): 44 1 45 2021-06-01 Chris Dumez <cdumez@apple.com> 2 46 -
trunk/Source/WebCore/Modules/mediasession/MediaSession.cpp
r278253 r278336 129 129 Ref<MediaSession> MediaSession::create(Navigator& navigator) 130 130 { 131 return adoptRef(*new MediaSession(navigator)); 131 auto session = adoptRef(*new MediaSession(navigator)); 132 session->suspendIfNeeded(); 133 return session; 132 134 } 133 135 … … 135 137 : ActiveDOMObject(navigator.scriptExecutionContext()) 136 138 , m_navigator(makeWeakPtr(navigator)) 137 , m_asyncEventQueue(MainThreadGenericEventQueue::create(*this))138 139 { 139 140 m_logger = makeRefPtr(Document::sharedLogger()); … … 142 143 #if ENABLE(MEDIA_SESSION_COORDINATOR) 143 144 auto* frame = navigator.frame(); 144 if (auto* page = frame ? frame->page() : nullptr) { 145 if (auto coordinatorPrivate = page->mediaSessionCoordinator()) 146 createCoordinator(*coordinatorPrivate); 147 } 148 #endif 149 150 suspendIfNeeded(); 145 if (auto* page = frame ? frame->page() : nullptr) 146 createCoordinator(page->mediaSessionCoordinator()); 147 #endif 151 148 152 149 ALWAYS_LOG(LOGIDENTIFIER); … … 154 151 155 152 MediaSession::~MediaSession() = default; 156 157 bool MediaSession::virtualHasPendingActivity() const158 {159 return m_asyncEventQueue->hasPendingActivity();160 }161 153 162 154 void MediaSession::suspend(ReasonForSuspension reason) … … 201 193 } 202 194 203 void MediaSession::createCoordinator( Ref<MediaSessionCoordinatorPrivate>&&coordinatorPrivate)195 void MediaSession::createCoordinator(MediaSessionCoordinatorPrivate* coordinatorPrivate) 204 196 { 205 197 ALWAYS_LOG(LOGIDENTIFIER); … … 208 200 m_coordinator->setMediaSession(nullptr); 209 201 210 m_coordinator = MediaSessionCoordinator::create(WTFMove(coordinatorPrivate)); 211 212 if (m_coordinator) 213 m_coordinator->setMediaSession(this); 214 215 m_asyncEventQueue->enqueueEvent(Event::create(eventNames().coordinatorchangeEvent, Event::CanBubble::No, Event::IsCancelable::No)); 202 m_coordinator = MediaSessionCoordinator::create(scriptExecutionContext(), coordinatorPrivate); 203 m_coordinator->setMediaSession(this); 216 204 } 217 205 #endif -
trunk/Source/WebCore/Modules/mediasession/MediaSession.h
r278253 r278336 29 29 30 30 #include "ActiveDOMObject.h" 31 #include "EventTarget.h" 32 #include "GenericEventQueue.h" 31 #include "ExceptionOr.h" 33 32 #include "MediaPositionState.h" 34 33 #include "MediaSessionAction.h" … … 53 52 template<typename> class DOMPromiseDeferred; 54 53 55 class MediaSession : public RefCounted<MediaSession>, public ActiveDOMObject, public EventTargetWithInlineData{54 class MediaSession : public RefCounted<MediaSession>, public ActiveDOMObject, public CanMakeWeakPtr<MediaSession> { 56 55 WTF_MAKE_FAST_ALLOCATED; 57 56 public: … … 81 80 void setReadyState(MediaSessionReadyState); 82 81 83 MediaSessionCoordinator* coordinator() const { return m_coordinator.get(); } 84 WEBCORE_EXPORT void createCoordinator(Ref<MediaSessionCoordinatorPrivate>&&); 82 MediaSessionCoordinator& coordinator() const { return *m_coordinator; } 85 83 #endif 86 84 … … 98 96 99 97 const Logger& logger() const { return *m_logger.get(); } 100 101 // EventTarget102 using RefCounted::ref;103 using RefCounted::deref;104 98 105 99 class Observer : public CanMakeWeakPtr<Observer> { … … 131 125 void notifyReadyStateObservers(); 132 126 133 // EventTarget 134 void refEventTarget() final { ref(); } 135 void derefEventTarget() final { deref(); } 136 EventTargetInterface eventTargetInterface() const final { return MediaSessionEventTargetInterfaceType; } 137 ScriptExecutionContext* scriptExecutionContext() const final { return ContextDestructionObserver::scriptExecutionContext(); } 127 void createCoordinator(MediaSessionCoordinatorPrivate*); 138 128 139 129 // ActiveDOMObject 140 130 const char* activeDOMObjectName() const final { return "MediaSession"; } 141 bool virtualHasPendingActivity() const final;142 131 void suspend(ReasonForSuspension) final; 143 132 void stop() final; … … 156 145 157 146 WeakHashSet<Observer> m_observers; 158 UniqueRef<MainThreadGenericEventQueue> m_asyncEventQueue;159 147 160 148 #if ENABLE(MEDIA_SESSION_COORDINATOR) -
trunk/Source/WebCore/Modules/mediasession/MediaSession.idl
r278222 r278336 29 29 Exposed=Window, 30 30 ExportMacro=WEBCORE_EXPORT, 31 JSGenerateToJSObject, 32 ] interface MediaSession : EventTarget 31 ] interface MediaSession 33 32 { 34 33 attribute MediaMetadata? metadata; -
trunk/Source/WebCore/Modules/mediasession/MediaSessionCoordinator.cpp
r278253 r278336 29 29 #if ENABLE(MEDIA_SESSION_COORDINATOR) 30 30 31 #include "EventNames.h" 31 32 #include "JSDOMException.h" 32 33 #include "JSDOMPromiseDeferred.h" … … 48 49 } 49 50 50 Ref<MediaSessionCoordinator> MediaSessionCoordinator::create(Ref<MediaSessionCoordinatorPrivate>&& privateCoordinator) 51 { 52 return adoptRef(*new MediaSessionCoordinator(WTFMove(privateCoordinator))); 53 } 54 55 MediaSessionCoordinator::MediaSessionCoordinator(Ref<MediaSessionCoordinatorPrivate>&& privateCoordinator) 56 : m_privateCoordinator(WTFMove(privateCoordinator)) 51 Ref<MediaSessionCoordinator> MediaSessionCoordinator::create(ScriptExecutionContext* context, RefPtr<MediaSessionCoordinatorPrivate>&& privateCoordinator) 52 { 53 auto coordinator = adoptRef(*new MediaSessionCoordinator(context, WTFMove(privateCoordinator))); 54 coordinator->suspendIfNeeded(); 55 return coordinator; 56 } 57 58 MediaSessionCoordinator::MediaSessionCoordinator(ScriptExecutionContext* context, RefPtr<MediaSessionCoordinatorPrivate>&& privateCoordinator) 59 : ActiveDOMObject(context) 57 60 , m_logger(makeRef(Document::sharedLogger())) 58 61 , m_logIdentifier(nextCoordinatorLogIdentifier()) 62 , m_asyncEventQueue(MainThreadGenericEventQueue::create(*this)) 59 63 { 60 64 ALWAYS_LOG(LOGIDENTIFIER); 61 65 66 if (privateCoordinator) 67 setMediaSessionCoordinatorPrivate(*privateCoordinator); 68 } 69 70 void MediaSessionCoordinator::setMediaSessionCoordinatorPrivate(Ref<MediaSessionCoordinatorPrivate>&& privateCoordinator) 71 { 72 ALWAYS_LOG(LOGIDENTIFIER); 73 if (m_privateCoordinator) 74 m_privateCoordinator->leave(); 75 m_privateCoordinator = WTFMove(privateCoordinator); 62 76 m_privateCoordinator->setLogger(m_logger.copyRef(), m_logIdentifier); 63 77 m_privateCoordinator->setClient(makeWeakPtr(this)); 78 coordinatorStateChanged(MediaSessionCoordinatorState::Waiting); 64 79 } 65 80 66 81 MediaSessionCoordinator::~MediaSessionCoordinator() = default; 82 83 void MediaSessionCoordinator::eventListenersDidChange() 84 { 85 m_hasCoordinatorsStateChangeEventListener = hasEventListeners(eventNames().coordinatorstatechangeEvent); 86 } 87 88 bool MediaSessionCoordinator::virtualHasPendingActivity() const 89 { 90 // Need to keep the JS wrapper alive as long as it may still fire events in the future. 91 return shouldFireEvents(); 92 } 67 93 68 94 void MediaSessionCoordinator::join(DOMPromiseDeferred<void>&& promise) … … 76 102 return; 77 103 } 104 ASSERT(m_privateCoordinator, "We must be in Waiting state if no private coordinator is set"); 78 105 79 106 m_privateCoordinator->join([protectedThis = makeRefPtr(*this), identifier, promise = WTFMove(promise)] (std::optional<Exception>&& exception) mutable { … … 89 116 } 90 117 91 protectedThis->m_state = MediaSessionCoordinatorState::Joined; 118 protectedThis->coordinatorStateChanged(MediaSessionCoordinatorState::Joined); 119 92 120 promise.resolve(); 93 121 }); … … 108 136 { 109 137 ALWAYS_LOG(LOGIDENTIFIER); 110 m_state = MediaSessionCoordinatorState::Closed;138 coordinatorStateChanged(MediaSessionCoordinatorState::Closed); 111 139 if (!m_privateCoordinator) 112 140 return; … … 382 410 } 383 411 412 bool MediaSessionCoordinator::shouldFireEvents() const 413 { 414 return m_hasCoordinatorsStateChangeEventListener && m_session; 415 } 416 417 384 418 void MediaSessionCoordinator::coordinatorStateChanged(MediaSessionCoordinatorState state) 385 419 { … … 388 422 m_state = state; 389 423 ALWAYS_LOG(LOGIDENTIFIER, m_state); 424 if (shouldFireEvents()) 425 m_asyncEventQueue->enqueueEvent(Event::create(eventNames().coordinatorstatechangeEvent, Event::CanBubble::No, Event::IsCancelable::No)); 390 426 } 391 427 -
trunk/Source/WebCore/Modules/mediasession/MediaSessionCoordinator.h
r278253 r278336 28 28 #if ENABLE(MEDIA_SESSION_COORDINATOR) 29 29 30 #include "ActiveDOMObject.h" 31 #include "EventTarget.h" 32 #include "GenericEventQueue.h" 30 33 #include "MediaSession.h" 31 34 #include "MediaSessionCoordinatorPrivate.h" … … 42 45 : public RefCounted<MediaSessionCoordinator> 43 46 , public MediaSessionCoordinatorClient 44 , public MediaSession::Observer { 47 , public MediaSession::Observer 48 , public ActiveDOMObject 49 , public EventTargetWithInlineData { 50 WTF_MAKE_FAST_ALLOCATED; 45 51 public: 46 WEBCORE_EXPORT static Ref<MediaSessionCoordinator> create( Ref<MediaSessionCoordinatorPrivate>&&);52 WEBCORE_EXPORT static Ref<MediaSessionCoordinator> create(ScriptExecutionContext*, RefPtr<MediaSessionCoordinatorPrivate>&&); 47 53 WEBCORE_EXPORT ~MediaSessionCoordinator(); 54 WEBCORE_EXPORT void setMediaSessionCoordinatorPrivate(Ref<MediaSessionCoordinatorPrivate>&&); 48 55 49 56 void join(DOMPromiseDeferred<void>&&); … … 63 70 using MediaSessionCoordinatorClient::weakPtrFactory; 64 71 using WeakValueType = MediaSessionCoordinatorClient::WeakValueType; 72 using RefCounted::ref; 73 using RefCounted::deref; 65 74 66 75 private: 67 explicit MediaSessionCoordinator(Ref<MediaSessionCoordinatorPrivate>&&); 76 MediaSessionCoordinator(ScriptExecutionContext*, RefPtr<MediaSessionCoordinatorPrivate>&&); 77 78 // EventTarget 79 void refEventTarget() final { ref(); } 80 void derefEventTarget() final { deref(); } 81 EventTargetInterface eventTargetInterface() const final { return MediaSessionCoordinatorEventTargetInterfaceType; } 82 ScriptExecutionContext* scriptExecutionContext() const final { return ContextDestructionObserver::scriptExecutionContext(); } 83 void eventListenersDidChange() final; 84 85 // ActiveDOMObject 86 const char* activeDOMObjectName() const final { return "MediaSessionCoordinator"; } 87 bool virtualHasPendingActivity() const final; 68 88 69 89 // MediaSession::Observer … … 86 106 static WTFLogChannel& logChannel(); 87 107 static const char* logClassName() { return "MediaSessionCoordinator"; } 108 bool shouldFireEvents() const; 88 109 89 110 WeakPtr<MediaSession> m_session; 90 MediaSessionCoordinatorState m_state { MediaSessionCoordinatorState::Waiting };91 111 RefPtr<MediaSessionCoordinatorPrivate> m_privateCoordinator; 92 Ref<const Logger> m_logger;112 const Ref<const Logger> m_logger; 93 113 const void* m_logIdentifier; 114 UniqueRef<MainThreadGenericEventQueue> m_asyncEventQueue; 115 MediaSessionCoordinatorState m_state { MediaSessionCoordinatorState::Closed }; 116 bool m_hasCoordinatorsStateChangeEventListener { false }; 94 117 }; 95 118 -
trunk/Source/WebCore/Modules/mediasession/MediaSessionCoordinator.idl
r275314 r278336 25 25 26 26 [ 27 ActiveDOMObject, 27 28 Conditional=MEDIA_SESSION_COORDINATOR, 28 29 EnabledBySetting=MediaSessionCoordinator, 29 30 Exposed=Window, 30 31 ExportMacro=WEBCORE_EXPORT, 31 ] interface MediaSessionCoordinator { 32 JSGenerateToJSObject, 33 ] interface MediaSessionCoordinator : EventTarget { 32 34 33 35 Promise<undefined> join(); … … 35 37 36 38 readonly attribute MediaSessionCoordinatorState state; 39 attribute EventHandler oncoordinatorstatechange; 40 37 41 readonly attribute DOMString? identifier; 38 42 -
trunk/Source/WebCore/Modules/mediasession/MediaSessionCoordinatorMixin.idl
r275314 r278336 28 28 EnabledBySetting=MediaSessionCoordinator, 29 29 ] interface mixin MediaSessionCoordinatorMixin { 30 readonly attribute MediaSessionCoordinator? coordinator; 31 attribute EventHandler oncoordinatorchange; 30 readonly attribute MediaSessionCoordinator coordinator; 32 31 attribute MediaSessionReadyState readyState; 33 32 }; -
trunk/Source/WebCore/dom/EventNames.h
r275431 r278336 102 102 macro(contextmenu) \ 103 103 macro(controllerchange) \ 104 macro(coordinator change) \104 macro(coordinatorstatechange) \ 105 105 macro(copy) \ 106 106 macro(cuechange) \ -
trunk/Source/WebCore/dom/EventTargetFactory.in
r275151 r278336 24 24 MediaQueryList 25 25 MediaRecorder conditional=MEDIA_STREAM 26 MediaSession conditional=MEDIA_SESSION26 MediaSessionCoordinator conditional=MEDIA_SESSION_COORDINATOR 27 27 MediaSource conditional=MEDIA_SOURCE 28 28 MediaStream conditional=MEDIA_STREAM -
trunk/Source/WebCore/page/Page.cpp
r278253 r278336 3428 3428 auto* window = mainFrame().window(); 3429 3429 if (auto* navigator = window ? window->optionalNavigator() : nullptr) 3430 NavigatorMediaSession::mediaSession(*navigator).c reateCoordinator(*m_mediaSessionCoordinator);3430 NavigatorMediaSession::mediaSession(*navigator).coordinator().setMediaSessionCoordinatorPrivate(*m_mediaSessionCoordinator); 3431 3431 } 3432 3432 … … 3442 3442 return; 3443 3443 3444 auto* coordinator = NavigatorMediaSession::mediaSession(*navigator).coordinator(); 3445 if (!coordinator) 3446 return; 3447 3448 coordinator->close(); 3444 NavigatorMediaSession::mediaSession(*navigator).coordinator().close(); 3449 3445 } 3450 3446 #endif -
trunk/Source/WebCore/testing/Internals.cpp
r278253 r278336 6247 6247 auto mock = MockMediaSessionCoordinator::create(context, WTFMove(listener)); 6248 6248 m_mockMediaSessionCoordinator = mock.ptr(); 6249 session.c reateCoordinator(WTFMove(mock));6249 session.coordinator().setMediaSessionCoordinatorPrivate(WTFMove(mock)); 6250 6250 6251 6251 return { }; -
trunk/Tools/ChangeLog
r278334 r278336 1 2021-06-01 Jean-Yves Avenard <jya@apple.com> 2 3 MediaSession.coordinator should not be optional, relying on coordinator readyState change instead 4 https://bugs.webkit.org/show_bug.cgi?id=226328 5 rdar://77461335 6 7 Reviewed by Eric Carlson. 8 9 * TestWebKitAPI/Tests/WebKit/MediaSessionCoordinatorTest.mm: 10 (TestWebKitAPI::MediaSessionCoordinatorTest::createCoordinator): Change test to match new API, 11 using coordinatorstatechange event instead. 12 * TestWebKitAPI/Tests/WebKitCocoa/media-remote.html: 13 1 14 2021-06-01 Chris Fleizach <cfleizach@apple.com> 2 15 -
trunk/Tools/TestWebKitAPI/Tests/WebKit/MediaSessionCoordinatorTest.mm
r278143 r278336 213 213 TestWebKitAPI::Util::run(&done); 214 214 215 listenForEventMessages({ "coordinator change"_s });215 listenForEventMessages({ "coordinatorstatechange"_s }); 216 216 217 217 EXPECT_TRUE(result); … … 219 219 NSLog(@"-[_createMediaSessionCoordinatorForTesting:completionHandler:] failed!"); 220 220 221 waitForEventListenerToBeCalled("coordinator change"_s);222 ASSERT_TRUE(eventListenerWasCalled("coordinator change"_s));221 waitForEventListenerToBeCalled("coordinatorstatechange"_s); 222 ASSERT_TRUE(eventListenerWasCalled("coordinatorstatechange"_s)); 223 223 } 224 224 -
trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/media-remote.html
r275537 r278336 97 97 } 98 98 99 function postEvent(evt) 99 function postEvent(evt) 100 100 { 101 101 postMessage(`${evt.type} event`); … … 136 136 audio.addEventListener('pause', postEvent); 137 137 audio.addEventListener('seeked', postEvent); 138 navigator.mediaSession. addEventListener('coordinatorchange', postEvent);138 navigator.mediaSession.coordinator.addEventListener('coordinatorstatechange', postEvent); 139 139 }, false); 140 140
Note:
See TracChangeset
for help on using the changeset viewer.