Title: [274249] trunk/Source
Revision
274249
Author
[email protected]
Date
2021-03-10 16:05:12 -0800 (Wed, 10 Mar 2021)

Log Message

Add plumbing for `defaultPlaybackRate` to AVKit
https://bugs.webkit.org/show_bug.cgi?id=222991
<rdar://problem/75012417>

Reviewed by Eric Carlson.

Source/WebCore:

* platform/cocoa/PlaybackSessionModel.h:
(WebCore::PlaybackSessionModelClient::rateChanged):
* platform/cocoa/PlaybackSessionModelMediaElement.h:
* platform/cocoa/PlaybackSessionModelMediaElement.mm:
(WebCore::PlaybackSessionModelMediaElement::updateForEventName):
(WebCore::PlaybackSessionModelMediaElement::setDefaultPlaybackRate): Added.
(WebCore::PlaybackSessionModelMediaElement::defaultPlaybackRate const): Added.
(WebCore::PlaybackSessionModelMediaElement::playbackRate const):

* platform/ios/PlaybackSessionInterfaceAVKit.h:
* platform/ios/PlaybackSessionInterfaceAVKit.mm:
(WebCore::PlaybackSessionInterfaceAVKit::PlaybackSessionInterfaceAVKit):
(WebCore::PlaybackSessionInterfaceAVKit::rateChanged):
* platform/ios/WebVideoFullscreenControllerAVKit.mm:
(VideoFullscreenControllerContext::rateChanged):
(VideoFullscreenControllerContext::setDefaultPlaybackRate): Added.
(VideoFullscreenControllerContext::defaultPlaybackRate const): Added.
* platform/ios/WebAVPlayerController.h:
* platform/ios/WebAVPlayerController.mm:
(-[WebAVPlayerController init]):
(-[WebAVPlayerController dealloc]):
(-[WebAVPlayerController observeValueForKeyPath:ofObject:change:context:]):

* platform/mac/PlaybackSessionInterfaceMac.h:
* platform/mac/PlaybackSessionInterfaceMac.mm:
(WebCore::PlaybackSessionInterfaceMac::rateChanged):
(WebCore::PlaybackSessionInterfaceMac::setPlayBackControlsManager):
* platform/mac/VideoFullscreenInterfaceMac.h:
* platform/mac/VideoFullscreenInterfaceMac.mm:
(WebCore::VideoFullscreenInterfaceMac::rateChanged):
* platform/mac/WebPlaybackControlsManager.h:
* platform/mac/WebPlaybackControlsManager.mm:

Source/WebCore/PAL:

* pal/spi/cocoa/AVKitSPI.h:

Source/WebKit:

* WebProcess/cocoa/PlaybackSessionManager.messages.in:
* WebProcess/cocoa/PlaybackSessionManager.h:
* WebProcess/cocoa/PlaybackSessionManager.mm:
(WebKit::PlaybackSessionInterfaceContext::rateChanged):
(WebKit::PlaybackSessionManager::rateChanged):
(WebKit::PlaybackSessionManager::setDefaultPlaybackRate): Added.

* UIProcess/Cocoa/PlaybackSessionManagerProxy.messages.in:
* UIProcess/Cocoa/PlaybackSessionManagerProxy.h:
* UIProcess/Cocoa/PlaybackSessionManagerProxy.mm:
(WebKit::PlaybackSessionModelContext::setDefaultPlaybackRate): Added.
(WebKit::PlaybackSessionModelContext::rateChanged):
(WebKit::PlaybackSessionManagerProxy::rateChanged):
(WebKit::PlaybackSessionManagerProxy::setDefaultPlaybackRate): Added.

* UIProcess/ios/fullscreen/WKFullScreenViewController.mm:
(WKFullScreenViewControllerPlaybackSessionModelClient::rateChanged):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (274248 => 274249)


--- trunk/Source/WebCore/ChangeLog	2021-03-11 00:01:13 UTC (rev 274248)
+++ trunk/Source/WebCore/ChangeLog	2021-03-11 00:05:12 UTC (rev 274249)
@@ -1,3 +1,44 @@
+2021-03-10  Devin Rousso  <[email protected]>
+
+        Add plumbing for `defaultPlaybackRate` to AVKit
+        https://bugs.webkit.org/show_bug.cgi?id=222991
+        <rdar://problem/75012417>
+
+        Reviewed by Eric Carlson.
+
+        * platform/cocoa/PlaybackSessionModel.h:
+        (WebCore::PlaybackSessionModelClient::rateChanged):
+        * platform/cocoa/PlaybackSessionModelMediaElement.h:
+        * platform/cocoa/PlaybackSessionModelMediaElement.mm:
+        (WebCore::PlaybackSessionModelMediaElement::updateForEventName):
+        (WebCore::PlaybackSessionModelMediaElement::setDefaultPlaybackRate): Added.
+        (WebCore::PlaybackSessionModelMediaElement::defaultPlaybackRate const): Added.
+        (WebCore::PlaybackSessionModelMediaElement::playbackRate const):
+
+        * platform/ios/PlaybackSessionInterfaceAVKit.h:
+        * platform/ios/PlaybackSessionInterfaceAVKit.mm:
+        (WebCore::PlaybackSessionInterfaceAVKit::PlaybackSessionInterfaceAVKit):
+        (WebCore::PlaybackSessionInterfaceAVKit::rateChanged):
+        * platform/ios/WebVideoFullscreenControllerAVKit.mm:
+        (VideoFullscreenControllerContext::rateChanged):
+        (VideoFullscreenControllerContext::setDefaultPlaybackRate): Added.
+        (VideoFullscreenControllerContext::defaultPlaybackRate const): Added.
+        * platform/ios/WebAVPlayerController.h:
+        * platform/ios/WebAVPlayerController.mm:
+        (-[WebAVPlayerController init]):
+        (-[WebAVPlayerController dealloc]):
+        (-[WebAVPlayerController observeValueForKeyPath:ofObject:change:context:]):
+
+        * platform/mac/PlaybackSessionInterfaceMac.h:
+        * platform/mac/PlaybackSessionInterfaceMac.mm:
+        (WebCore::PlaybackSessionInterfaceMac::rateChanged):
+        (WebCore::PlaybackSessionInterfaceMac::setPlayBackControlsManager):
+        * platform/mac/VideoFullscreenInterfaceMac.h:
+        * platform/mac/VideoFullscreenInterfaceMac.mm:
+        (WebCore::VideoFullscreenInterfaceMac::rateChanged):
+        * platform/mac/WebPlaybackControlsManager.h:
+        * platform/mac/WebPlaybackControlsManager.mm:
+
 2021-03-10  Antoine Quint  <[email protected]>
 
         Improve font-variation-settings interpolation

