Changeset 275537 in webkit


Ignore:
Timestamp:
Apr 6, 2021 12:06:53 PM (3 years ago)
Author:
eric.carlson@apple.com
Message:

[macOS] Add MediaSessionCoordinator API test
https://bugs.webkit.org/show_bug.cgi?id=224140
<rdar://problem/76171173>

Reviewed by Jer Noble.

Source/WebKit:

  • Sources.txt: Include RemoteMediaSessionCoordinatorProxy.cpp and RemoteMediaSessionCoordinator.cpp

so they don't have to be included in the Xcode project.

  • UIProcess/API/Cocoa/WKWebViewPrivateForTesting.h: Declare enums, struct, and protocols

necessary to implement and use an object derived from MediaSessionCoordinatorProxyPrivate.

  • UIProcess/API/Cocoa/WKWebViewTesting.mm:

(-[WKWebView _createMediaSessionCoordinatorForTesting:completionHandler:]): New private
method to create a MediaSessionCoordinatorProxyPrivate.
(-[WKMediaSessionCoordinatorHelper initWithCoordinator:]):
(-[WKMediaSessionCoordinatorHelper seekSessionToTime:withCompletion:]):
(-[WKMediaSessionCoordinatorHelper playSessionWithCompletion:]):
(-[WKMediaSessionCoordinatorHelper pauseSessionWithCompletion:]):
(-[WKMediaSessionCoordinatorHelper setSessionTrack:withCompletion:]):

  • UIProcess/Cocoa/WebViewImpl.h:

(WebKit::WebViewImpl::mediaSessionCoordinatorForTesting): MediaSessionCoordinatorProxyPrivate
getter.

  • UIProcess/Cocoa/WebViewImpl.mm:

(WebKit::WebViewImpl::setMediaSessionCoordinatorForTesting): Setter for
MediaSessionCoordinatorProxyPrivate drived object.

  • UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h: Add typedef for the completion

handler used by many coordinator proxy methods.

  • UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp:

(WebKit::RemoteMediaSessionCoordinatorProxy::RemoteMediaSessionCoordinatorProxy):
Set the private coordinator client so calls to the session can be forwarded.
(WebKit::RemoteMediaSessionCoordinatorProxy::join): Use MediaSessionCommandCompletionHandler.
(WebKit::RemoteMediaSessionCoordinatorProxy::coordinateSeekTo): Ditto.
(WebKit::RemoteMediaSessionCoordinatorProxy::coordinatePlay): Ditto.
(WebKit::RemoteMediaSessionCoordinatorProxy::coordinatePause): Ditto.
(WebKit::RemoteMediaSessionCoordinatorProxy::coordinateSetTrack): Ditto.
(WebKit::RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged): Ditto.

  • UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h:
  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::createMediaSessionCoordinator): Change completion handler
parameter to return a bool instead of a RemoteMediaSessionCoordinatorProxy as the
client interface provides all of the session access needed.

  • UIProcess/WebPageProxy.h:
  • WebKit.xcodeproj/project.pbxproj: Remove RemoteMediaSessionCoordinatorProxy.cpp

and RemoteMediaSessionCoordinator.cpp

  • WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp:

(WebKit::RemoteMediaSessionCoordinator::join): Use ExceptionData's toException()
method instead of creating an Exception directly. Remove the destination ID parameter
to sendWithAsyncReply so messageSenderDestinationID() will be used.
(WebKit::RemoteMediaSessionCoordinator::leave): Ditto.
(WebKit::RemoteMediaSessionCoordinator::seekTo) Ditto.:
(WebKit::RemoteMediaSessionCoordinator::play): Ditto.
(WebKit::RemoteMediaSessionCoordinator::pause): Ditto.
(WebKit::RemoteMediaSessionCoordinator::setTrack): Ditto.
(WebKit::RemoteMediaSessionCoordinator::positionStateChanged): Ditto.
(WebKit::RemoteMediaSessionCoordinator::readyStateChanged): Ditto.
(WebKit::RemoteMediaSessionCoordinator::playbackStateChanged): Ditto.
(WebKit::RemoteMediaSessionCoordinator::coordinatorStateChanged): Ditto.

