Changeset 275537 in webkit
- Timestamp:
- Apr 6, 2021 12:06:53 PM (3 years ago)
- Location:
- trunk
- Files:
-
- 1 added
- 16 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r275532 r275537 1 2021-04-06 Eric Carlson <eric.carlson@apple.com> 2 3 [macOS] Add MediaSessionCoordinator API test 4 https://bugs.webkit.org/show_bug.cgi?id=224140 5 <rdar://problem/76171173> 6 7 Reviewed by Jer Noble. 8 9 * Sources.txt: Include RemoteMediaSessionCoordinatorProxy.cpp and RemoteMediaSessionCoordinator.cpp 10 so they don't have to be included in the Xcode project. 11 12 * UIProcess/API/Cocoa/WKWebViewPrivateForTesting.h: Declare enums, struct, and protocols 13 necessary to implement and use an object derived from MediaSessionCoordinatorProxyPrivate. 14 * UIProcess/API/Cocoa/WKWebViewTesting.mm: 15 (-[WKWebView _createMediaSessionCoordinatorForTesting:completionHandler:]): New private 16 method to create a MediaSessionCoordinatorProxyPrivate. 17 (-[WKMediaSessionCoordinatorHelper initWithCoordinator:]): 18 (-[WKMediaSessionCoordinatorHelper seekSessionToTime:withCompletion:]): 19 (-[WKMediaSessionCoordinatorHelper playSessionWithCompletion:]): 20 (-[WKMediaSessionCoordinatorHelper pauseSessionWithCompletion:]): 21 (-[WKMediaSessionCoordinatorHelper setSessionTrack:withCompletion:]): 22 23 * UIProcess/Cocoa/WebViewImpl.h: 24 (WebKit::WebViewImpl::mediaSessionCoordinatorForTesting): MediaSessionCoordinatorProxyPrivate 25 getter. 26 * UIProcess/Cocoa/WebViewImpl.mm: 27 (WebKit::WebViewImpl::setMediaSessionCoordinatorForTesting): Setter for 28 MediaSessionCoordinatorProxyPrivate drived object. 29 30 * UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Add typedef for the completion 31 handler used by many coordinator proxy methods. 32 33 * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp: 34 (WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy): 35 Set the private coordinator client so calls to the session can be forwarded. 36 (WebKit::RemoteMediaSessionCoordinatorProxy::join): Use MediaSessionCommandCompletionHandler. 37 (WebKit::RemoteMediaSessionCoordinatorProxy::coordinateSeekTo): Ditto. 38 (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatePlay): Ditto. 39 (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatePause): Ditto. 40 (WebKit::RemoteMediaSessionCoordinatorProxy::coordinateSetTrack): Ditto. 41 (WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): Ditto. 42 * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h: 43 44 * UIProcess/WebPageProxy.cpp: 45 (WebKit::WebPageProxy::createMediaSessionCoordinator): Change completion handler 46 parameter to return a bool instead of a RemoteMediaSessionCoordinatorProxy as the 47 client interface provides all of the session access needed. 48 * UIProcess/WebPageProxy.h: 49 50 * WebKit.xcodeproj/project.pbxproj: Remove RemoteMediaSessionCoordinatorProxy.cpp 51 and RemoteMediaSessionCoordinator.cpp 52 53 * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp: 54 (WebKit::RemoteMediaSessionCoordinator::join): Use ExceptionData's toException() 55 method instead of creating an Exception directly. Remove the destination ID parameter 56 to sendWithAsyncReply so messageSenderDestinationID() will be used. 57 (WebKit::RemoteMediaSessionCoordinator::leave): Ditto. 58 (WebKit::RemoteMediaSessionCoordinator::seekTo) Ditto.: 59 (WebKit::RemoteMediaSessionCoordinator::play): Ditto. 60 (WebKit::RemoteMediaSessionCoordinator::pause): Ditto. 61 (WebKit::RemoteMediaSessionCoordinator::setTrack): Ditto. 62 (WebKit::RemoteMediaSessionCoordinator::positionStateChanged): Ditto. 63 (WebKit::RemoteMediaSessionCoordinator::readyStateChanged): Ditto. 64 (WebKit::RemoteMediaSessionCoordinator::playbackStateChanged): Ditto. 65 (WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): Ditto. 66 1 67 2021-04-06 Aditya Keerthi <akeerthi@apple.com> 2 68 -
trunk/Source/WebKit/Sources.txt
r275403 r275537 470 470 UIProcess/Media/AudioSessionRoutingArbitratorProxy.cpp 471 471 UIProcess/Media/MediaUsageManager.cpp 472 UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp 472 473 473 474 UIProcess/Notifications/NotificationPermissionRequestManagerProxy.cpp … … 581 582 WebProcess/Inspector/WebPageInspectorTargetController.cpp 582 583 WebProcess/Inspector/WebPageInspectorTargetFrontendChannel.cpp 584 585 WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp 583 586 584 587 WebProcess/MediaStream/MediaDeviceSandboxExtensions.cpp -
trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivateForTesting.h
r275046 r275537 27 27 #import "WKWebViewPrivateForTestingMac.h" 28 28 29 NS_ASSUME_NONNULL_BEGIN 30 29 31 typedef enum { 30 32 WKWebViewAudioRoutingArbitrationStatusNone, … … 37 39 BOOL hasLoadedNonAppBoundRequestTesting; 38 40 }; 41 42 @protocol _WKMediaSessionCoordinator; 39 43 40 44 @interface WKWebView (WKTesting) … … 100 104 - (void)_clearAppBoundNavigationData:(void(^)(void))completionHandler; 101 105 106 - (void)_createMediaSessionCoordinatorForTesting:(id <_WKMediaSessionCoordinator>)privateCoordinator completionHandler:(void(^)(BOOL))completionHandler; 107 102 108 @end 109 110 typedef NS_ENUM(NSInteger, _WKMediaSessionReadyState) { 111 WKMediaSessionReadyStateHaveNothing, 112 WKMediaSessionReadyStateHaveMetadata, 113 WKMediaSessionReadyStateHaveCurrentData, 114 WKMediaSessionReadyStateHaveFutureData, 115 WKMediaSessionReadyStateHaveEnoughData 116 }; 117 118 typedef NS_ENUM(NSInteger, _WKMediaSessionPlaybackState) { 119 WKMediaSessionPlaybackStateNone, 120 WKMediaSessionPlaybackStatePaused, 121 WKMediaSessionPlaybackStatePlaying 122 }; 123 124 typedef NS_ENUM(NSInteger, _WKMediaSessionCoordinatorState) { 125 WKMediaSessionCoordinatorStateWaiting, 126 WKMediaSessionCoordinatorStateJoined, 127 WKMediaSessionCoordinatorStateClosed 128 }; 129 130 struct _WKMediaPositionState { 131 double duration; 132 double playbackRate; 133 double position; 134 }; 135 136 @protocol _WKMediaSessionCoordinatorDelegate <NSObject> 137 - (void)seekSessionToTime:(double)time withCompletion:(void(^)(BOOL))completionHandler; 138 - (void)playSessionWithCompletion:(void(^)(BOOL))completionHandler; 139 - (void)pauseSessionWithCompletion:(void(^)(BOOL))completionHandler; 140 - (void)setSessionTrack:(NSString*)trackIdentifier withCompletion:(void(^)(BOOL))completionHandler; 141 @end 142 143 @protocol _WKMediaSessionCoordinator <NSObject> 144 @property (nullable, weak) id <_WKMediaSessionCoordinatorDelegate> delegate; 145 @property (nonatomic, readonly) NSString * _Nonnull identifier; 146 - (void)joinWithCompletion:(void(^ _Nonnull)(BOOL))completionHandler; 147 - (void)leave; 148 - (void)seekTo:(double)time withCompletion:(void(^ _Nonnull)(BOOL))completionHandler; 149 - (void)playWithCompletion:(void(^ _Nonnull)(BOOL))completionHandler; 150 - (void)pauseWithCompletion:(void(^ _Nonnull)(BOOL))completionHandler; 151 - (void)setTrack:(NSString *_Nonnull)trackIdentifier withCompletion:(void(^ _Nonnull)(BOOL))completionHandler; 152 - (void)positionStateChanged:(struct _WKMediaPositionState * _Nullable)state; 153 - (void)readyStateChanged:(_WKMediaSessionReadyState)state; 154 - (void)playbackStateChanged:(_WKMediaSessionPlaybackState)state; 155 - (void)coordinatorStateChanged:(_WKMediaSessionCoordinatorState)state; 156 @end 157 158 NS_ASSUME_NONNULL_END -
trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewTesting.mm
r275046 r275537 28 28 29 29 #import "AudioSessionRoutingArbitratorProxy.h" 30 #import "MediaSessionCoordinatorProxyPrivate.h" 30 31 #import "PlaybackSessionManagerProxy.h" 31 32 #import "UserMediaProcessManager.h" … … 40 41 #import <WebCore/RuntimeApplicationChecks.h> 41 42 #import <WebCore/ValidationBubble.h> 42 43 #import <wtf/RetainPtr.h> 44 45 #if ENABLE(MEDIA_SESSION_COORDINATOR) 46 @interface WKMediaSessionCoordinatorHelper : NSObject <_WKMediaSessionCoordinatorDelegate> 47 - (id)initWithCoordinator:(WebCore::MediaSessionCoordinatorClient*)coordinator; 48 - (void)seekSessionToTime:(double)time withCompletion:(void(^)(BOOL))completionHandler; 49 - (void)playSessionWithCompletion:(void(^)(BOOL))completionHandler; 50 - (void)pauseSessionWithCompletion:(void(^)(BOOL))completionHandler; 51 - (void)setSessionTrack:(NSString*)trackIdentifier withCompletion:(void(^)(BOOL))completionHandler; 52 @end 53 #endif 43 54 44 55 @implementation WKWebView (WKTesting) … … 361 372 } 362 373 374 - (void)_createMediaSessionCoordinatorForTesting:(id <_WKMediaSessionCoordinator>)privateCoordinator completionHandler:(void(^)(BOOL))completionHandler 375 { 376 #if ENABLE(MEDIA_SESSION_COORDINATOR) 377 class WKMediaSessionCoordinatorForTesting 378 : public WebKit::MediaSessionCoordinatorProxyPrivate 379 , public WebCore::MediaSessionCoordinatorClient { 380 WTF_MAKE_FAST_ALLOCATED; 381 public: 382 383 static Ref<WKMediaSessionCoordinatorForTesting> create(id <_WKMediaSessionCoordinator> privateCoordinator) 384 { 385 return adoptRef(*new WKMediaSessionCoordinatorForTesting(privateCoordinator)); 386 } 387 388 using WebCore::MediaSessionCoordinatorClient::weakPtrFactory; 389 using WeakValueType = WebCore::MediaSessionCoordinatorClient::WeakValueType; 390 391 private: 392 explicit WKMediaSessionCoordinatorForTesting(id <_WKMediaSessionCoordinator> clientCoordinator) 393 : WebKit::MediaSessionCoordinatorProxyPrivate() 394 , m_clientCoordinator(clientCoordinator) 395 { 396 auto* delegateHelper = [[WKMediaSessionCoordinatorHelper alloc] initWithCoordinator:this]; 397 [m_clientCoordinator setDelegate:delegateHelper]; 398 m_coordinatorDelegate = adoptNS(delegateHelper); 399 } 400 401 void seekSessionToTime(double time, CompletionHandler<void(bool)>&& callback) final 402 { 403 if (auto coordinatorClient = client()) 404 coordinatorClient->seekSessionToTime(time, WTFMove(callback)); 405 else 406 callback(false); 407 } 408 409 void playSession(CompletionHandler<void(bool)>&& callback) final 410 { 411 if (auto coordinatorClient = client()) 412 coordinatorClient->playSession(WTFMove(callback)); 413 else 414 callback(false); 415 } 416 417 void pauseSession(CompletionHandler<void(bool)>&& callback) final 418 { 419 if (auto coordinatorClient = client()) 420 coordinatorClient->pauseSession(WTFMove(callback)); 421 else 422 callback(false); 423 } 424 425 void setSessionTrack(const String& trackIdentifier, CompletionHandler<void(bool)>&& callback) final 426 { 427 if (auto coordinatorClient = client()) 428 coordinatorClient->setSessionTrack(trackIdentifier, WTFMove(callback)); 429 else 430 callback(false); 431 } 432 433 Optional<WebCore::ExceptionData> result(bool success) const 434 { 435 if (!success) 436 return { WebCore::ExceptionData { WebCore::InvalidStateError } }; 437 438 return { }; 439 } 440 441 String identifier() const 442 { 443 return [m_clientCoordinator identifier]; 444 } 445 446 void join(WebKit::MediaSessionCommandCompletionHandler&& callback) final 447 { 448 [m_clientCoordinator joinWithCompletion:makeBlockPtr([weakThis = makeWeakPtr(this), callback = WTFMove(callback)] (BOOL success) mutable { 449 if (!weakThis) { 450 callback(WebCore::ExceptionData { WebCore::InvalidStateError }); 451 return; 452 } 453 454 callback(weakThis->result(success)); 455 }).get()]; 456 } 457 458 void leave() final 459 { 460 [m_clientCoordinator leave]; 461 } 462 463 void seekTo(double time, WebKit::MediaSessionCommandCompletionHandler&& callback) final 464 { 465 [m_clientCoordinator seekTo:time withCompletion:makeBlockPtr([weakThis = makeWeakPtr(this), callback = WTFMove(callback)] (BOOL success) mutable { 466 if (!weakThis) { 467 callback(WebCore::ExceptionData { WebCore::InvalidStateError }); 468 return; 469 } 470 471 callback(weakThis->result(success)); 472 }).get()]; 473 } 474 475 void play(WebKit::MediaSessionCommandCompletionHandler&& callback) final 476 { 477 [m_clientCoordinator playWithCompletion:makeBlockPtr([weakThis = makeWeakPtr(this), callback = WTFMove(callback)] (BOOL success) mutable { 478 if (!weakThis) { 479 callback(WebCore::ExceptionData { WebCore::InvalidStateError }); 480 return; 481 } 482 483 callback(weakThis->result(success)); 484 }).get()]; 485 } 486 487 void pause(WebKit::MediaSessionCommandCompletionHandler&& callback) final 488 { 489 [m_clientCoordinator pauseWithCompletion:makeBlockPtr([weakThis = makeWeakPtr(this), callback = WTFMove(callback)] (BOOL success) mutable { 490 if (!weakThis) { 491 callback(WebCore::ExceptionData { WebCore::InvalidStateError }); 492 return; 493 } 494 495 callback(weakThis->result(success)); 496 }).get()]; 497 } 498 499 void setTrack(const String& track, WebKit::MediaSessionCommandCompletionHandler&& callback) final 500 { 501 [m_clientCoordinator setTrack:track withCompletion:makeBlockPtr([weakThis = makeWeakPtr(this), callback = WTFMove(callback)] (BOOL success) mutable { 502 if (!weakThis) { 503 callback(WebCore::ExceptionData { WebCore::InvalidStateError }); 504 return; 505 } 506 507 callback(weakThis->result(success)); 508 }).get()]; 509 } 510 511 void positionStateChanged(const Optional<WebCore::MediaPositionState>& state) final 512 { 513 if (!state) { 514 [m_clientCoordinator positionStateChanged:nil]; 515 return; 516 } 517 518 _WKMediaPositionState position = { 519 .duration = state->duration, 520 .playbackRate = state->playbackRate, 521 .position = state->position 522 }; 523 [m_clientCoordinator positionStateChanged:&position]; 524 } 525 526 void readyStateChanged(WebCore::MediaSessionReadyState state) final 527 { 528 static_assert(static_cast<size_t>(WebCore::MediaSessionReadyState::HaveNothing) == static_cast<size_t>(WKMediaSessionReadyStateHaveNothing), "WKMediaSessionReadyStateHaveNothing does not match WebKit value"); 529 static_assert(static_cast<size_t>(WebCore::MediaSessionReadyState::HaveMetadata) == static_cast<size_t>(WKMediaSessionReadyStateHaveMetadata), "WKMediaSessionReadyStateHaveMetadata does not match WebKit value"); 530 static_assert(static_cast<size_t>(WebCore::MediaSessionReadyState::HaveCurrentData) == static_cast<size_t>(WKMediaSessionReadyStateHaveCurrentData), "WKMediaSessionReadyStateHaveCurrentData does not match WebKit value"); 531 static_assert(static_cast<size_t>(WebCore::MediaSessionReadyState::HaveFutureData) == static_cast<size_t>(WKMediaSessionReadyStateHaveFutureData), "WKMediaSessionReadyStateHaveFutureData does not match WebKit value"); 532 static_assert(static_cast<size_t>(WebCore::MediaSessionReadyState::HaveEnoughData) == static_cast<size_t>(WKMediaSessionReadyStateHaveEnoughData), "WKMediaSessionReadyStateHaveEnoughData does not match WebKit value"); 533 534 [m_clientCoordinator readyStateChanged:static_cast<_WKMediaSessionReadyState>(state)]; 535 } 536 537 void playbackStateChanged(WebCore::MediaSessionPlaybackState state) final 538 { 539 static_assert(static_cast<size_t>(WebCore::MediaSessionPlaybackState::None) == static_cast<size_t>(WKMediaSessionPlaybackStateNone), "WKMediaSessionPlaybackStateNone does not match WebKit value"); 540 static_assert(static_cast<size_t>(WebCore::MediaSessionPlaybackState::Paused) == static_cast<size_t>(WKMediaSessionPlaybackStatePaused), "WKMediaSessionPlaybackStatePaused does not match WebKit value"); 541 static_assert(static_cast<size_t>(WebCore::MediaSessionPlaybackState::Playing) == static_cast<size_t>(WKMediaSessionPlaybackStatePlaying), "WKMediaSessionPlaybackStatePlaying does not match WebKit value"); 542 543 [m_clientCoordinator playbackStateChanged:static_cast<_WKMediaSessionPlaybackState>(state)]; 544 } 545 546 void coordinatorStateChanged(WebCore::MediaSessionCoordinatorState state) final 547 { 548 static_assert(static_cast<size_t>(WebCore::MediaSessionCoordinatorState::Waiting) == static_cast<size_t>(WKMediaSessionCoordinatorStateWaiting), "WKMediaSessionCoordinatorStateWaiting does not match WebKit value"); 549 static_assert(static_cast<size_t>(WebCore::MediaSessionCoordinatorState::Joined) == static_cast<size_t>(WKMediaSessionCoordinatorStateJoined), "WKMediaSessionCoordinatorStateJoined does not match WebKit value"); 550 static_assert(static_cast<size_t>(WebCore::MediaSessionCoordinatorState::Closed) == static_cast<size_t>(WKMediaSessionCoordinatorStateClosed), "WKMediaSessionCoordinatorStateClosed does not match WebKit value"); 551 552 [m_clientCoordinator coordinatorStateChanged:static_cast<_WKMediaSessionCoordinatorState>(state)]; 553 } 554 555 private: 556 RetainPtr<id <_WKMediaSessionCoordinator>> m_clientCoordinator; 557 RetainPtr<WKMediaSessionCoordinatorHelper> m_coordinatorDelegate; 558 }; 559 560 ASSERT(!_impl->mediaSessionCoordinatorForTesting()); 561 562 _impl->setMediaSessionCoordinatorForTesting(WKMediaSessionCoordinatorForTesting::create(privateCoordinator).ptr()); 563 _impl->page().createMediaSessionCoordinator(*_impl->mediaSessionCoordinatorForTesting(), [completionHandler = makeBlockPtr(completionHandler)] (bool success) { 564 completionHandler(success); 565 }); 566 #else 567 568 completionHandler(NO); 569 570 #endif 571 } 572 363 573 @end 574 575 #if ENABLE(MEDIA_SESSION_COORDINATOR) 576 @implementation WKMediaSessionCoordinatorHelper { 577 WeakPtr<WebCore::MediaSessionCoordinatorClient> m_coordinatorClient; 578 } 579 580 - (id)initWithCoordinator:(WebCore::MediaSessionCoordinatorClient*)coordinator 581 { 582 self = [super init]; 583 if (!self) 584 return nil; 585 m_coordinatorClient = makeWeakPtr(coordinator); 586 return self; 587 } 588 589 - (void)seekSessionToTime:(double)time withCompletion:(void(^)(BOOL))completionHandler 590 { 591 m_coordinatorClient->seekSessionToTime(time, makeBlockPtr(completionHandler)); 592 } 593 594 - (void)playSessionWithCompletion:(void(^)(BOOL))completionHandler 595 { 596 m_coordinatorClient->playSession(makeBlockPtr(completionHandler)); 597 } 598 599 - (void)pauseSessionWithCompletion:(void(^)(BOOL))completionHandler 600 { 601 m_coordinatorClient->pauseSession(makeBlockPtr(completionHandler)); 602 } 603 604 - (void)setSessionTrack:(NSString*)trackIdentifier withCompletion:(void(^)(BOOL))completionHandler 605 { 606 m_coordinatorClient->setSessionTrack(trackIdentifier, makeBlockPtr(completionHandler)); 607 } 608 609 @end 610 #endif -
trunk/Source/WebKit/UIProcess/Cocoa/WebViewImpl.h
r275491 r275537 153 153 class PageClientImpl; 154 154 class DrawingAreaProxy; 155 class MediaSessionCoordinatorProxyPrivate; 155 156 class SafeBrowsingWarning; 156 157 class ViewGestureController; … … 646 647 #endif 647 648 649 #if ENABLE(MEDIA_SESSION_COORDINATOR) 650 MediaSessionCoordinatorProxyPrivate* mediaSessionCoordinatorForTesting() { return m_coordinatorForTesting.get(); } 651 void setMediaSessionCoordinatorForTesting(MediaSessionCoordinatorProxyPrivate*); 652 #endif 653 648 654 private: 649 655 #if HAVE(TOUCH_BAR) … … 852 858 CompletionHandler<void(WebCore::DOMPasteAccessResponse)> m_domPasteRequestHandler; 853 859 860 #if ENABLE(MEDIA_SESSION_COORDINATOR) 861 RefPtr<MediaSessionCoordinatorProxyPrivate> m_coordinatorForTesting; 862 #endif 863 854 864 #if USE(APPLE_INTERNAL_SDK) 855 865 #import <WebKitAdditions/WebViewImplAdditionsAfter.h> -
trunk/Source/WebKit/UIProcess/Cocoa/WebViewImpl.mm
r274815 r275537 140 140 #endif 141 141 142 #if ENABLE(MEDIA_SESSION_COORDINATOR) 143 #include <WebKit/MediaSessionCoordinatorProxyPrivate.h> 144 #endif 145 142 146 #if HAVE(TRANSLATION_UI_SERVICES) 143 147 #import <TranslationUIServices/LTUITranslationViewController.h> … … 5583 5587 } 5584 5588 5589 #if ENABLE(MEDIA_SESSION_COORDINATOR) 5590 void WebViewImpl::setMediaSessionCoordinatorForTesting(MediaSessionCoordinatorProxyPrivate* coordinator) 5591 { 5592 m_coordinatorForTesting = coordinator; 5593 } 5594 #endif 5595 5585 5596 #if HAVE(TRANSLATION_UI_SERVICES) && ENABLE(CONTEXT_MENUS) 5586 5597 -
trunk/Source/WebKit/UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h
r275484 r275537 39 39 namespace WebKit { 40 40 41 using MediaSessionCommandCompletionHandler = CompletionHandler<void(Optional<WebCore::ExceptionData>&&)>; 42 41 43 class MediaSessionCoordinatorProxyPrivate 42 44 : public CanMakeWeakPtr<MediaSessionCoordinatorProxyPrivate> … … 47 49 virtual String identifier() const = 0; 48 50 49 virtual void join( CompletionHandler<void(Optional<WebCore::ExceptionData>&&)>&&) = 0;51 virtual void join(MediaSessionCommandCompletionHandler&&) = 0; 50 52 virtual void leave() = 0; 51 virtual void seekTo(double, CompletionHandler<void(Optional<WebCore::ExceptionData>&&)>&&) = 0;52 virtual void play( CompletionHandler<void(Optional<WebCore::ExceptionData>&&)>&&) = 0;53 virtual void pause( CompletionHandler<void(Optional<WebCore::ExceptionData>&&)>&&) = 0;54 virtual void setTrack(const String&, CompletionHandler<void(Optional<WebCore::ExceptionData>&&)>&&) = 0;53 virtual void seekTo(double, MediaSessionCommandCompletionHandler&&) = 0; 54 virtual void play(MediaSessionCommandCompletionHandler&&) = 0; 55 virtual void pause(MediaSessionCommandCompletionHandler&&) = 0; 56 virtual void setTrack(const String&, MediaSessionCommandCompletionHandler&&) = 0; 55 57 56 58 virtual void positionStateChanged(const Optional<WebCore::MediaPositionState>&) = 0; -
trunk/Source/WebKit/UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp
r275458 r275537 60 60 #endif 61 61 { 62 m_privateCoordinator->setClient(makeWeakPtr(this)); 62 63 m_webPageProxy.process().addMessageReceiver(Messages::RemoteMediaSessionCoordinatorProxy::messageReceiverName(), m_webPageProxy.webPageID(), *this); 63 64 } … … 68 69 } 69 70 70 void RemoteMediaSessionCoordinatorProxy::join( CommandCompletionHandler&& completionHandler)71 void RemoteMediaSessionCoordinatorProxy::join(MediaSessionCommandCompletionHandler&& completionHandler) 71 72 { 72 73 auto identifier = LOGIDENTIFIER; … … 86 87 } 87 88 88 void RemoteMediaSessionCoordinatorProxy::coordinateSeekTo(double time, CommandCompletionHandler&& completionHandler)89 void RemoteMediaSessionCoordinatorProxy::coordinateSeekTo(double time, MediaSessionCommandCompletionHandler&& completionHandler) 89 90 { 90 91 auto identifier = LOGIDENTIFIER; … … 97 98 } 98 99 99 void RemoteMediaSessionCoordinatorProxy::coordinatePlay( CommandCompletionHandler&& completionHandler)100 void RemoteMediaSessionCoordinatorProxy::coordinatePlay(MediaSessionCommandCompletionHandler&& completionHandler) 100 101 { 101 102 auto identifier = LOGIDENTIFIER; … … 108 109 } 109 110 110 void RemoteMediaSessionCoordinatorProxy::coordinatePause( CommandCompletionHandler&& completionHandler)111 void RemoteMediaSessionCoordinatorProxy::coordinatePause(MediaSessionCommandCompletionHandler&& completionHandler) 111 112 { 112 113 auto identifier = LOGIDENTIFIER; … … 119 120 } 120 121 121 void RemoteMediaSessionCoordinatorProxy::coordinateSetTrack(const String& track, CommandCompletionHandler&& completionHandler)122 void RemoteMediaSessionCoordinatorProxy::coordinateSetTrack(const String& track, MediaSessionCommandCompletionHandler&& completionHandler) 122 123 { 123 124 auto identifier = LOGIDENTIFIER; … … 148 149 } 149 150 151 void RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged(WebCore::MediaSessionCoordinatorState state) 152 { 153 ALWAYS_LOG(LOGIDENTIFIER); 154 m_privateCoordinator->coordinatorStateChanged(state); 155 } 156 150 157 void RemoteMediaSessionCoordinatorProxy::seekSessionToTime(double time, CompletionHandler<void(bool)>&& callback) 151 158 { … … 168 175 } 169 176 170 void RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged(WebCore::MediaSessionCoordinatorState state)171 {172 ALWAYS_LOG(LOGIDENTIFIER);173 m_privateCoordinator->coordinatorStateChanged(state);174 }175 176 177 #if !RELEASE_LOG_DISABLED 177 178 WTFLogChannel& RemoteMediaSessionCoordinatorProxy::logChannel() const -
trunk/Source/WebKit/UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h
r275458 r275537 42 42 43 43 class RemoteMediaSessionCoordinatorProxy 44 : p ublicIPC::MessageReceiver44 : private IPC::MessageReceiver 45 45 , public RefCounted<RemoteMediaSessionCoordinatorProxy> 46 46 , public WebCore::MediaSessionCoordinatorClient { … … 61 61 explicit RemoteMediaSessionCoordinatorProxy(WebPageProxy&, Ref<MediaSessionCoordinatorProxyPrivate>&&); 62 62 63 using CoordinateCompletionHandler = CompletionHandler<void(const WebCore::ExceptionData&)>;64 65 63 // IPC::MessageReceiver. 66 64 void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override; 67 65 68 66 // Receivers. 69 using CommandCompletionHandler = CompletionHandler<void(Optional<WebCore::ExceptionData>&&)>; 70 void join(CommandCompletionHandler&&); 67 void join(MediaSessionCommandCompletionHandler&&); 71 68 void leave(); 72 void coordinateSeekTo(double, CommandCompletionHandler&&);73 void coordinatePlay( CommandCompletionHandler&&);74 void coordinatePause( CommandCompletionHandler&&);75 void coordinateSetTrack(const String&, CommandCompletionHandler&&);69 void coordinateSeekTo(double, MediaSessionCommandCompletionHandler&&); 70 void coordinatePlay(MediaSessionCommandCompletionHandler&&); 71 void coordinatePause(MediaSessionCommandCompletionHandler&&); 72 void coordinateSetTrack(const String&, MediaSessionCommandCompletionHandler&&); 76 73 void positionStateChanged(const Optional<WebCore::MediaPositionState>&); 77 74 void readyStateChanged(WebCore::MediaSessionReadyState); -
trunk/Source/WebKit/UIProcess/WebPageProxy.cpp
r275491 r275537 10404 10404 10405 10405 #if ENABLE(MEDIA_SESSION_COORDINATOR) 10406 void WebPageProxy::createMediaSessionCoordinator(Ref<MediaSessionCoordinatorProxyPrivate>&& privateCoordinator, CompletionHandler<void( WeakPtr<RemoteMediaSessionCoordinatorProxy>)>&& completionHandler)10406 void WebPageProxy::createMediaSessionCoordinator(Ref<MediaSessionCoordinatorProxyPrivate>&& privateCoordinator, CompletionHandler<void(bool)>&& completionHandler) 10407 10407 { 10408 10408 ASSERT(!m_mediaSessionCoordinatorProxy); … … 10411 10411 10412 10412 if (!weakThis || !success) { 10413 completionHandler( { });10413 completionHandler(false); 10414 10414 return; 10415 10415 } 10416 10416 10417 10417 weakThis->m_mediaSessionCoordinatorProxy = RemoteMediaSessionCoordinatorProxy::create(*weakThis, WTFMove(privateCoordinator)); 10418 completionHandler( makeWeakPtr(weakThis->m_mediaSessionCoordinatorProxy.get()));10418 completionHandler(true); 10419 10419 }); 10420 10420 } -
trunk/Source/WebKit/UIProcess/WebPageProxy.h
r275491 r275537 1893 1893 1894 1894 #if ENABLE(MEDIA_SESSION_COORDINATOR) 1895 void createMediaSessionCoordinator(Ref<MediaSessionCoordinatorProxyPrivate>&&, CompletionHandler<void( WeakPtr<RemoteMediaSessionCoordinatorProxy>)>&&);1895 void createMediaSessionCoordinator(Ref<MediaSessionCoordinatorProxyPrivate>&&, CompletionHandler<void(bool)>&&); 1896 1896 #endif 1897 1897 -
trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj
r275458 r275537 106 106 074879B92373A90900F5678E /* AppKitSoftLink.h in Headers */ = {isa = PBXBuildFile; fileRef = 074879B72373A90900F5678E /* AppKitSoftLink.h */; }; 107 107 074E75FE1DF2211900D318EC /* UserMediaProcessManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 074E75FB1DF1FD1300D318EC /* UserMediaProcessManager.h */; }; 108 075A9CF326169BAB006DFA3A /* MediaSessionCoordinatorProxyPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 077BA570260E8F630072F19F /* MediaSessionCoordinatorProxyPrivate.h */; }; 108 109 076E884E1A13CADF005E90FC /* APIContextMenuClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 076E884D1A13CADF005E90FC /* APIContextMenuClient.h */; }; 109 110 0772811D21234FF600C8EF2E /* UserMediaPermissionRequestManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A410F4319AF7B27002EBAB5 /* UserMediaPermissionRequestManager.h */; }; 110 077BA56E260E6D1C0072F19F /* RemoteMediaSessionCoordinator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0736B755260D03A000E06994 /* RemoteMediaSessionCoordinator.cpp */; };111 111 07923148239CBCB8009598E2 /* RemoteMediaPlayerManagerProxyMessagesReplies.h in Headers */ = {isa = PBXBuildFile; fileRef = 07923142239CBCB5009598E2 /* RemoteMediaPlayerManagerProxyMessagesReplies.h */; }; 112 112 0792314B239CBCB8009598E2 /* RemoteMediaPlayerManagerProxyMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07923145239CBCB7009598E2 /* RemoteMediaPlayerManagerProxyMessageReceiver.cpp */; }; … … 1865 1865 CD19A26E1A13E834008D650E /* WebDiagnosticLoggingClient.h in Headers */ = {isa = PBXBuildFile; fileRef = CD19A26A1A13E821008D650E /* WebDiagnosticLoggingClient.h */; }; 1866 1866 CD19D2EA2046406F0017074A /* FullscreenTouchSecheuristic.h in Headers */ = {isa = PBXBuildFile; fileRef = CD19D2E82046406F0017074A /* FullscreenTouchSecheuristic.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1867 CD1FE2D72613E18600ADC29B /* RemoteMediaSessionCoordinatorProxy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0736B75C260D4A4E00E06994 /* RemoteMediaSessionCoordinatorProxy.cpp */; };1868 1867 CD3EEF462579C261006563BB /* RemoteMediaEngineConfigurationFactoryProxyMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD3EEF442579C1D4006563BB /* RemoteMediaEngineConfigurationFactoryProxyMessageReceiver.cpp */; }; 1869 1868 CD4570D3244113B500A3DCEB /* AudioSessionRoutingArbitratorProxyMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD4570D02441014A00A3DCEB /* AudioSessionRoutingArbitratorProxyMessageReceiver.cpp */; }; … … 9269 9268 5CBC9B8B1C65257300A8FDCF /* NetworkDataTaskCocoa.mm */, 9270 9269 7EC4F0F918E4A945008056AF /* NetworkProcessCocoa.mm */, 9270 518324782615B00D003F239E /* NetworkSchemeURLProtocol.h */, 9271 518324792615B00D003F239E /* NetworkSchemeURLProtocol.mm */, 9271 9272 532159501DBAE6D70054AA3C /* NetworkSessionCocoa.h */, 9272 9273 5C20CB9B1BB0DCD200895BB1 /* NetworkSessionCocoa.mm */, 9273 518324782615B00D003F239E /* NetworkSchemeURLProtocol.h */,9274 518324792615B00D003F239E /* NetworkSchemeURLProtocol.mm */,9275 9274 41287D4C225C05C5009A3E26 /* WebSocketTaskCocoa.h */, 9276 9275 41287D4B225C05C4009A3E26 /* WebSocketTaskCocoa.mm */, … … 11677 11676 00B9661618E24CBA00CE1F88 /* APIFindClient.h in Headers */, 11678 11677 2DD67A2E1BD819730053B251 /* APIFindMatchesClient.h in Headers */, 11679 5183247D26168FF7003F239E /* NetworkURLSchemeTask.h in Headers */,11680 11678 37E25D6E18FDE5D6005D3A00 /* APIFormClient.h in Headers */, 11681 11679 1AC1337218566C7C00F3EC05 /* APIFrameHandle.h in Headers */, … … 11930 11928 A1B4DCE125A7923C007D178C /* MediaSampleByteRange.h in Headers */, 11931 11929 A15799BD2584433200528236 /* MediaSampleCursor.h in Headers */, 11930 075A9CF326169BAB006DFA3A /* MediaSessionCoordinatorProxyPrivate.h in Headers */, 11932 11931 A15799B72584433200528236 /* MediaTrackReader.h in Headers */, 11933 11932 51933DEF1965EB31008AC3EA /* MenuUtilities.h in Headers */, … … 11998 11997 532159551DBAE7290054AA3C /* NetworkSessionCocoa.h in Headers */, 11999 11998 417915B92257046F00D6F97E /* NetworkSocketChannel.h in Headers */, 11999 5183247C26168C62003F239E /* NetworkURLSchemeHandler.h in Headers */, 12000 5183247D26168FF7003F239E /* NetworkURLSchemeTask.h in Headers */, 12000 12001 570DAAC22303730300E8FC04 /* NfcConnection.h in Headers */, 12001 12002 570DAAAE23026F5C00E8FC04 /* NfcService.h in Headers */, … … 12828 12829 CE21215F240EE571006ED443 /* WKTextPlaceholder.h in Headers */, 12829 12830 CE45945C240F88550078019F /* WKTextSelectionRect.h in Headers */, 12830 5183247C26168C62003F239E /* NetworkURLSchemeHandler.h in Headers */,12831 12831 2EB6FC01203021960017E619 /* WKTimePickerViewController.h in Headers */, 12832 12832 71A676A622C62325007D6295 /* WKTouchActionGestureRecognizer.h in Headers */, … … 14006 14006 071BC58F23CE1EAA00680D7C /* RemoteMediaPlayerProxyMessageReceiver.cpp in Sources */, 14007 14007 1D4D737023A9E54700717A25 /* RemoteMediaResourceManagerMessageReceiver.cpp in Sources */, 14008 077BA56E260E6D1C0072F19F /* RemoteMediaSessionCoordinator.cpp in Sources */,14009 CD1FE2D72613E18600ADC29B /* RemoteMediaSessionCoordinatorProxy.cpp in Sources */,14010 14008 1DD2A6632561246F00FF7B6F /* RemoteMediaSourceProxyMessageReceiver.cpp in Sources */, 14011 14009 1AC1338518590C4600F3EC05 /* RemoteObjectRegistryMessageReceiver.cpp in Sources */, -
trunk/Source/WebKit/WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp
r275314 r275537 73 73 74 74 if (exception) { 75 callback( Exception { exception->code, WTFMove(exception->message) });76 return; 77 } 78 79 callback({ }); 80 } , 0);75 callback(exception->toException()); 76 return; 77 } 78 79 callback({ }); 80 }); 81 81 } 82 82 83 83 void RemoteMediaSessionCoordinator::leave() 84 84 { 85 m_page.send(Messages::RemoteMediaSessionCoordinatorProxy::Leave { } , 0);85 m_page.send(Messages::RemoteMediaSessionCoordinatorProxy::Leave { }); 86 86 } 87 87 … … 96 96 97 97 if (exception) { 98 callback( Exception { exception->code, WTFMove(exception->message) });99 return; 100 } 101 102 callback({ }); 103 } , 0);98 callback(exception->toException()); 99 return; 100 } 101 102 callback({ }); 103 }); 104 104 } 105 105 … … 114 114 115 115 if (exception) { 116 callback( Exception { exception->code, WTFMove(exception->message) });117 return; 118 } 119 120 callback({ }); 121 } , 0);116 callback(exception->toException()); 117 return; 118 } 119 120 callback({ }); 121 }); 122 122 } 123 123 … … 132 132 133 133 if (exception) { 134 callback( Exception { exception->code, WTFMove(exception->message) });135 return; 136 } 137 138 callback({ }); 139 } , 0);134 callback(exception->toException()); 135 return; 136 } 137 138 callback({ }); 139 }); 140 140 } 141 141 … … 150 150 151 151 if (exception) { 152 callback( Exception { exception->code, WTFMove(exception->message) });153 return; 154 } 155 156 callback({ }); 157 } , 0);152 callback(exception->toException()); 153 return; 154 } 155 156 callback({ }); 157 }); 158 158 } 159 159 … … 161 161 { 162 162 ALWAYS_LOG_IF_POSSIBLE(LOGIDENTIFIER); 163 m_page.send(Messages::RemoteMediaSessionCoordinatorProxy::PositionStateChanged { state } , 0);163 m_page.send(Messages::RemoteMediaSessionCoordinatorProxy::PositionStateChanged { state }); 164 164 } 165 165 … … 167 167 { 168 168 ALWAYS_LOG_IF_POSSIBLE(LOGIDENTIFIER, state); 169 m_page.send(Messages::RemoteMediaSessionCoordinatorProxy::ReadyStateChanged { state } , 0);169 m_page.send(Messages::RemoteMediaSessionCoordinatorProxy::ReadyStateChanged { state }); 170 170 } 171 171 … … 173 173 { 174 174 ALWAYS_LOG_IF_POSSIBLE(LOGIDENTIFIER, state); 175 m_page.send(Messages::RemoteMediaSessionCoordinatorProxy::PlaybackStateChanged { state } , 0);175 m_page.send(Messages::RemoteMediaSessionCoordinatorProxy::PlaybackStateChanged { state }); 176 176 } 177 177 … … 179 179 { 180 180 ALWAYS_LOG_IF_POSSIBLE(LOGIDENTIFIER, state); 181 m_page.send(Messages::RemoteMediaSessionCoordinatorProxy::CoordinatorStateChanged { state } , 0);181 m_page.send(Messages::RemoteMediaSessionCoordinatorProxy::CoordinatorStateChanged { state }); 182 182 } 183 183 -
trunk/Tools/ChangeLog
r275534 r275537 1 2021-04-06 Eric Carlson <eric.carlson@apple.com> 2 3 [macOS] Add MediaSessionCoordinator API test 4 https://bugs.webkit.org/show_bug.cgi?id=224140 5 <rdar://problem/76171173> 6 7 Reviewed by Jer Noble. 8 9 * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: 10 * TestWebKitAPI/TestWebKitAPI.xcodeproj/xcshareddata/xcschemes/TestWebKitAPI.xcscheme: 11 * TestWebKitAPI/Tests/WebKit/MediaSessionCoordinatorTest.mm: Added. 12 (-[_WKMockMediaSessionCoordinator lastStateChange]): 13 (-[_WKMockMediaSessionCoordinator lastMethodCalled]): 14 (-[_WKMockMediaSessionCoordinator identifier]): 15 (-[_WKMockMediaSessionCoordinator joinWithCompletion:]): 16 (-[_WKMockMediaSessionCoordinator leave]): 17 (-[_WKMockMediaSessionCoordinator seekTo:withCompletion:]): 18 (-[_WKMockMediaSessionCoordinator playWithCompletion:]): 19 (-[_WKMockMediaSessionCoordinator pauseWithCompletion:]): 20 (-[_WKMockMediaSessionCoordinator setTrack:withCompletion:]): 21 (-[_WKMockMediaSessionCoordinator positionStateChanged:]): 22 (-[_WKMockMediaSessionCoordinator readyStateChanged:]): 23 (-[_WKMockMediaSessionCoordinator playbackStateChanged:]): 24 (-[_WKMockMediaSessionCoordinator coordinatorStateChanged:]): 25 (-[_WKMockMediaSessionCoordinator seekSessionToTime:]): 26 (-[_WKMockMediaSessionCoordinator playSession]): 27 (-[_WKMockMediaSessionCoordinator pauseSession]): 28 (-[_WKMockMediaSessionCoordinator setSessionTrack:]): 29 (TestWebKitAPI::MediaSessionCoordinatorTest::createCoordinator): 30 (TestWebKitAPI::MediaSessionCoordinatorTest::webView const): 31 (TestWebKitAPI::MediaSessionCoordinatorTest::coordinator const): 32 (TestWebKitAPI::MediaSessionCoordinatorTest::loadPageAndBecomeReady): 33 (TestWebKitAPI::MediaSessionCoordinatorTest::runScriptWithUserGesture): 34 (TestWebKitAPI::MediaSessionCoordinatorTest::play): 35 (TestWebKitAPI::MediaSessionCoordinatorTest::pause): 36 (TestWebKitAPI::MediaSessionCoordinatorTest::listenForEventMessages): 37 (TestWebKitAPI::MediaSessionCoordinatorTest::eventListenerWasCalled): 38 (TestWebKitAPI::MediaSessionCoordinatorTest::clearEventListenerState): 39 (TestWebKitAPI::MediaSessionCoordinatorTest::executeUntil): 40 (TestWebKitAPI::MediaSessionCoordinatorTest::waitForEventListenerToBeCalled): 41 (TestWebKitAPI::MediaSessionCoordinatorTest::listenForMessagesPosted): 42 (TestWebKitAPI::MediaSessionCoordinatorTest::clearMessagesPosted): 43 (TestWebKitAPI::MediaSessionCoordinatorTest::listenForSessionHandlerMessages): 44 (TestWebKitAPI::MediaSessionCoordinatorTest::sessionHandlerWasCalled): 45 (TestWebKitAPI::MediaSessionCoordinatorTest::waitForSessionHandlerToBeCalled): 46 (TestWebKitAPI::MediaSessionCoordinatorTest::listenForPromiseMessages): 47 (TestWebKitAPI::MediaSessionCoordinatorTest::clearPromiseMessages): 48 (TestWebKitAPI::MediaSessionCoordinatorTest::promiseWasResolved): 49 (TestWebKitAPI::MediaSessionCoordinatorTest::promiseWasRejected): 50 (TestWebKitAPI::MediaSessionCoordinatorTest::waitForPromise): 51 (TestWebKitAPI::TEST_F): 52 * TestWebKitAPI/Tests/WebKitCocoa/media-remote.html: 53 1 54 2021-04-06 David Kilzer <ddkilzer@apple.com> 2 55 -
trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj
r275410 r275537 55 55 074994421EA5034B000DA45E /* getUserMediaAudioVideoCapture.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 4A410F4D19AF7BEF002EBAC5 /* getUserMediaAudioVideoCapture.html */; }; 56 56 074994521EA5034B000DA44E /* getUserMedia2.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 41BAF4E225AC9DB800D82F32 /* getUserMedia2.html */; }; 57 075A9CF526177218006DFA3A /* MediaSessionCoordinatorTest.mm in Sources */ = {isa = PBXBuildFile; fileRef = 075A9CF426177217006DFA3A /* MediaSessionCoordinatorTest.mm */; }; 57 58 076E507F1F4513D6006E9F5A /* Logging.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 076E507E1F45031E006E9F5A /* Logging.cpp */; }; 58 59 077A5AF3230638A600A7105C /* AccessibilityTestPlugin.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0746645822FF630500E3451A /* AccessibilityTestPlugin.mm */; }; … … 1761 1762 07492B391DF8ADA400633DE1 /* enumerateMediaDevices.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = enumerateMediaDevices.html; sourceTree = "<group>"; }; 1762 1763 07492B3A1DF8AE2D00633DE1 /* EnumerateMediaDevices.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EnumerateMediaDevices.cpp; sourceTree = "<group>"; }; 1764 075A9CF426177217006DFA3A /* MediaSessionCoordinatorTest.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MediaSessionCoordinatorTest.mm; sourceTree = "<group>"; }; 1763 1765 0766DD1F1A5AD5200023E3BB /* PendingAPIRequestURL.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PendingAPIRequestURL.cpp; sourceTree = "<group>"; }; 1764 1766 076E507E1F45031E006E9F5A /* Logging.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Logging.cpp; sourceTree = "<group>"; }; … … 4275 4277 33DC89131419579F00747EF7 /* LoadCanceledNoServerRedirectCallback_Bundle.cpp */, 4276 4278 8AA28C1916D2FA7B002FF4DB /* LoadPageOnCrash.cpp */, 4279 075A9CF426177217006DFA3A /* MediaSessionCoordinatorTest.mm */, 4277 4280 CDC9442C1EF1FC080059C3C4 /* MediaStreamTrackDetached.mm */, 4278 4281 7A5623101AD5AF3E0096B920 /* MenuTypesForMouseEvents.cpp */, … … 5501 5504 CDA315981ED53651009F60D3 /* MediaPlaybackSleepAssertion.mm in Sources */, 5502 5505 0794740D25CA0BDE00C597EB /* MediaSession.mm in Sources */, 5506 075A9CF526177218006DFA3A /* MediaSessionCoordinatorTest.mm in Sources */, 5503 5507 CDC9442E1EF1FC080059C3C4 /* MediaStreamTrackDetached.mm in Sources */, 5504 5508 51BE9E662376089F00B4E117 /* MediaType.mm in Sources */, -
trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/media-remote.html
r272445 r275537 41 41 postMessage('set metadata') 42 42 } 43 44 function joinSession() 45 { 46 let promise = navigator.mediaSession.coordinator.join(); 47 postPromise("join", promise); 48 } 49 50 function callMethod(method, args) 51 { 52 let code = `navigator.mediaSession.coordinator.${method}(${args})`; 53 let promise = eval(code); 54 postPromise(method, promise); 55 } 43 56 44 57 function setPlaylistMetadata(index) 45 58 { 46 59 setMetadata(playlist.metadata[index]); 47 48 60 } 49 61 … … 57 69 const actions = { 58 70 'play' : () => { postMessage('play handler'); }, 59 60 71 'pause' : () => { postMessage('pause handler') }, 61 62 72 'seekto' : (details) => { postMessage('seekto handler') }, 63 64 73 'seekforward' : (details) => { postMessage('seekforward handler') }, 65 66 'seekbackward' : (details) => { postMessage('seekbackward handler') }, 67 68 'previoustrack' : () => { postMessage('previoustrack handler') }, 69 74 'seekbackward' : (details) => { postMessage('seekbackward handler') }, 75 'previoustrack' : () => { postMessage('previoustrack handler') }, 70 76 'nexttrack' : () => { postMessage('nexttrack handler') }, 71 77 }; … … 96 102 } 97 103 104 async function postPromise(type, promise) 105 { 106 log(`waiting for ${type} promise`); 107 await promise 108 .then( () => { postMessage(`${type} resolved`); } ) 109 .catch( () => { postMessage(`${type} rejected`); } ); 110 log(`${type} promise settled`); 111 } 112 98 113 function load() 99 114 { … … 113 128 } 114 129 115 130 const session = navigator.mediaSession; 131 116 132 window.addEventListener("load", evt => { 117 133 audio = document.getElementsByTagName('audio')[0]; … … 120 136 audio.addEventListener('pause', postEvent); 121 137 audio.addEventListener('seeked', postEvent); 138 navigator.mediaSession.addEventListener('coordinatorchange', postEvent); 122 139 }, false); 123 140
Note: See TracChangeset
for help on using the changeset viewer.