Modified: trunk/Source/WebCore/PAL/ChangeLog (274248 => 274249)


--- trunk/Source/WebCore/PAL/ChangeLog	2021-03-11 00:01:13 UTC (rev 274248)
+++ trunk/Source/WebCore/PAL/ChangeLog	2021-03-11 00:05:12 UTC (rev 274249)
@@ -1,3 +1,13 @@
+2021-03-10  Devin Rousso  <[email protected]>
+
+        Add plumbing for `defaultPlaybackRate` to AVKit
+        https://bugs.webkit.org/show_bug.cgi?id=222991
+        <rdar://problem/75012417>
+
+        Reviewed by Eric Carlson.
+
+        * pal/spi/cocoa/AVKitSPI.h:
+
 2021-03-09  Ben Nham  <[email protected]>
 
         Adopt new NSURLSessionConfiguration SPI for connection cache configuration

Modified: trunk/Source/WebCore/PAL/pal/spi/cocoa/AVKitSPI.h (274248 => 274249)


--- trunk/Source/WebCore/PAL/pal/spi/cocoa/AVKitSPI.h	2021-03-11 00:01:13 UTC (rev 274248)
+++ trunk/Source/WebCore/PAL/pal/spi/cocoa/AVKitSPI.h	2021-03-11 00:05:12 UTC (rev 274249)
@@ -230,6 +230,11 @@
 
 #endif // USE(APPLE_INTERNAL_SDK)
 
+#if PLATFORM(IOS_FAMILY)
+@interface AVPlayerController ()
+@property (NS_NONATOMIC_IOSONLY) double defaultPlaybackRate;
+@end
+#endif // PLATFORM(IOS_FAMILY)
 
 #if HAVE(AVOBSERVATIONCONTROLLER)
 #if USE(APPLE_INTERNAL_SDK)

Modified: trunk/Source/WebCore/platform/cocoa/PlaybackSessionModel.h (274248 => 274249)


--- trunk/Source/WebCore/platform/cocoa/PlaybackSessionModel.h	2021-03-11 00:01:13 UTC (rev 274248)
+++ trunk/Source/WebCore/platform/cocoa/PlaybackSessionModel.h	2021-03-11 00:05:12 UTC (rev 274249)
@@ -55,6 +55,7 @@
     virtual void beginScanningForward() = 0;
     virtual void beginScanningBackward() = 0;
     virtual void endScanning() = 0;
+    virtual void setDefaultPlaybackRate(float) = 0;
     virtual void selectAudioMediaOption(uint64_t index) = 0;
     virtual void selectLegibleMediaOption(uint64_t index) = 0;
     virtual void togglePictureInPicture() = 0;
@@ -72,6 +73,7 @@
     virtual double bufferedTime() const = 0;
     virtual bool isPlaying() const = 0;
     virtual bool isScrubbing() const = 0;
+    virtual float defaultPlaybackRate() const = 0;
     virtual float playbackRate() const = 0;
     virtual Ref<TimeRanges> seekableRanges() const = 0;
     virtual double seekableTimeRangesLastModifiedTime() const = 0;
@@ -98,7 +100,7 @@
     virtual void currentTimeChanged(double /* currentTime */, double /* anchorTime */) { }
     virtual void bufferedTimeChanged(double) { }
     virtual void playbackStartedTimeChanged(double /* playbackStartedTime */) { }
-    virtual void rateChanged(bool /* isPlaying */, float /* playbackRate */) { }
+    virtual void rateChanged(bool /* isPlaying */, float /* playbackRate */, float /* defaultPlaybackRate */) { }
     virtual void seekableRangesChanged(const TimeRanges&, double /* lastModified */, double /* liveInterval */) { }
     virtual void canPlayFastReverseChanged(bool) { }
     virtual void audioMediaSelectionOptionsChanged(const Vector<MediaSelectionOption>& /* options */, uint64_t /* selectedIndex */) { }

Modified: trunk/Source/WebCore/platform/cocoa/PlaybackSessionModelMediaElement.h (274248 => 274249)


--- trunk/Source/WebCore/platform/cocoa/PlaybackSessionModelMediaElement.h	2021-03-11 00:01:13 UTC (rev 274248)
+++ trunk/Source/WebCore/platform/cocoa/PlaybackSessionModelMediaElement.h	2021-03-11 00:05:12 UTC (rev 274249)
@@ -68,6 +68,7 @@
     WEBCORE_EXPORT void beginScanningForward() final;
     WEBCORE_EXPORT void beginScanningBackward() final;
     WEBCORE_EXPORT void endScanning() final;
+    WEBCORE_EXPORT void setDefaultPlaybackRate(float) final;
     WEBCORE_EXPORT void selectAudioMediaOption(uint64_t index) final;
     WEBCORE_EXPORT void selectLegibleMediaOption(uint64_t index) final;
     WEBCORE_EXPORT void togglePictureInPicture() final;
@@ -82,6 +83,7 @@
     double bufferedTime() const final;
     bool isPlaying() const final;
     bool isScrubbing() const final { return false; }
+    float defaultPlaybackRate() const final;
     float playbackRate() const final;
     Ref<TimeRanges> seekableRanges() const final;
     double seekableTimeRangesLastModifiedTime() const final;

Modified: trunk/Source/WebCore/platform/cocoa/PlaybackSessionModelMediaElement.mm (274248 => 274249)


--- trunk/Source/WebCore/platform/cocoa/PlaybackSessionModelMediaElement.mm	2021-03-11 00:01:13 UTC (rev 274248)
+++ trunk/Source/WebCore/platform/cocoa/PlaybackSessionModelMediaElement.mm	2021-03-11 00:05:12 UTC (rev 274249)
@@ -164,8 +164,9 @@
         || eventName == eventNames().canplayEvent) {
         bool isPlaying = this->isPlaying();
         float playbackRate = isStalled() ? StalledPlaybackRate : this->playbackRate();
+        float defaultPlaybackRate = this->defaultPlaybackRate();
         for (auto client : m_clients)
-            client->rateChanged(isPlaying, playbackRate);
+            client->rateChanged(isPlaying, playbackRate, defaultPlaybackRate);
     }
 
     if (all
@@ -301,6 +302,12 @@
         m_mediaElement->endScanning();
 }
 