Tools:

  • TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
  • TestWebKitAPI/TestWebKitAPI.xcodeproj/xcshareddata/xcschemes/TestWebKitAPI.xcscheme:
  • TestWebKitAPI/Tests/WebKit/MediaSessionCoordinatorTest.mm: Added.

(-[_WKMockMediaSessionCoordinator lastStateChange]):
(-[_WKMockMediaSessionCoordinator lastMethodCalled]):
(-[_WKMockMediaSessionCoordinator identifier]):
(-[_WKMockMediaSessionCoordinator joinWithCompletion:]):
(-[_WKMockMediaSessionCoordinator leave]):
(-[_WKMockMediaSessionCoordinator seekTo:withCompletion:]):
(-[_WKMockMediaSessionCoordinator playWithCompletion:]):
(-[_WKMockMediaSessionCoordinator pauseWithCompletion:]):
(-[_WKMockMediaSessionCoordinator setTrack:withCompletion:]):
(-[_WKMockMediaSessionCoordinator positionStateChanged:]):
(-[_WKMockMediaSessionCoordinator readyStateChanged:]):
(-[_WKMockMediaSessionCoordinator playbackStateChanged:]):
(-[_WKMockMediaSessionCoordinator coordinatorStateChanged:]):
(-[_WKMockMediaSessionCoordinator seekSessionToTime:]):
(-[_WKMockMediaSessionCoordinator playSession]):
(-[_WKMockMediaSessionCoordinator pauseSession]):
(-[_WKMockMediaSessionCoordinator setSessionTrack:]):
(TestWebKitAPI::MediaSessionCoordinatorTest::createCoordinator):
(TestWebKitAPI::MediaSessionCoordinatorTest::webView const):
(TestWebKitAPI::MediaSessionCoordinatorTest::coordinator const):
(TestWebKitAPI::MediaSessionCoordinatorTest::loadPageAndBecomeReady):
(TestWebKitAPI::MediaSessionCoordinatorTest::runScriptWithUserGesture):
(TestWebKitAPI::MediaSessionCoordinatorTest::play):
(TestWebKitAPI::MediaSessionCoordinatorTest::pause):
(TestWebKitAPI::MediaSessionCoordinatorTest::listenForEventMessages):
(TestWebKitAPI::MediaSessionCoordinatorTest::eventListenerWasCalled):
(TestWebKitAPI::MediaSessionCoordinatorTest::clearEventListenerState):
(TestWebKitAPI::MediaSessionCoordinatorTest::executeUntil):
(TestWebKitAPI::MediaSessionCoordinatorTest::waitForEventListenerToBeCalled):
(TestWebKitAPI::MediaSessionCoordinatorTest::listenForMessagesPosted):
(TestWebKitAPI::MediaSessionCoordinatorTest::clearMessagesPosted):
(TestWebKitAPI::MediaSessionCoordinatorTest::listenForSessionHandlerMessages):
(TestWebKitAPI::MediaSessionCoordinatorTest::sessionHandlerWasCalled):
(TestWebKitAPI::MediaSessionCoordinatorTest::waitForSessionHandlerToBeCalled):
(TestWebKitAPI::MediaSessionCoordinatorTest::listenForPromiseMessages):
(TestWebKitAPI::MediaSessionCoordinatorTest::clearPromiseMessages):
(TestWebKitAPI::MediaSessionCoordinatorTest::promiseWasResolved):
(TestWebKitAPI::MediaSessionCoordinatorTest::promiseWasRejected):
(TestWebKitAPI::MediaSessionCoordinatorTest::waitForPromise):
(TestWebKitAPI::TEST_F):

  • TestWebKitAPI/Tests/WebKitCocoa/media-remote.html:
Location:
trunk
Files:
1 added
16 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r275532 r275537  
     12021-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
    1672021-04-06  Aditya Keerthi  <akeerthi@apple.com>
    268
  • trunk/Source/WebKit/Sources.txt

    r275403 r275537  
    470470UIProcess/Media/AudioSessionRoutingArbitratorProxy.cpp
    471471UIProcess/Media/MediaUsageManager.cpp
     472UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp
    472473
    473474UIProcess/Notifications/NotificationPermissionRequestManagerProxy.cpp
     
    581582WebProcess/Inspector/WebPageInspectorTargetController.cpp
    582583WebProcess/Inspector/WebPageInspectorTargetFrontendChannel.cpp
     584
     585WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp
    583586
    584587WebProcess/MediaStream/MediaDeviceSandboxExtensions.cpp
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivateForTesting.h

    r275046 r275537  
    2727#import "WKWebViewPrivateForTestingMac.h"
    2828
     29NS_ASSUME_NONNULL_BEGIN
     30
    2931typedef enum {
    3032    WKWebViewAudioRoutingArbitrationStatusNone,
     
    3739    BOOL hasLoadedNonAppBoundRequestTesting;
    3840};
     41
     42@protocol _WKMediaSessionCoordinator;
    3943
    4044@interface WKWebView (WKTesting)
     
    100104- (void)_clearAppBoundNavigationData:(void(^)(void))completionHandler;
    101105
     106- (void)_createMediaSessionCoordinatorForTesting:(id <_WKMediaSessionCoordinator>)privateCoordinator completionHandler:(void(^)(BOOL))completionHandler;
     107
    102108@end
     109
     110typedef NS_ENUM(NSInteger, _WKMediaSessionReadyState) {
     111    WKMediaSessionReadyStateHaveNothing,
     112    WKMediaSessionReadyStateHaveMetadata,
     113    WKMediaSessionReadyStateHaveCurrentData,
     114    WKMediaSessionReadyStateHaveFutureData,
     115    WKMediaSessionReadyStateHaveEnoughData
     116};
     117
     118typedef NS_ENUM(NSInteger, _WKMediaSessionPlaybackState) {
     119    WKMediaSessionPlaybackStateNone,
     120    WKMediaSessionPlaybackStatePaused,
     121    WKMediaSessionPlaybackStatePlaying
     122};
     123
     124typedef NS_ENUM(NSInteger, _WKMediaSessionCoordinatorState) {
     125    WKMediaSessionCoordinatorStateWaiting,
     126    WKMediaSessionCoordinatorStateJoined,
     127    WKMediaSessionCoordinatorStateClosed
     128};
     129
     130struct _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
     158NS_ASSUME_NONNULL_END
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewTesting.mm

    r275046 r275537  
    2828
    2929#import "AudioSessionRoutingArbitratorProxy.h"
     30#import "MediaSessionCoordinatorProxyPrivate.h"
    3031#import "PlaybackSessionManagerProxy.h"
    3132#import "UserMediaProcessManager.h"
     
    4041#import <WebCore/RuntimeApplicationChecks.h>
    4142#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
    4354
    4455@implementation WKWebView (WKTesting)
     
    361372}
    362373
     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
    363573@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  
    153153class PageClientImpl;
    154154class DrawingAreaProxy;
     155class MediaSessionCoordinatorProxyPrivate;
    155156class SafeBrowsingWarning;
    156157class ViewGestureController;
     
    646647#endif
    647648
     649#if ENABLE(MEDIA_SESSION_COORDINATOR)
     650    MediaSessionCoordinatorProxyPrivate* mediaSessionCoordinatorForTesting() { return m_coordinatorForTesting.get(); }
     651    void setMediaSessionCoordinatorForTesting(MediaSessionCoordinatorProxyPrivate*);
     652#endif
     653
    648654private:
    649655#if HAVE(TOUCH_BAR)
     
    852858    CompletionHandler<void(WebCore::DOMPasteAccessResponse)> m_domPasteRequestHandler;
    853859
     860#if ENABLE(MEDIA_SESSION_COORDINATOR)
     861    RefPtr<MediaSessionCoordinatorProxyPrivate> m_coordinatorForTesting;
     862#endif
     863
    854864#if USE(APPLE_INTERNAL_SDK)
    855865#import <WebKitAdditions/WebViewImplAdditionsAfter.h>
  • trunk/Source/WebKit/UIProcess/Cocoa/WebViewImpl.mm

    r274815 r275537  
    140140#endif
    141141
     142#if ENABLE(MEDIA_SESSION_COORDINATOR)
     143#include <WebKit/MediaSessionCoordinatorProxyPrivate.h>
     144#endif
     145
    142146#if HAVE(TRANSLATION_UI_SERVICES)
    143147#import <TranslationUIServices/LTUITranslationViewController.h>
     
    55835587}
    55845588
     5589#if ENABLE(MEDIA_SESSION_COORDINATOR)
     5590void WebViewImpl::setMediaSessionCoordinatorForTesting(MediaSessionCoordinatorProxyPrivate* coordinator)
     5591{
     5592    m_coordinatorForTesting = coordinator;
     5593}
     5594#endif
     5595
    55855596#if HAVE(TRANSLATION_UI_SERVICES) && ENABLE(CONTEXT_MENUS)
    55865597
  • trunk/Source/WebKit/UIProcess/Media/MediaSessionCoordinatorProxyPrivate.h

    r275484 r275537  
    3939namespace WebKit {
    4040
     41using MediaSessionCommandCompletionHandler = CompletionHandler<void(Optional<WebCore::ExceptionData>&&)>;
     42
    4143class MediaSessionCoordinatorProxyPrivate
    4244    : public CanMakeWeakPtr<MediaSessionCoordinatorProxyPrivate>
     
    4749    virtual String identifier() const = 0;
    4850
    49     virtual void join(CompletionHandler<void(Optional<WebCore::ExceptionData>&&)>&&) = 0;
     51    virtual void join(MediaSessionCommandCompletionHandler&&) = 0;
    5052    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;
    5557
    5658    virtual void positionStateChanged(const Optional<WebCore::MediaPositionState>&) = 0;
  • trunk/Source/WebKit/UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp

    r275458 r275537  
    6060#endif
    6161{
     62    m_privateCoordinator->setClient(makeWeakPtr(this));
    6263    m_webPageProxy.process().addMessageReceiver(Messages::RemoteMediaSessionCoordinatorProxy::messageReceiverName(), m_webPageProxy.webPageID(), *this);
    6364}
     
    6869}
    6970
    70 void RemoteMediaSessionCoordinatorProxy::join(CommandCompletionHandler&& completionHandler)
     71void RemoteMediaSessionCoordinatorProxy::join(MediaSessionCommandCompletionHandler&& completionHandler)
    7172{
    7273    auto identifier = LOGIDENTIFIER;
     
    8687}
    8788
    88 void RemoteMediaSessionCoordinatorProxy::coordinateSeekTo(double time, CommandCompletionHandler&& completionHandler)
     89void RemoteMediaSessionCoordinatorProxy::coordinateSeekTo(double time, MediaSessionCommandCompletionHandler&& completionHandler)
    8990{
    9091    auto identifier = LOGIDENTIFIER;
     
    9798}
    9899
    99 void RemoteMediaSessionCoordinatorProxy::coordinatePlay(CommandCompletionHandler&& completionHandler)
     100void RemoteMediaSessionCoordinatorProxy::coordinatePlay(MediaSessionCommandCompletionHandler&& completionHandler)
    100101{
    101102    auto identifier = LOGIDENTIFIER;
     
    108109}
    109110
    110 void RemoteMediaSessionCoordinatorProxy::coordinatePause(CommandCompletionHandler&& completionHandler)
     111void RemoteMediaSessionCoordinatorProxy::coordinatePause(MediaSessionCommandCompletionHandler&& completionHandler)
    111112{
    112113    auto identifier = LOGIDENTIFIER;
     
    119120}
    120121
    121 void RemoteMediaSessionCoordinatorProxy::coordinateSetTrack(const String& track, CommandCompletionHandler&& completionHandler)
     122void RemoteMediaSessionCoordinatorProxy::coordinateSetTrack(const String& track, MediaSessionCommandCompletionHandler&& completionHandler)
    122123{
    123124    auto identifier = LOGIDENTIFIER;
     
    148149}
    149150
     151void RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged(WebCore::MediaSessionCoordinatorState state)
     152{
     153    ALWAYS_LOG(LOGIDENTIFIER);
     154    m_privateCoordinator->coordinatorStateChanged(state);
     155}
     156
    150157void RemoteMediaSessionCoordinatorProxy::seekSessionToTime(double time, CompletionHandler<void(bool)>&& callback)
    151158{
     
    168175}
    169176
    170 void RemoteMediaSessionCoordinatorProxy::coordinatorStateChanged(WebCore::MediaSessionCoordinatorState state)
    171 {
    172     ALWAYS_LOG(LOGIDENTIFIER);
    173     m_privateCoordinator->coordinatorStateChanged(state);
    174 }
    175 
    176177#if !RELEASE_LOG_DISABLED
    177178WTFLogChannel& RemoteMediaSessionCoordinatorProxy::logChannel() const
  • trunk/Source/WebKit/UIProcess/Media/RemoteMediaSessionCoordinatorProxy.h

    r275458 r275537  
    4242
    4343class RemoteMediaSessionCoordinatorProxy
    44     : public IPC::MessageReceiver
     44    : private IPC::MessageReceiver
    4545    , public RefCounted<RemoteMediaSessionCoordinatorProxy>
    4646    , public WebCore::MediaSessionCoordinatorClient {
     
    6161    explicit RemoteMediaSessionCoordinatorProxy(WebPageProxy&, Ref<MediaSessionCoordinatorProxyPrivate>&&);
    6262
    63     using CoordinateCompletionHandler = CompletionHandler<void(const WebCore::ExceptionData&)>;
    64 
    6563    // IPC::MessageReceiver.
    6664    void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;
    6765
    6866    // Receivers.
    69     using CommandCompletionHandler = CompletionHandler<void(Optional<WebCore::ExceptionData>&&)>;
    70     void join(CommandCompletionHandler&&);
     67    void join(MediaSessionCommandCompletionHandler&&);
    7168    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&&);
    7673    void positionStateChanged(const Optional<WebCore::MediaPositionState>&);
    7774    void readyStateChanged(WebCore::MediaSessionReadyState);
  • trunk/Source/WebKit/UIProcess/WebPageProxy.cpp

    r275491 r275537  
    1040410404
    1040510405#if ENABLE(MEDIA_SESSION_COORDINATOR)
    10406 void WebPageProxy::createMediaSessionCoordinator(Ref<MediaSessionCoordinatorProxyPrivate>&& privateCoordinator, CompletionHandler<void(WeakPtr<RemoteMediaSessionCoordinatorProxy>)>&& completionHandler)
     10406void WebPageProxy::createMediaSessionCoordinator(Ref<MediaSessionCoordinatorProxyPrivate>&& privateCoordinator, CompletionHandler<void(bool)>&& completionHandler)
    1040710407{
    1040810408    ASSERT(!m_mediaSessionCoordinatorProxy);
     
    1041110411
    1041210412        if (!weakThis || !success) {
    10413             completionHandler({ });
     10413            completionHandler(false);
    1041410414            return;
    1041510415        }
    1041610416
    1041710417        weakThis->m_mediaSessionCoordinatorProxy = RemoteMediaSessionCoordinatorProxy::create(*weakThis, WTFMove(privateCoordinator));
    10418         completionHandler(makeWeakPtr(weakThis->m_mediaSessionCoordinatorProxy.get()));
     10418        completionHandler(true);
    1041910419    });
    1042010420}
  • trunk/Source/WebKit/UIProcess/WebPageProxy.h

    r275491 r275537  
    18931893
    18941894#if ENABLE(MEDIA_SESSION_COORDINATOR)
    1895     void createMediaSessionCoordinator(Ref<MediaSessionCoordinatorProxyPrivate>&&, CompletionHandler<void(WeakPtr<RemoteMediaSessionCoordinatorProxy>)>&&);
     1895    void createMediaSessionCoordinator(Ref<MediaSessionCoordinatorProxyPrivate>&&, CompletionHandler<void(bool)>&&);
    18961896#endif
    18971897
  • trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj

    r275458 r275537  
    106106                074879B92373A90900F5678E /* AppKitSoftLink.h in Headers */ = {isa = PBXBuildFile; fileRef = 074879B72373A90900F5678E /* AppKitSoftLink.h */; };
    107107                074E75FE1DF2211900D318EC /* UserMediaProcessManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 074E75FB1DF1FD1300D318EC /* UserMediaProcessManager.h */; };
     108                075A9CF326169BAB006DFA3A /* MediaSessionCoordinatorProxyPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 077BA570260E8F630072F19F /* MediaSessionCoordinatorProxyPrivate.h */; };
    108109                076E884E1A13CADF005E90FC /* APIContextMenuClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 076E884D1A13CADF005E90FC /* APIContextMenuClient.h */; };
    109110                0772811D21234FF600C8EF2E /* UserMediaPermissionRequestManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A410F4319AF7B27002EBAB5 /* UserMediaPermissionRequestManager.h */; };
    110                 077BA56E260E6D1C0072F19F /* RemoteMediaSessionCoordinator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0736B755260D03A000E06994 /* RemoteMediaSessionCoordinator.cpp */; };
    111111                07923148239CBCB8009598E2 /* RemoteMediaPlayerManagerProxyMessagesReplies.h in Headers */ = {isa = PBXBuildFile; fileRef = 07923142239CBCB5009598E2 /* RemoteMediaPlayerManagerProxyMessagesReplies.h */; };
    112112                0792314B239CBCB8009598E2 /* RemoteMediaPlayerManagerProxyMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07923145239CBCB7009598E2 /* RemoteMediaPlayerManagerProxyMessageReceiver.cpp */; };
     
    18651865                CD19A26E1A13E834008D650E /* WebDiagnosticLoggingClient.h in Headers */ = {isa = PBXBuildFile; fileRef = CD19A26A1A13E821008D650E /* WebDiagnosticLoggingClient.h */; };
    18661866                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 */; };
    18681867                CD3EEF462579C261006563BB /* RemoteMediaEngineConfigurationFactoryProxyMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD3EEF442579C1D4006563BB /* RemoteMediaEngineConfigurationFactoryProxyMessageReceiver.cpp */; };
    18691868                CD4570D3244113B500A3DCEB /* AudioSessionRoutingArbitratorProxyMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD4570D02441014A00A3DCEB /* AudioSessionRoutingArbitratorProxyMessageReceiver.cpp */; };
     
    92699268                                5CBC9B8B1C65257300A8FDCF /* NetworkDataTaskCocoa.mm */,
    92709269                                7EC4F0F918E4A945008056AF /* NetworkProcessCocoa.mm */,
     9270                                518324782615B00D003F239E /* NetworkSchemeURLProtocol.h */,
     9271                                518324792615B00D003F239E /* NetworkSchemeURLProtocol.mm */,
    92719272                                532159501DBAE6D70054AA3C /* NetworkSessionCocoa.h */,
    92729273                                5C20CB9B1BB0DCD200895BB1 /* NetworkSessionCocoa.mm */,
    9273                                 518324782615B00D003F239E /* NetworkSchemeURLProtocol.h */,
    9274                                 518324792615B00D003F239E /* NetworkSchemeURLProtocol.mm */,
    92759274                                41287D4C225C05C5009A3E26 /* WebSocketTaskCocoa.h */,
    92769275                                41287D4B225C05C4009A3E26 /* WebSocketTaskCocoa.mm */,
     
    1167711676                                00B9661618E24CBA00CE1F88 /* APIFindClient.h in Headers */,
    1167811677                                2DD67A2E1BD819730053B251 /* APIFindMatchesClient.h in Headers */,
    11679                                 5183247D26168FF7003F239E /* NetworkURLSchemeTask.h in Headers */,
    1168011678                                37E25D6E18FDE5D6005D3A00 /* APIFormClient.h in Headers */,
    1168111679                                1AC1337218566C7C00F3EC05 /* APIFrameHandle.h in Headers */,
     
    1193011928                                A1B4DCE125A7923C007D178C /* MediaSampleByteRange.h in Headers */,
    1193111929                                A15799BD2584433200528236 /* MediaSampleCursor.h in Headers */,
     11930                                075A9CF326169BAB006DFA3A /* MediaSessionCoordinatorProxyPrivate.h in Headers */,
    1193211931                                A15799B72584433200528236 /* MediaTrackReader.h in Headers */,
    1193311932                                51933DEF1965EB31008AC3EA /* MenuUtilities.h in Headers */,
     
    1199811997                                532159551DBAE7290054AA3C /* NetworkSessionCocoa.h in Headers */,
    1199911998                                417915B92257046F00D6F97E /* NetworkSocketChannel.h in Headers */,
     11999                                5183247C26168C62003F239E /* NetworkURLSchemeHandler.h in Headers */,
     12000                                5183247D26168FF7003F239E /* NetworkURLSchemeTask.h in Headers */,
    1200012001                                570DAAC22303730300E8FC04 /* NfcConnection.h in Headers */,
    1200112002                                570DAAAE23026F5C00E8FC04 /* NfcService.h in Headers */,
     
    1282812829                                CE21215F240EE571006ED443 /* WKTextPlaceholder.h in Headers */,
    1282912830                                CE45945C240F88550078019F /* WKTextSelectionRect.h in Headers */,
    12830                                 5183247C26168C62003F239E /* NetworkURLSchemeHandler.h in Headers */,
    1283112831                                2EB6FC01203021960017E619 /* WKTimePickerViewController.h in Headers */,
    1283212832                                71A676A622C62325007D6295 /* WKTouchActionGestureRecognizer.h in Headers */,
     
    1400614006                                071BC58F23CE1EAA00680D7C /* RemoteMediaPlayerProxyMessageReceiver.cpp in Sources */,
    1400714007                                1D4D737023A9E54700717A25 /* RemoteMediaResourceManagerMessageReceiver.cpp in Sources */,
    14008                                 077BA56E260E6D1C0072F19F /* RemoteMediaSessionCoordinator.cpp in Sources */,
    14009                                 CD1FE2D72613E18600ADC29B /* RemoteMediaSessionCoordinatorProxy.cpp in Sources */,
    1401014008                                1DD2A6632561246F00FF7B6F /* RemoteMediaSourceProxyMessageReceiver.cpp in Sources */,
    1401114009                                1AC1338518590C4600F3EC05 /* RemoteObjectRegistryMessageReceiver.cpp in Sources */,
  • trunk/Source/WebKit/WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp

    r275314 r275537  
    7373
    7474        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    });
    8181}
    8282
    8383void RemoteMediaSessionCoordinator::leave()
    8484{
    85     m_page.send(Messages::RemoteMediaSessionCoordinatorProxy::Leave { }, 0);
     85    m_page.send(Messages::RemoteMediaSessionCoordinatorProxy::Leave { });
    8686}
    8787
     
    9696
    9797        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    });
    104104}
    105105
     
    114114
    115115        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    });
    122122}
    123123
     
    132132
    133133        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    });
    140140}
    141141
     
    150150
    151151        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    });
    158158}
    159159
     
    161161{
    162162    ALWAYS_LOG_IF_POSSIBLE(LOGIDENTIFIER);
    163     m_page.send(Messages::RemoteMediaSessionCoordinatorProxy::PositionStateChanged { state }, 0);
     163    m_page.send(Messages::RemoteMediaSessionCoordinatorProxy::PositionStateChanged { state });
    164164}
    165165
     
    167167{
    168168    ALWAYS_LOG_IF_POSSIBLE(LOGIDENTIFIER, state);
    169     m_page.send(Messages::RemoteMediaSessionCoordinatorProxy::ReadyStateChanged { state }, 0);
     169    m_page.send(Messages::RemoteMediaSessionCoordinatorProxy::ReadyStateChanged { state });
    170170}
    171171
     
    173173{
    174174    ALWAYS_LOG_IF_POSSIBLE(LOGIDENTIFIER, state);
    175     m_page.send(Messages::RemoteMediaSessionCoordinatorProxy::PlaybackStateChanged { state }, 0);
     175    m_page.send(Messages::RemoteMediaSessionCoordinatorProxy::PlaybackStateChanged { state });
    176176}
    177177
     
    179179{
    180180    ALWAYS_LOG_IF_POSSIBLE(LOGIDENTIFIER, state);
    181     m_page.send(Messages::RemoteMediaSessionCoordinatorProxy::CoordinatorStateChanged { state }, 0);
     181    m_page.send(Messages::RemoteMediaSessionCoordinatorProxy::CoordinatorStateChanged { state });
    182182}
    183183
  • trunk/Tools/ChangeLog

    r275534 r275537  
     12021-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
    1542021-04-06  David Kilzer  <ddkilzer@apple.com>
    255
  • trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj

    r275410 r275537  
    5555                074994421EA5034B000DA45E /* getUserMediaAudioVideoCapture.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 4A410F4D19AF7BEF002EBAC5 /* getUserMediaAudioVideoCapture.html */; };
    5656                074994521EA5034B000DA44E /* getUserMedia2.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 41BAF4E225AC9DB800D82F32 /* getUserMedia2.html */; };
     57                075A9CF526177218006DFA3A /* MediaSessionCoordinatorTest.mm in Sources */ = {isa = PBXBuildFile; fileRef = 075A9CF426177217006DFA3A /* MediaSessionCoordinatorTest.mm */; };
    5758                076E507F1F4513D6006E9F5A /* Logging.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 076E507E1F45031E006E9F5A /* Logging.cpp */; };
    5859                077A5AF3230638A600A7105C /* AccessibilityTestPlugin.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0746645822FF630500E3451A /* AccessibilityTestPlugin.mm */; };
     
    17611762                07492B391DF8ADA400633DE1 /* enumerateMediaDevices.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = enumerateMediaDevices.html; sourceTree = "<group>"; };
    17621763                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>"; };
    17631765                0766DD1F1A5AD5200023E3BB /* PendingAPIRequestURL.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PendingAPIRequestURL.cpp; sourceTree = "<group>"; };
    17641766                076E507E1F45031E006E9F5A /* Logging.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Logging.cpp; sourceTree = "<group>"; };
     
    42754277                                33DC89131419579F00747EF7 /* LoadCanceledNoServerRedirectCallback_Bundle.cpp */,
    42764278                                8AA28C1916D2FA7B002FF4DB /* LoadPageOnCrash.cpp */,
     4279                                075A9CF426177217006DFA3A /* MediaSessionCoordinatorTest.mm */,
    42774280                                CDC9442C1EF1FC080059C3C4 /* MediaStreamTrackDetached.mm */,
    42784281                                7A5623101AD5AF3E0096B920 /* MenuTypesForMouseEvents.cpp */,
     
    55015504                                CDA315981ED53651009F60D3 /* MediaPlaybackSleepAssertion.mm in Sources */,
    55025505                                0794740D25CA0BDE00C597EB /* MediaSession.mm in Sources */,
     5506                                075A9CF526177218006DFA3A /* MediaSessionCoordinatorTest.mm in Sources */,
    55035507                                CDC9442E1EF1FC080059C3C4 /* MediaStreamTrackDetached.mm in Sources */,
    55045508                                51BE9E662376089F00B4E117 /* MediaType.mm in Sources */,
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/media-remote.html

    r272445 r275537  
    4141            postMessage('set metadata')
    4242        }
     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        }
    4356
    4457        function setPlaylistMetadata(index)
    4558        {
    4659            setMetadata(playlist.metadata[index]);
    47        
    4860        }
    4961
     
    5769            const actions = {
    5870                'play' : () => { postMessage('play handler'); },
    59 
    6071                'pause' : () => { postMessage('pause handler') },
    61                
    6272                'seekto' : (details) => { postMessage('seekto handler') },
    63 
    6473                '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') },
    7076                'nexttrack' : () => { postMessage('nexttrack handler') },
    7177            };
     
    96102        }
    97103       
     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       
    98113        function load()
    99114        {
     
    113128        }
    114129
    115        
     130        const session = navigator.mediaSession;
     131
    116132        window.addEventListener("load", evt => {
    117133            audio = document.getElementsByTagName('audio')[0];
     
    120136            audio.addEventListener('pause', postEvent);
    121137            audio.addEventListener('seeked', postEvent);
     138            navigator.mediaSession.addEventListener('coordinatorchange', postEvent);
    122139        }, false);
    123140
Note: See TracChangeset for help on using the changeset viewer.