+void PlaybackSessionModelMediaElement::setDefaultPlaybackRate(float defaultPlaybackRate)
+{
+    if (m_mediaElement)
+        m_mediaElement->setDefaultPlaybackRate(defaultPlaybackRate);
+}
+
 void PlaybackSessionModelMediaElement::selectAudioMediaOption(uint64_t selectedAudioIndex)
 {
     if (!m_mediaElement)
@@ -468,9 +475,14 @@
     return m_mediaElement && m_mediaElement->readyState() <= HTMLMediaElement::HAVE_CURRENT_DATA;
 }
 
+float PlaybackSessionModelMediaElement::defaultPlaybackRate() const
+{
+    return m_mediaElement ? m_mediaElement->defaultPlaybackRate() : -1;
+}
+
 float PlaybackSessionModelMediaElement::playbackRate() const
 {
-    return m_mediaElement ? m_mediaElement->playbackRate() : 0;
+    return m_mediaElement ? m_mediaElement->playbackRate() : -1;
 }
 
 Ref<TimeRanges> PlaybackSessionModelMediaElement::seekableRanges() const

Modified: trunk/Source/WebCore/platform/ios/PlaybackSessionInterfaceAVKit.h (274248 => 274249)


--- trunk/Source/WebCore/platform/ios/PlaybackSessionInterfaceAVKit.h	2021-03-11 00:01:13 UTC (rev 274248)
+++ trunk/Source/WebCore/platform/ios/PlaybackSessionInterfaceAVKit.h	2021-03-11 00:05:12 UTC (rev 274249)
@@ -63,7 +63,7 @@
     void durationChanged(double) override;
     void currentTimeChanged(double currentTime, double anchorTime) override;
     void bufferedTimeChanged(double) override;
-    void rateChanged(bool isPlaying, float playbackRate) override;
+    void rateChanged(bool isPlaying, float playbackRate, float defaultPlaybackRate) override;
     void seekableRangesChanged(const TimeRanges&, double lastModifiedTime, double liveUpdateInterval) override;
     void canPlayFastReverseChanged(bool) override;
     void audioMediaSelectionOptionsChanged(const Vector<MediaSelectionOption>& options, uint64_t selectedIndex) override;

Modified: trunk/Source/WebCore/platform/ios/PlaybackSessionInterfaceAVKit.mm (274248 => 274249)


--- trunk/Source/WebCore/platform/ios/PlaybackSessionInterfaceAVKit.mm	2021-03-11 00:01:13 UTC (rev 274248)
+++ trunk/Source/WebCore/platform/ios/PlaybackSessionInterfaceAVKit.mm	2021-03-11 00:05:12 UTC (rev 274249)
@@ -61,7 +61,7 @@
     durationChanged(model.duration());
     currentTimeChanged(model.currentTime(), [[NSProcessInfo processInfo] systemUptime]);
     bufferedTimeChanged(model.bufferedTime());
-    rateChanged(model.isPlaying(), model.playbackRate());
+    rateChanged(model.isPlaying(), model.playbackRate(), model.defaultPlaybackRate());
     seekableRangesChanged(model.seekableRanges(), model.seekableTimeRangesLastModifiedTime(), model.liveUpdateInterval());
     canPlayFastReverseChanged(model.canPlayFastReverse());
     audioMediaSelectionOptionsChanged(model.audioMediaSelectionOptions(), model.audioMediaSelectedIndex());
@@ -124,9 +124,10 @@
     playerController.loadedTimeRanges = @[@0, @(normalizedBufferedTime)];
 }
 
-void PlaybackSessionInterfaceAVKit::rateChanged(bool isPlaying, float playbackRate)
+void PlaybackSessionInterfaceAVKit::rateChanged(bool isPlaying, float playbackRate, float defaultPlaybackRate)
 {
     [m_playerController setRate:isPlaying ? playbackRate : 0.];
+    [m_playerController setDefaultPlaybackRate:defaultPlaybackRate];
 }
 
 void PlaybackSessionInterfaceAVKit::seekableRangesChanged(const TimeRanges& timeRanges, double lastModifiedTime, double liveUpdateInterval)

Modified: trunk/Source/WebCore/platform/ios/WebAVPlayerController.h (274248 => 274249)


--- trunk/Source/WebCore/platform/ios/WebAVPlayerController.h	2021-03-11 00:01:13 UTC (rev 274248)
+++ trunk/Source/WebCore/platform/ios/WebAVPlayerController.h	2021-03-11 00:05:12 UTC (rev 274249)
@@ -62,6 +62,7 @@
 @property (getter=isPlaying) BOOL playing;
 @property BOOL canPause;
 @property BOOL canTogglePlayback;
+@property double defaultPlaybackRate;
 @property double rate;
 @property BOOL canSeek;
 @property NSTimeInterval contentDuration;

Modified: trunk/Source/WebCore/platform/ios/WebAVPlayerController.mm (274248 => 274249)


--- trunk/Source/WebCore/platform/ios/WebAVPlayerController.mm	2021-03-11 00:01:13 UTC (rev 274248)
+++ trunk/Source/WebCore/platform/ios/WebAVPlayerController.mm	2021-03-11 00:05:12 UTC (rev 274249)
@@ -49,6 +49,7 @@
 static void * WebAVPlayerControllerSeekableTimeRangesObserverContext = &WebAVPlayerControllerSeekableTimeRangesObserverContext;
 static void * WebAVPlayerControllerHasLiveStreamingContentObserverContext = &WebAVPlayerControllerHasLiveStreamingContentObserverContext;
 static void * WebAVPlayerControllerIsPlayingOnSecondScreenObserverContext = &WebAVPlayerControllerIsPlayingOnSecondScreenObserverContext;
+static void * WebAVPlayerControllerDefaultPlaybackRateObserverContext = &WebAVPlayerControllerDefaultPlaybackRateObserverContext;
 
 static double WebAVPlayerControllerLiveStreamSeekableTimeRangeDurationHysteresisDelta = 3.0; // Minimum delta of time required to change the duration of the seekable time range.
 static double WebAVPlayerControllerLiveStreamMinimumTargetDuration = 1.0; // Minimum segment duration to be considered valid.
@@ -75,6 +76,7 @@
     [self addObserver:self forKeyPath:@"seekableTimeRanges" options:(NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial) context:WebAVPlayerControllerSeekableTimeRangesObserverContext];
     [self addObserver:self forKeyPath:@"hasLiveStreamingContent" options:NSKeyValueObservingOptionInitial context:WebAVPlayerControllerHasLiveStreamingContentObserverContext];
     [self addObserver:self forKeyPath:@"playingOnSecondScreen" options:NSKeyValueObservingOptionNew context:WebAVPlayerControllerIsPlayingOnSecondScreenObserverContext];
+    [self addObserver:self forKeyPath:@"defaultPlaybackRate" options:NSKeyValueObservingOptionNew context:WebAVPlayerControllerDefaultPlaybackRateObserverContext];
 
     return self;
 }
@@ -84,6 +86,7 @@
     [self removeObserver:self forKeyPath:@"seekableTimeRanges" context:WebAVPlayerControllerSeekableTimeRangesObserverContext];
     [self removeObserver:self forKeyPath:@"hasLiveStreamingContent" context:WebAVPlayerControllerHasLiveStreamingContentObserverContext];
     [self removeObserver:self forKeyPath:@"playingOnSecondScreen" context:WebAVPlayerControllerIsPlayingOnSecondScreenObserverContext];
+    [self removeObserver:self forKeyPath:@"defaultPlaybackRate" context:WebAVPlayerControllerDefaultPlaybackRateObserverContext];
 
     [_playerControllerProxy release];
     [_loadedTimeRanges release];
@@ -588,12 +591,27 @@
                 [self updateMinMaxTiming];
             }
         }
-    } else if (WebAVPlayerControllerHasLiveStreamingContentObserverContext == context)
+        return;
+    }
+
+    if (WebAVPlayerControllerHasLiveStreamingContentObserverContext == context) {
         [self updateMinMaxTiming];
-    else if (WebAVPlayerControllerIsPlayingOnSecondScreenObserverContext == context) {
+        return;
+    }
+
+    if (WebAVPlayerControllerIsPlayingOnSecondScreenObserverContext == context) {
         if (auto* delegate = self.delegate)
             delegate->setPlayingOnSecondScreen(_playingOnSecondScreen);
+        return;
     }
+
+    if (WebAVPlayerControllerDefaultPlaybackRateObserverContext == context) {
+        if (auto* delegate = self.delegate)
+            delegate->setDefaultPlaybackRate(_defaultPlaybackRate);
+        return;
+    }
+
+    ASSERT_NOT_REACHED();
 }
 
 - (void)updateMinMaxTiming

Modified: trunk/Source/WebCore/platform/ios/WebVideoFullscreenControllerAVKit.mm (274248 => 274249)


--- trunk/Source/WebCore/platform/ios/WebVideoFullscreenControllerAVKit.mm	2021-03-11 00:01:13 UTC (rev 274248)
+++ trunk/Source/WebCore/platform/ios/WebVideoFullscreenControllerAVKit.mm	2021-03-11 00:05:12 UTC (rev 274249)
@@ -147,6 +147,7 @@
     void beginScanningForward() override;
     void beginScanningBackward() override;
     void endScanning() override;
+    void setDefaultPlaybackRate(float) override;
     void selectAudioMediaOption(uint64_t) override;
     void selectLegibleMediaOption(uint64_t) override;
     double duration() const override;
@@ -155,6 +156,7 @@
     double bufferedTime() const override;
     bool isPlaying() const override;
     bool isScrubbing() const override { return false; }
+    float defaultPlaybackRate() const override;
     float playbackRate() const override;
     Ref<TimeRanges> seekableRanges() const override;
     double seekableTimeRangesLastModifiedTime() const override;
@@ -178,7 +180,7 @@
     void durationChanged(double) override;
     void currentTimeChanged(double currentTime, double anchorTime) override;
     void bufferedTimeChanged(double) override;
-    void rateChanged(bool isPlaying, float playbackRate) override;
+    void rateChanged(bool isPlaying, float playbackRate, float defaultPlaybackRate) override;
     void seekableRangesChanged(const TimeRanges&, double lastModifiedTime, double liveUpdateInterval) override;
     void canPlayFastReverseChanged(bool) override;
     void audioMediaSelectionOptionsChanged(const Vector<MediaSelectionOption>& options, uint64_t selectedIndex) override;
@@ -411,17 +413,17 @@
         client->bufferedTimeChanged(bufferedTime);
 }
 
-void VideoFullscreenControllerContext::rateChanged(bool isPlaying, float playbackRate)
+void VideoFullscreenControllerContext::rateChanged(bool isPlaying, float playbackRate, float defaultPlaybackRate)
 {
     if (WebThreadIsCurrent()) {
-        RunLoop::main().dispatch([protectedThis = makeRefPtr(this), isPlaying, playbackRate] {
-            protectedThis->rateChanged(isPlaying, playbackRate);
+        RunLoop::main().dispatch([protectedThis = makeRefPtr(this), isPlaying, playbackRate, defaultPlaybackRate] {
+            protectedThis->rateChanged(isPlaying, playbackRate, defaultPlaybackRate);
         });
         return;
     }
 
     for (auto& client : m_playbackClients)
-        client->rateChanged(isPlaying, playbackRate);
+        client->rateChanged(isPlaying, playbackRate, defaultPlaybackRate);
 }
 
 void VideoFullscreenControllerContext::hasVideoChanged(bool hasVideo)
@@ -836,6 +838,15 @@
     });
 }
 
+void VideoFullscreenControllerContext::setDefaultPlaybackRate(float defaultPlaybackRate)
+{
+    ASSERT(isUIThread());
+    WebThreadRun([protectedThis = makeRefPtr(this), this, defaultPlaybackRate] {
+        if (m_playbackModel)
+            m_playbackModel->setDefaultPlaybackRate(defaultPlaybackRate);
+    });
+}
+
 void VideoFullscreenControllerContext::selectAudioMediaOption(uint64_t index)
 {
     ASSERT(isUIThread());
@@ -878,6 +889,12 @@
     return m_playbackModel ? m_playbackModel->isPlaying() : false;
 }
 
+float VideoFullscreenControllerContext::defaultPlaybackRate() const
+{
+    ASSERT(isUIThread());
+    return m_playbackModel ? m_playbackModel->defaultPlaybackRate() : 0;
+}
+
 float VideoFullscreenControllerContext::playbackRate() const
 {
     ASSERT(isUIThread());

Modified: trunk/Source/WebCore/platform/mac/PlaybackSessionInterfaceMac.h (274248 => 274249)


--- trunk/Source/WebCore/platform/mac/PlaybackSessionInterfaceMac.h	2021-03-11 00:01:13 UTC (rev 274248)
+++ trunk/Source/WebCore/platform/mac/PlaybackSessionInterfaceMac.h	2021-03-11 00:05:12 UTC (rev 274249)
@@ -52,7 +52,7 @@
     // PlaybackSessionModelClient
     void durationChanged(double) final;
     void currentTimeChanged(double /*currentTime*/, double /*anchorTime*/) final;
-    void rateChanged(bool /*isPlaying*/, float /*playbackRate*/) final;
+    void rateChanged(bool /*isPlaying*/, float /*playbackRate*/, float /* defaultPlaybackRate */) final;
     void seekableRangesChanged(const TimeRanges&, double /*lastModifiedTime*/, double /*liveUpdateInterval*/) final;
     void audioMediaSelectionOptionsChanged(const Vector<MediaSelectionOption>& /*options*/, uint64_t /*selectedIndex*/) final;
     void legibleMediaSelectionOptionsChanged(const Vector<MediaSelectionOption>& /*options*/, uint64_t /*selectedIndex*/) final;

Modified: trunk/Source/WebCore/platform/mac/PlaybackSessionInterfaceMac.mm (274248 => 274249)


--- trunk/Source/WebCore/platform/mac/PlaybackSessionInterfaceMac.mm	2021-03-11 00:01:13 UTC (rev 274248)
+++ trunk/Source/WebCore/platform/mac/PlaybackSessionInterfaceMac.mm	2021-03-11 00:05:12 UTC (rev 274249)
@@ -92,11 +92,12 @@
 #endif
 }
 
-void PlaybackSessionInterfaceMac::rateChanged(bool isPlaying, float playbackRate)
+void PlaybackSessionInterfaceMac::rateChanged(bool isPlaying, float playbackRate, float defaultPlaybackRate)
 {
 #if ENABLE(WEB_PLAYBACK_CONTROLS_MANAGER)
     WebPlaybackControlsManager* controlsManager = playBackControlsManager();
     [controlsManager setRate:isPlaying ? playbackRate : 0.];
+    [controlsManager setDefaultPlaybackRate:defaultPlaybackRate];
     [controlsManager setPlaying:isPlaying];
     updatePlaybackControlsManagerTiming(m_playbackSessionModel ? m_playbackSessionModel->currentTime() : 0, [[NSProcessInfo processInfo] systemUptime], playbackRate, isPlaying);
 #else
@@ -237,6 +238,7 @@
     manager.contentDuration = duration;
     manager.hasEnabledAudio = duration > 0;
     manager.hasEnabledVideo = duration > 0;
+    manager.defaultPlaybackRate = m_playbackSessionModel->defaultPlaybackRate();
     manager.rate = m_playbackSessionModel->isPlaying() ? m_playbackSessionModel->playbackRate() : 0.;
     manager.seekableTimeRanges = timeRangesToArray(m_playbackSessionModel->seekableRanges()).get();
     manager.canTogglePlayback = YES;

Modified: trunk/Source/WebCore/platform/mac/VideoFullscreenInterfaceMac.h (274248 => 274249)


--- trunk/Source/WebCore/platform/mac/VideoFullscreenInterfaceMac.h	2021-03-11 00:01:13 UTC (rev 274248)
+++ trunk/Source/WebCore/platform/mac/VideoFullscreenInterfaceMac.h	2021-03-11 00:05:12 UTC (rev 274249)
@@ -63,7 +63,7 @@
     WEBCORE_EXPORT void setVideoFullscreenChangeObserver(VideoFullscreenChangeObserver*);
 
     // PlaybackSessionModelClient
-    WEBCORE_EXPORT void rateChanged(bool isPlaying, float playbackRate) override;
+    WEBCORE_EXPORT void rateChanged(bool isPlaying, float playbackRate, float defaultPlaybackRate) override;
     WEBCORE_EXPORT void externalPlaybackChanged(bool  enabled, PlaybackSessionModel::ExternalPlaybackTargetType, const String& localizedDeviceName) override;
     WEBCORE_EXPORT void ensureControlsManager() override;
 

Modified: trunk/Source/WebCore/platform/mac/VideoFullscreenInterfaceMac.mm (274248 => 274249)


--- trunk/Source/WebCore/platform/mac/VideoFullscreenInterfaceMac.mm	2021-03-11 00:01:13 UTC (rev 274248)
+++ trunk/Source/WebCore/platform/mac/VideoFullscreenInterfaceMac.mm	2021-03-11 00:05:12 UTC (rev 274249)
@@ -428,7 +428,7 @@
         m_videoFullscreenModel->fullscreenModeChanged(m_mode);
 }
 
-void VideoFullscreenInterfaceMac::rateChanged(bool isPlaying, float playbackRate)
+void VideoFullscreenInterfaceMac::rateChanged(bool isPlaying, float playbackRate, float /* defaultPlaybackRate */)
 {
     [videoFullscreenInterfaceObjC() updateIsPlaying:isPlaying newPlaybackRate:playbackRate];
 }

Modified: trunk/Source/WebCore/platform/mac/WebPlaybackControlsManager.h (274248 => 274249)


--- trunk/Source/WebCore/platform/mac/WebPlaybackControlsManager.h	2021-03-11 00:01:13 UTC (rev 274248)
+++ trunk/Source/WebCore/platform/mac/WebPlaybackControlsManager.h	2021-03-11 00:05:12 UTC (rev 274249)
@@ -50,6 +50,7 @@
     RetainPtr<NSArray<AVTouchBarMediaSelectionOption *>> _legibleTouchBarMediaSelectionOptions;
     RetainPtr<AVTouchBarMediaSelectionOption> _currentLegibleTouchBarMediaSelectionOption;
     RefPtr<WebCore::PlaybackSessionInterfaceMac> _playbackSessionInterfaceMac;
+    double _defaultPlaybackRate;
     float _rate;
     BOOL _playing;
     BOOL _hasEnabledAudio;
@@ -66,6 +67,7 @@
 @property (nonatomic) BOOL hasEnabledVideo;
 @property (getter=isPlaying) BOOL playing;
 @property BOOL canTogglePlayback;
+@property double defaultPlaybackRate;
 @property (nonatomic) float rate;
 @property BOOL allowsPictureInPicturePlayback;
 @property (getter=isPictureInPictureActive) BOOL pictureInPictureActive;

Modified: trunk/Source/WebCore/platform/mac/WebPlaybackControlsManager.mm (274248 => 274249)


--- trunk/Source/WebCore/platform/mac/WebPlaybackControlsManager.mm	2021-03-11 00:01:13 UTC (rev 274248)
+++ trunk/Source/WebCore/platform/mac/WebPlaybackControlsManager.mm	2021-03-11 00:05:12 UTC (rev 274249)
@@ -48,6 +48,7 @@
 @synthesize seekToTime = _seekToTime;
 @synthesize hasEnabledAudio = _hasEnabledAudio;
 @synthesize hasEnabledVideo = _hasEnabledVideo;
+@synthesize defaultPlaybackRate = _defaultPlaybackRate;
 @synthesize rate = _rate;
 @synthesize canTogglePlayback = _canTogglePlayback;
 @synthesize allowsPictureInPicturePlayback;

Modified: trunk/Source/WebKit/ChangeLog (274248 => 274249)


--- trunk/Source/WebKit/ChangeLog	2021-03-11 00:01:13 UTC (rev 274248)
+++ trunk/Source/WebKit/ChangeLog	2021-03-11 00:05:12 UTC (rev 274249)
@@ -1,3 +1,29 @@
+2021-03-10  Devin Rousso  <[email protected]>
+
+        Add plumbing for `defaultPlaybackRate` to AVKit
+        https://bugs.webkit.org/show_bug.cgi?id=222991
+        <rdar://problem/75012417>
+
+        Reviewed by Eric Carlson.
+
+        * WebProcess/cocoa/PlaybackSessionManager.messages.in:
+        * WebProcess/cocoa/PlaybackSessionManager.h:
+        * WebProcess/cocoa/PlaybackSessionManager.mm:
+        (WebKit::PlaybackSessionInterfaceContext::rateChanged):
+        (WebKit::PlaybackSessionManager::rateChanged):
+        (WebKit::PlaybackSessionManager::setDefaultPlaybackRate): Added.
+
+        * UIProcess/Cocoa/PlaybackSessionManagerProxy.messages.in:
+        * UIProcess/Cocoa/PlaybackSessionManagerProxy.h:
+        * UIProcess/Cocoa/PlaybackSessionManagerProxy.mm:
+        (WebKit::PlaybackSessionModelContext::setDefaultPlaybackRate): Added.
+        (WebKit::PlaybackSessionModelContext::rateChanged):
+        (WebKit::PlaybackSessionManagerProxy::rateChanged):
+        (WebKit::PlaybackSessionManagerProxy::setDefaultPlaybackRate): Added.
+
+        * UIProcess/ios/fullscreen/WKFullScreenViewController.mm:
+        (WKFullScreenViewControllerPlaybackSessionModelClient::rateChanged):
+
 2021-03-10  Per Arne Vollan  <[email protected]>
 
         [iOS] Adjust telemetry rule

Modified: trunk/Source/WebKit/UIProcess/Cocoa/PlaybackSessionManagerProxy.h (274248 => 274249)


--- trunk/Source/WebKit/UIProcess/Cocoa/PlaybackSessionManagerProxy.h	2021-03-11 00:01:13 UTC (rev 274248)
+++ trunk/Source/WebKit/UIProcess/Cocoa/PlaybackSessionManagerProxy.h	2021-03-11 00:05:12 UTC (rev 274249)
@@ -75,7 +75,7 @@
     void currentTimeChanged(double);
     void bufferedTimeChanged(double);
     void playbackStartedTimeChanged(double);
-    void rateChanged(bool isPlaying, float playbackRate);
+    void rateChanged(bool isPlaying, float playbackRate, float defaultPlaybackRate);
     void seekableRangesChanged(WebCore::TimeRanges&, double lastModifiedTime, double liveUpdateInterval);
     void canPlayFastReverseChanged(bool);
     void audioMediaSelectionOptionsChanged(const Vector<WebCore::MediaSelectionOption>& options, uint64_t index);
@@ -111,6 +111,7 @@
     void beginScanningForward() final;
     void beginScanningBackward() final;
     void endScanning() final;
+    void setDefaultPlaybackRate(float) final;
     void selectAudioMediaOption(uint64_t) final;
     void selectLegibleMediaOption(uint64_t) final;
     void togglePictureInPicture() final;
@@ -126,6 +127,7 @@
     double bufferedTime() const final { return m_bufferedTime; }
     bool isPlaying() const final { return m_isPlaying; }
     bool isScrubbing() const final { return m_isScrubbing; }
+    float defaultPlaybackRate() const final { return m_defaultPlaybackRate; }
     float playbackRate() const final { return m_playbackRate; }
     Ref<WebCore::TimeRanges> seekableRanges() const final { return m_seekableRanges.copyRef(); }
     double seekableTimeRangesLastModifiedTime() const final { return m_seekableTimeRangesLastModifiedTime; }
@@ -153,6 +155,7 @@
     double m_bufferedTime { 0 };
     bool m_isPlaying { false };
     bool m_isScrubbing { false };
+    float m_defaultPlaybackRate { 0 };
     float m_playbackRate { 0 };
     Ref<WebCore::TimeRanges> m_seekableRanges { WebCore::TimeRanges::create() };
     double m_seekableTimeRangesLastModifiedTime { 0 };
@@ -217,7 +220,7 @@
     void wirelessVideoPlaybackDisabledChanged(PlaybackSessionContextIdentifier, bool);
     void durationChanged(PlaybackSessionContextIdentifier, double duration);
     void playbackStartedTimeChanged(PlaybackSessionContextIdentifier, double playbackStartedTime);
-    void rateChanged(PlaybackSessionContextIdentifier, bool isPlaying, double rate);
+    void rateChanged(PlaybackSessionContextIdentifier, bool isPlaying, double rate, double defaultPlaybackRate);
     void handleControlledElementIDResponse(PlaybackSessionContextIdentifier, String) const;
     void mutedChanged(PlaybackSessionContextIdentifier, bool muted);
     void volumeChanged(PlaybackSessionContextIdentifier, double volume);
@@ -234,6 +237,7 @@
     void beginScanningForward(PlaybackSessionContextIdentifier);
     void beginScanningBackward(PlaybackSessionContextIdentifier);
     void endScanning(PlaybackSessionContextIdentifier);
+    void setDefaultPlaybackRate(PlaybackSessionContextIdentifier, float);
     void selectAudioMediaOption(PlaybackSessionContextIdentifier, uint64_t index);
     void selectLegibleMediaOption(PlaybackSessionContextIdentifier, uint64_t index);
     void togglePictureInPicture(PlaybackSessionContextIdentifier);

Modified: trunk/Source/WebKit/UIProcess/Cocoa/PlaybackSessionManagerProxy.messages.in (274248 => 274249)


--- trunk/Source/WebKit/UIProcess/Cocoa/PlaybackSessionManagerProxy.messages.in	2021-03-11 00:01:13 UTC (rev 274248)
+++ trunk/Source/WebKit/UIProcess/Cocoa/PlaybackSessionManagerProxy.messages.in	2021-03-11 00:05:12 UTC (rev 274249)
@@ -34,7 +34,7 @@
     WirelessVideoPlaybackDisabledChanged(WebKit::PlaybackSessionContextIdentifier contextId, bool disabled)
     DurationChanged(WebKit::PlaybackSessionContextIdentifier contextId, double duration)
     PlaybackStartedTimeChanged(WebKit::PlaybackSessionContextIdentifier contextId, double playbackStartedTime)
-    RateChanged(WebKit::PlaybackSessionContextIdentifier contextId, bool isPlaying, double rate)
+    RateChanged(WebKit::PlaybackSessionContextIdentifier contextId, bool isPlaying, double rate, double defaultPlaybackRate)
     MutedChanged(WebKit::PlaybackSessionContextIdentifier contextId, bool muted);
     VolumeChanged(WebKit::PlaybackSessionContextIdentifier contextId, double volume);
     PictureInPictureSupportedChanged(WebKit::PlaybackSessionContextIdentifier contextId, bool pictureInPictureSupported)

Modified: trunk/Source/WebKit/UIProcess/Cocoa/PlaybackSessionManagerProxy.mm (274248 => 274249)


--- trunk/Source/WebKit/UIProcess/Cocoa/PlaybackSessionManagerProxy.mm	2021-03-11 00:01:13 UTC (rev 274248)
+++ trunk/Source/WebKit/UIProcess/Cocoa/PlaybackSessionManagerProxy.mm	2021-03-11 00:05:12 UTC (rev 274249)
@@ -121,6 +121,12 @@
         m_manager->endScanning(m_contextId);
 }
 
+void PlaybackSessionModelContext::setDefaultPlaybackRate(float defaultPlaybackRate)
+{
+    if (m_manager)
+        m_manager->setDefaultPlaybackRate(m_contextId, defaultPlaybackRate);
+}
+
 void PlaybackSessionModelContext::selectAudioMediaOption(uint64_t optionId)
 {
     if (m_manager)
@@ -194,12 +200,13 @@
         client->bufferedTimeChanged(bufferedTime);
 }
 
-void PlaybackSessionModelContext::rateChanged(bool isPlaying, float playbackRate)
+void PlaybackSessionModelContext::rateChanged(bool isPlaying, float playbackRate, float defaultPlaybackRate)
 {
     m_isPlaying = isPlaying;
     m_playbackRate = playbackRate;
+    m_defaultPlaybackRate = defaultPlaybackRate;
     for (auto* client : m_clients)
-        client->rateChanged(isPlaying, playbackRate);
+        client->rateChanged(m_isPlaying, m_playbackRate, m_defaultPlaybackRate);
 }
 
 void PlaybackSessionModelContext::seekableRangesChanged(WebCore::TimeRanges& seekableRanges, double lastModifiedTime, double liveUpdateInterval)
@@ -476,9 +483,9 @@
     ensureModel(contextId).playbackStartedTimeChanged(playbackStartedTime);
 }
 
-void PlaybackSessionManagerProxy::rateChanged(PlaybackSessionContextIdentifier contextId, bool isPlaying, double rate)
+void PlaybackSessionManagerProxy::rateChanged(PlaybackSessionContextIdentifier contextId, bool isPlaying, double rate, double defaultPlaybackRate)
 {
-    ensureModel(contextId).rateChanged(isPlaying, rate);
+    ensureModel(contextId).rateChanged(isPlaying, rate, defaultPlaybackRate);
 }
 
 void PlaybackSessionManagerProxy::pictureInPictureSupportedChanged(PlaybackSessionContextIdentifier contextId, bool supported)
@@ -550,6 +557,11 @@
     m_page->send(Messages::PlaybackSessionManager::EndScanning(contextId));
 }
 
+void PlaybackSessionManagerProxy::setDefaultPlaybackRate(PlaybackSessionContextIdentifier contextId, float defaultPlaybackRate)
+{
+    m_page->send(Messages::PlaybackSessionManager::SetDefaultPlaybackRate(contextId, defaultPlaybackRate));
+}
+
 void PlaybackSessionManagerProxy::selectAudioMediaOption(PlaybackSessionContextIdentifier contextId, uint64_t index)
 {
     m_page->send(Messages::PlaybackSessionManager::SelectAudioMediaOption(contextId, index));

Modified: trunk/Source/WebKit/UIProcess/ios/fullscreen/WKFullScreenViewController.mm (274248 => 274249)


--- trunk/Source/WebKit/UIProcess/ios/fullscreen/WKFullScreenViewController.mm	2021-03-11 00:01:13 UTC (rev 274248)
+++ trunk/Source/WebKit/UIProcess/ios/fullscreen/WKFullScreenViewController.mm	2021-03-11 00:05:12 UTC (rev 274249)
@@ -50,7 +50,7 @@
 public:
     void setParent(WKFullScreenViewController *parent) { m_parent = parent; }
 
-    void rateChanged(bool isPlaying, float) override
+    void rateChanged(bool isPlaying, float /* playbackRate */, float /* defaultPlaybackRate */) override
     {
         m_parent.playing = isPlaying;
     }

Modified: trunk/Source/WebKit/WebProcess/cocoa/PlaybackSessionManager.h (274248 => 274249)


--- trunk/Source/WebKit/WebProcess/cocoa/PlaybackSessionManager.h	2021-03-11 00:01:13 UTC (rev 274248)
+++ trunk/Source/WebKit/WebProcess/cocoa/PlaybackSessionManager.h	2021-03-11 00:05:12 UTC (rev 274249)
@@ -75,7 +75,7 @@
     void currentTimeChanged(double currentTime, double anchorTime) final;
     void bufferedTimeChanged(double) final;
     void playbackStartedTimeChanged(double playbackStartedTime) final;
-    void rateChanged(bool isPlaying, float playbackRate) final;
+    void rateChanged(bool isPlaying, float playbackRate, float defaultPlaybackRate) final;
     void seekableRangesChanged(const WebCore::TimeRanges&, double lastModifiedTime, double liveUpdateInterval) final;
     void canPlayFastReverseChanged(bool value) final;
     void audioMediaSelectionOptionsChanged(const Vector<WebCore::MediaSelectionOption>& options, uint64_t selectedIndex) final;
@@ -130,7 +130,7 @@
     void currentTimeChanged(PlaybackSessionContextIdentifier, double currentTime, double anchorTime);
     void bufferedTimeChanged(PlaybackSessionContextIdentifier, double bufferedTime);
     void playbackStartedTimeChanged(PlaybackSessionContextIdentifier, double playbackStartedTime);
-    void rateChanged(PlaybackSessionContextIdentifier, bool isPlaying, float playbackRate);
+    void rateChanged(PlaybackSessionContextIdentifier, bool isPlaying, float playbackRate, float defaultPlaybackRate);
     void seekableRangesChanged(PlaybackSessionContextIdentifier, const WebCore::TimeRanges&, double lastModifiedTime, double liveUpdateInterval);
     void canPlayFastReverseChanged(PlaybackSessionContextIdentifier, bool value);
     void audioMediaSelectionOptionsChanged(PlaybackSessionContextIdentifier, const Vector<WebCore::MediaSelectionOption>& options, uint64_t selectedIndex);
@@ -154,6 +154,7 @@
     void beginScanningForward(PlaybackSessionContextIdentifier);
     void beginScanningBackward(PlaybackSessionContextIdentifier);
     void endScanning(PlaybackSessionContextIdentifier);
+    void setDefaultPlaybackRate(PlaybackSessionContextIdentifier, float);
     void selectAudioMediaOption(PlaybackSessionContextIdentifier, uint64_t index);
     void selectLegibleMediaOption(PlaybackSessionContextIdentifier, uint64_t index);
     void handleControlledElementIDRequest(PlaybackSessionContextIdentifier);

Modified: trunk/Source/WebKit/WebProcess/cocoa/PlaybackSessionManager.messages.in (274248 => 274249)


--- trunk/Source/WebKit/WebProcess/cocoa/PlaybackSessionManager.messages.in	2021-03-11 00:01:13 UTC (rev 274248)
+++ trunk/Source/WebKit/WebProcess/cocoa/PlaybackSessionManager.messages.in	2021-03-11 00:05:12 UTC (rev 274249)
@@ -33,6 +33,7 @@
     BeginScanningForward(WebKit::PlaybackSessionContextIdentifier contextId)
     BeginScanningBackward(WebKit::PlaybackSessionContextIdentifier contextId)
     EndScanning(WebKit::PlaybackSessionContextIdentifier contextId)
+    SetDefaultPlaybackRate(WebKit::PlaybackSessionContextIdentifier contextId, float defaultPlaybackRate)
     SelectAudioMediaOption(WebKit::PlaybackSessionContextIdentifier contextId, uint64_t index)
     SelectLegibleMediaOption(WebKit::PlaybackSessionContextIdentifier contextId, uint64_t index)
     HandleControlledElementIDRequest(WebKit::PlaybackSessionContextIdentifier contextId)

Modified: trunk/Source/WebKit/WebProcess/cocoa/PlaybackSessionManager.mm (274248 => 274249)


--- trunk/Source/WebKit/WebProcess/cocoa/PlaybackSessionManager.mm	2021-03-11 00:01:13 UTC (rev 274248)
+++ trunk/Source/WebKit/WebProcess/cocoa/PlaybackSessionManager.mm	2021-03-11 00:05:12 UTC (rev 274249)
@@ -76,10 +76,10 @@
         m_manager->bufferedTimeChanged(m_contextId, bufferedTime);
 }
 
-void PlaybackSessionInterfaceContext::rateChanged(bool isPlaying, float playbackRate)
+void PlaybackSessionInterfaceContext::rateChanged(bool isPlaying, float playbackRate, float defaultPlaybackRate)
 {
     if (m_manager)
-        m_manager->rateChanged(m_contextId, isPlaying, playbackRate);
+        m_manager->rateChanged(m_contextId, isPlaying, playbackRate, defaultPlaybackRate);
 }
 
 void PlaybackSessionInterfaceContext::playbackStartedTimeChanged(double playbackStartedTime)
@@ -341,9 +341,9 @@
     m_page->send(Messages::PlaybackSessionManagerProxy::PlaybackStartedTimeChanged(contextId, playbackStartedTime));
 }
 
-void PlaybackSessionManager::rateChanged(PlaybackSessionContextIdentifier contextId, bool isPlaying, float playbackRate)
+void PlaybackSessionManager::rateChanged(PlaybackSessionContextIdentifier contextId, bool isPlaying, float playbackRate, float defaultPlaybackRate)
 {
-    m_page->send(Messages::PlaybackSessionManagerProxy::RateChanged(contextId, isPlaying, playbackRate));
+    m_page->send(Messages::PlaybackSessionManagerProxy::RateChanged(contextId, isPlaying, playbackRate, defaultPlaybackRate));
 }
 
 void PlaybackSessionManager::seekableRangesChanged(PlaybackSessionContextIdentifier contextId, const WebCore::TimeRanges& timeRanges, double lastModifiedTime, double liveUpdateInterval)
@@ -469,6 +469,12 @@
     ensureModel(contextId).endScanning();
 }
 
+void PlaybackSessionManager::setDefaultPlaybackRate(PlaybackSessionContextIdentifier contextId, float defaultPlaybackRate)
+{
+    UserGestureIndicator indicator(ProcessingUserGesture);
+    ensureModel(contextId).setDefaultPlaybackRate(defaultPlaybackRate);
+}
+
 void PlaybackSessionManager::selectAudioMediaOption(PlaybackSessionContextIdentifier contextId, uint64_t index)
 {
     UserGestureIndicator indicator(ProcessingUserGesture);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to