Changeset 266121 in webkit
- Timestamp:
- Aug 25, 2020, 9:15:32 AM (6 years ago)
- Location:
- trunk
- Files:
-
- 17 edited
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/platform/audio/AudioSession.cpp (modified) (1 diff)
-
Source/WebCore/platform/audio/AudioSession.h (modified) (1 diff)
-
Source/WebCore/platform/audio/cocoa/MediaSessionManagerCocoa.h (modified) (1 diff)
-
Source/WebCore/platform/audio/cocoa/MediaSessionManagerCocoa.mm (modified) (1 diff)
-
Source/WebCore/platform/audio/mac/AudioSessionMac.mm (modified) (4 diffs)
-
Source/WebCore/testing/Internals.cpp (modified) (1 diff)
-
Source/WebCore/testing/Internals.h (modified) (1 diff)
-
Source/WebCore/testing/Internals.idl (modified) (1 diff)
-
Source/WebKit/ChangeLog (modified) (1 diff)
-
Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivateForTesting.h (modified) (1 diff)
-
Source/WebKit/UIProcess/API/Cocoa/WKWebViewTesting.mm (modified) (1 diff)
-
Source/WebKit/UIProcess/Media/AudioSessionRoutingArbitratorProxy.h (modified) (3 diffs)
-
Source/WebKit/UIProcess/Media/cocoa/AudioSessionRoutingArbitratorProxyCocoa.mm (modified) (1 diff)
-
Tools/ChangeLog (modified) (1 diff)
-
Tools/TestWebKitAPI/Tests/WebKitCocoa/AudioRoutingArbitration.mm (modified) (5 diffs)
-
Tools/TestWebKitAPI/Tests/WebKitLegacy/ios/video-with-audio.html (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r266120 r266121 1 2020-08-25 Eric Carlson <eric.carlson@apple.com> 2 3 [macOS] Update audio arbitration manager when audio transport changes 4 https://bugs.webkit.org/show_bug.cgi?id=215781 5 <rdar://problem/65920613> 6 7 Reviewed by Jer Noble. 8 9 No new tests, updated AudioRoutingArbitration API test. 10 11 * platform/audio/AudioSession.cpp: 12 (WebCore::AudioSession::audioOutputDeviceChanged): Add empty method. 13 (WebCore::setIsPlayingToBluetoothOverride): Ditto. 14 * platform/audio/AudioSession.h: 15 16 * platform/audio/cocoa/MediaSessionManagerCocoa.h: 17 * platform/audio/cocoa/MediaSessionManagerCocoa.mm: 18 (WebCore::MediaSessionManagerCocoa::audioOutputDeviceChanged): Call AudioSession::audioOutputDeviceChanged. 19 20 * platform/audio/mac/AudioSessionMac.mm: 21 (WebCore::defaultDeviceTransportIsBluetooth): New. 22 (WebCore::AudioSession::audioOutputDeviceChanged): Clear m_private->playingToBluetooth 23 if bluetooth transport has changed since the last arbitration update. 24 (WebCore::AudioSession::setIsPlayingToBluetoothOverride): Allow override of bluetooth 25 transport for testing. 26 (WebCore::AudioSession::setCategory): Update routing arbitration if audio session category 27 or bluetooth transport changes. 28 29 * testing/Internals.cpp: 30 (WebCore::Internals::setIsPlayingToBluetoothOverride): 31 * testing/Internals.h: 32 * testing/Internals.idl: 33 1 34 2020-08-25 Youenn Fablet <youenn@apple.com> 2 35 -
trunk/Source/WebCore/platform/audio/AudioSession.cpp
r260102 r266121 164 164 #endif // !PLATFORM(COCOA) 165 165 166 #if !PLATFORM(MAC) 167 void AudioSession::audioOutputDeviceChanged() 168 { 169 notImplemented(); 170 } 171 172 void AudioSession::setIsPlayingToBluetoothOverride(Optional<bool>) 173 { 174 notImplemented(); 175 } 176 #endif // !PLATFORM(COCOA) 177 178 166 179 String convertEnumerationToString(RouteSharingPolicy enumerationValue) 167 180 { -
trunk/Source/WebCore/platform/audio/AudioSession.h
r260102 r266121 98 98 void removeMutedStateObserver(MutedStateObserver*); 99 99 100 void audioOutputDeviceChanged(); 101 void setIsPlayingToBluetoothOverride(Optional<bool>); 102 100 103 virtual bool isMuted() const; 101 104 virtual void handleMutedStateChange(); -
trunk/Source/WebCore/platform/audio/cocoa/MediaSessionManagerCocoa.h
r264177 r266121 97 97 void audioHardwareDidBecomeActive() final { } 98 98 void audioHardwareDidBecomeInactive() final { } 99 void audioOutputDeviceChanged() final { updateSessionState(); }99 void audioOutputDeviceChanged() final; 100 100 101 101 // PAL::SystemSleepListener -
trunk/Source/WebCore/platform/audio/cocoa/MediaSessionManagerCocoa.mm
r261709 r266121 367 367 } 368 368 369 void MediaSessionManagerCocoa::audioOutputDeviceChanged() 370 { 371 AudioSession::sharedSession().audioOutputDeviceChanged(); 372 updateSessionState(); 373 } 374 369 375 } // namespace WebCore 370 376 -
trunk/Source/WebCore/platform/audio/mac/AudioSessionMac.mm
r265173 r266121 55 55 } 56 56 57 #if ENABLE(ROUTING_ARBITRATION) 58 static Optional<bool> isPlayingToBluetoothOverride; 59 60 static float defaultDeviceTransportIsBluetooth() 61 { 62 if (isPlayingToBluetoothOverride) 63 return *isPlayingToBluetoothOverride; 64 65 static const AudioObjectPropertyAddress audioDeviceTransportTypeProperty = { 66 kAudioDevicePropertyTransportType, 67 kAudioObjectPropertyScopeGlobal, 68 kAudioObjectPropertyElementMaster, 69 }; 70 UInt32 transportType = kAudioDeviceTransportTypeUnknown; 71 UInt32 transportSize = sizeof(transportType); 72 if (AudioObjectGetPropertyData(defaultDevice(), &audioDeviceTransportTypeProperty, 0, 0, &transportSize, &transportType)) 73 return false; 74 75 return transportType == kAudioDeviceTransportTypeBluetooth || transportType == kAudioDeviceTransportTypeBluetoothLE; 76 } 77 #endif 78 57 79 class AudioSessionPrivate { 58 80 WTF_MAKE_FAST_ALLOCATED; … … 63 85 #if ENABLE(ROUTING_ARBITRATION) 64 86 bool setupArbitrationOngoing { false }; 87 Optional<bool> playingToBluetooth; 88 Optional<bool> playingToBluetoothOverride; 65 89 #endif 66 90 AudioSession::CategoryType m_categoryOverride; … … 80 104 } 81 105 106 void AudioSession::audioOutputDeviceChanged() 107 { 108 #if ENABLE(ROUTING_ARBITRATION) 109 if (!m_private->playingToBluetooth || *m_private->playingToBluetooth == defaultDeviceTransportIsBluetooth()) 110 return; 111 112 m_private->playingToBluetooth = WTF::nullopt; 113 #endif 114 } 115 116 void AudioSession::setIsPlayingToBluetoothOverride(Optional<bool> value) 117 { 118 #if ENABLE(ROUTING_ARBITRATION) 119 isPlayingToBluetoothOverride = value; 120 #else 121 UNUSED_PARAM(value); 122 #endif 123 } 124 82 125 void AudioSession::setCategory(CategoryType category, RouteSharingPolicy) 83 126 { 84 127 #if ENABLE(ROUTING_ARBITRATION) 85 if (category == m_private->category) 86 return; 128 bool playingToBluetooth = defaultDeviceTransportIsBluetooth(); 129 if (category == m_private->category && m_private->playingToBluetooth && *m_private->playingToBluetooth == playingToBluetooth) 130 return; 131 87 132 m_private->category = category; 88 133 … … 106 151 using DefaultRouteChanged = AudioSessionRoutingArbitrationClient::DefaultRouteChanged; 107 152 153 m_private->playingToBluetooth = playingToBluetooth; 108 154 m_private->setupArbitrationOngoing = true; 109 155 m_routingArbitrationClient->beginRoutingArbitrationWithCategory(m_private->category, [this] (RoutingArbitrationError error, DefaultRouteChanged defaultRouteChanged) { -
trunk/Source/WebCore/testing/Internals.cpp
r266116 r266121 4937 4937 #endif 4938 4938 4939 ExceptionOr<void> Internals::setIsPlayingToBluetoothOverride(Optional<bool> isPlaying) 4940 { 4941 #if ENABLE(ROUTING_ARBITRATION) 4942 AudioSession::sharedSession().setIsPlayingToBluetoothOverride(isPlaying); 4943 return { }; 4944 #else 4945 UNUSED_PARAM(isPlaying); 4946 return Exception { NotSupportedError }; 4947 #endif 4948 } 4949 4939 4950 void Internals::reportBacktrace() 4940 4951 { -
trunk/Source/WebCore/testing/Internals.h
r265379 r266121 624 624 #endif 625 625 626 ExceptionOr<void> setIsPlayingToBluetoothOverride(Optional<bool>); 627 626 628 bool isSelectPopupVisible(HTMLSelectElement&); 627 629 -
trunk/Source/WebCore/testing/Internals.idl
r265379 r266121 652 652 [Conditional=VIDEO] double privatePlayerVolume(HTMLMediaElement media); 653 653 654 [MayThrowException] void setIsPlayingToBluetoothOverride(optional boolean? isPlaying = null); 655 654 656 [Conditional=LEGACY_ENCRYPTED_MEDIA] void initializeMockCDM(); 655 657 [Conditional=ENCRYPTED_MEDIA] MockCDMFactory registerMockCDM(); -
trunk/Source/WebKit/ChangeLog
r266116 r266121 1 2020-08-25 Eric Carlson <eric.carlson@apple.com> 2 3 [macOS] Update audio arbitration manager when audio transport changes 4 https://bugs.webkit.org/show_bug.cgi?id=215781 5 <rdar://problem/65920613> 6 7 Reviewed by Jer Noble. 8 9 * UIProcess/API/Cocoa/WKWebViewPrivateForTesting.h: 10 * UIProcess/API/Cocoa/WKWebViewTesting.mm: 11 (-[WKWebView _audioRoutingArbitrationUpdateTime]): 12 13 * UIProcess/Media/AudioSessionRoutingArbitratorProxy.h: 14 (WebKit::AudioSessionRoutingArbitratorProxy::arbitrationUpdateTime const): 15 16 * UIProcess/Media/cocoa/AudioSessionRoutingArbitratorProxyCocoa.mm: 17 (WebKit::AudioSessionRoutingArbitratorProxy::beginRoutingArbitrationWithCategory): 18 1 19 2020-08-25 Youenn Fablet <youenn@apple.com> 2 20 -
trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivateForTesting.h
r264138 r266121 75 75 - (BOOL)_hasSleepDisabler; 76 76 - (WKWebViewAudioRoutingArbitrationStatus)_audioRoutingArbitrationStatus; 77 - (double)_audioRoutingArbitrationUpdateTime; 77 78 @end -
trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewTesting.mm
r264138 r266121 263 263 } 264 264 265 - (double)_audioRoutingArbitrationUpdateTime 266 { 267 #if ENABLE(ROUTING_ARBITRATION) 268 return _page->process().audioSessionRoutingArbitrator().arbitrationUpdateTime().secondsSinceEpoch().seconds(); 269 #else 270 return 0; 271 #endif 272 } 273 265 274 @end -
trunk/Source/WebKit/UIProcess/Media/AudioSessionRoutingArbitratorProxy.h
r263328 r266121 30 30 #include "MessageReceiver.h" 31 31 #include <WebCore/AudioSession.h> 32 #include <wtf/WallTime.h> 32 33 #include <wtf/WeakPtr.h> 33 34 … … 60 61 61 62 ArbitrationStatus arbitrationStatus() const { return m_arbitrationStatus; } 63 WallTime arbitrationUpdateTime() const { return m_arbitrationUpdateTime; } 62 64 63 65 private: … … 72 74 WebCore::AudioSession::CategoryType m_category { WebCore::AudioSession::None }; 73 75 ArbitrationStatus m_arbitrationStatus { ArbitrationStatus::None }; 76 WallTime m_arbitrationUpdateTime; 74 77 }; 75 78 -
trunk/Source/WebKit/UIProcess/Media/cocoa/AudioSessionRoutingArbitratorProxyCocoa.mm
r265089 r266121 179 179 m_category = category; 180 180 m_arbitrationStatus = ArbitrationStatus::Pending; 181 m_arbitrationUpdateTime = WallTime::now(); 181 182 SharedArbitrator::sharedInstance().beginRoutingArbitrationForArbitrator(*this, [weakThis = makeWeakPtr(*this), callback = WTFMove(callback)] (RoutingArbitrationError error, DefaultRouteChanged routeChanged) mutable { 182 183 if (weakThis) -
trunk/Tools/ChangeLog
r266120 r266121 1 2020-08-25 Eric Carlson <eric.carlson@apple.com> 2 3 [macOS] Update audio arbitration manager when audio transport changes 4 https://bugs.webkit.org/show_bug.cgi?id=215781 5 <rdar://problem/65920613> 6 7 Reviewed by Jer Noble. 8 9 * TestWebKitAPI/Tests/WebKitCocoa/AudioRoutingArbitration.mm: 10 (AudioRoutingArbitration::statusShouldBecomeEqualTo): Add message string to help 11 debugging when the test fails. 12 * TestWebKitAPI/Tests/WebKitLegacy/ios/video-with-audio.html: 13 1 14 2020-08-25 Youenn Fablet <youenn@apple.com> 2 15 -
trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/AudioRoutingArbitration.mm
r263328 r266121 34 34 #import <WebKit/WKWebViewPrivate.h> 35 35 #import <WebKit/WKWebViewPrivateForTesting.h> 36 #import <wtf/WallTime.h> 36 37 37 38 class AudioRoutingArbitration : public testing::Test { … … 42 43 { 43 44 auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]); 45 WKRetainPtr<WKContextRef> context = adoptWK(TestWebKitAPI::Util::createContextForInjectedBundleTest("InternalsInjectedBundleTest")); 46 configuration.get().processPool = (WKProcessPool *)context.get(); 44 47 configuration.get()._mediaDataLoadsAutomatically = YES; 45 48 configuration.get().mediaTypesRequiringUserActionForPlayback = WKAudiovisualMediaTypeNone; … … 57 60 } 58 61 59 void statusShouldBecomeEqualTo(WKWebViewAudioRoutingArbitrationStatus status )62 void statusShouldBecomeEqualTo(WKWebViewAudioRoutingArbitrationStatus status, const char* message) 60 63 { 61 64 int tries = 0; … … 67 70 } while (++tries <= 100); 68 71 69 EXPECT_EQ(status, [webView _audioRoutingArbitrationStatus]) ;72 EXPECT_EQ(status, [webView _audioRoutingArbitrationStatus]) << message; 70 73 } 71 74 }; … … 73 76 TEST_F(AudioRoutingArbitration, Basic) 74 77 { 75 statusShouldBecomeEqualTo(WKWebViewAudioRoutingArbitrationStatusActive );78 statusShouldBecomeEqualTo(WKWebViewAudioRoutingArbitrationStatusActive, "Basic"); 76 79 } 77 80 78 81 TEST_F(AudioRoutingArbitration, Mute) 79 82 { 80 statusShouldBecomeEqualTo(WKWebViewAudioRoutingArbitrationStatusActive );83 statusShouldBecomeEqualTo(WKWebViewAudioRoutingArbitrationStatusActive, "Mute 1"); 81 84 82 85 [webView objectByEvaluatingJavaScriptWithUserGesture:@"document.querySelector('video').muted = true"]; 83 86 84 statusShouldBecomeEqualTo(WKWebViewAudioRoutingArbitrationStatusNone );87 statusShouldBecomeEqualTo(WKWebViewAudioRoutingArbitrationStatusNone, "Mute 2"); 85 88 86 89 [webView objectByEvaluatingJavaScriptWithUserGesture:@"document.querySelector('video').muted = false"]; 87 90 88 statusShouldBecomeEqualTo(WKWebViewAudioRoutingArbitrationStatusActive );91 statusShouldBecomeEqualTo(WKWebViewAudioRoutingArbitrationStatusActive, "Mute 3"); 89 92 } 90 93 91 94 TEST_F(AudioRoutingArbitration, Navigation) 92 95 { 93 statusShouldBecomeEqualTo(WKWebViewAudioRoutingArbitrationStatusActive );96 statusShouldBecomeEqualTo(WKWebViewAudioRoutingArbitrationStatusActive, "Navigation 1"); 94 97 95 98 [webView synchronouslyLoadHTMLString:@"<html>no contents</html>"]; 96 99 97 statusShouldBecomeEqualTo(WKWebViewAudioRoutingArbitrationStatusNone );100 statusShouldBecomeEqualTo(WKWebViewAudioRoutingArbitrationStatusNone, "Navigation 2"); 98 101 } 99 102 100 103 TEST_F(AudioRoutingArbitration, Deletion) 101 104 { 102 statusShouldBecomeEqualTo(WKWebViewAudioRoutingArbitrationStatusActive );105 statusShouldBecomeEqualTo(WKWebViewAudioRoutingArbitrationStatusActive, "Deletion 1"); 103 106 104 107 [webView objectByEvaluatingJavaScriptWithUserGesture:@"document.querySelector('video').parentNode.innerHTML = ''"]; 105 108 106 statusShouldBecomeEqualTo(WKWebViewAudioRoutingArbitrationStatusNone );109 statusShouldBecomeEqualTo(WKWebViewAudioRoutingArbitrationStatusNone, "Deletion 2"); 107 110 } 108 111 109 112 TEST_F(AudioRoutingArbitration, Close) 110 113 { 111 statusShouldBecomeEqualTo(WKWebViewAudioRoutingArbitrationStatusActive );114 statusShouldBecomeEqualTo(WKWebViewAudioRoutingArbitrationStatusActive, "Close 1"); 112 115 113 116 [webView _close]; 114 117 115 statusShouldBecomeEqualTo(WKWebViewAudioRoutingArbitrationStatusNone );118 statusShouldBecomeEqualTo(WKWebViewAudioRoutingArbitrationStatusNone, "Close 2"); 116 119 } 117 120 121 TEST_F(AudioRoutingArbitration, Updating) 122 { 123 statusShouldBecomeEqualTo(WKWebViewAudioRoutingArbitrationStatusActive, "Updating 1"); 124 125 [webView evaluateJavaScript:@"document.querySelector('video').pause()" completionHandler:nil]; 126 statusShouldBecomeEqualTo(WKWebViewAudioRoutingArbitrationStatusActive, "Updating 2"); 127 128 auto start = WallTime::now().secondsSinceEpoch().seconds(); 129 auto arbitrationUpdateTime = [webView _audioRoutingArbitrationUpdateTime]; 130 ASSERT_TRUE(arbitrationUpdateTime < start); 131 132 [webView evaluateJavaScript:@"document.querySelector('video').play()" completionHandler:nil]; 133 EXPECT_EQ(arbitrationUpdateTime, [webView _audioRoutingArbitrationUpdateTime]) << "Arbitration was unexpectedly updated"; 134 statusShouldBecomeEqualTo(WKWebViewAudioRoutingArbitrationStatusActive, "Updating 3"); 135 136 [webView evaluateJavaScript:@"document.querySelector('video').pause()" completionHandler:nil]; 137 [webView stringByEvaluatingJavaScript:@"window.internals.setIsPlayingToBluetoothOverride(true)"]; 138 139 [webView evaluateJavaScript:@"document.querySelector('video').play()" completionHandler:nil]; 140 141 int tries = 0; 142 do { 143 if ([webView _audioRoutingArbitrationUpdateTime] > arbitrationUpdateTime) 144 break; 145 146 TestWebKitAPI::Util::sleep(0.1); 147 } while (++tries <= 100); 148 149 EXPECT_LT(arbitrationUpdateTime, [webView _audioRoutingArbitrationUpdateTime]) << "Arbitration was not updated"; 150 151 [webView stringByEvaluatingJavaScript:@"window.internals.setIsPlayingToBluetoothOverride()"]; 152 } 118 153 119 154 #endif -
trunk/Tools/TestWebKitAPI/Tests/WebKitLegacy/ios/video-with-audio.html
r264106 r266121 3 3 <head> 4 4 <script> 5 var timeout;6 7 5 function go() { 8 6 var video = document.getElementsByTagName('video')[0]; … … 30 28 } 31 29 30 function pause() { 31 let video = document.getElementsByTagName('video')[0]; 32 video.addEventListener("pause", paused, { once: true }); 33 video.pause(); 34 } 35 36 function play() { 37 go(); 38 } 39 32 40 document.addEventListener('pageshow', go); 33 41 </script>
Note:
See TracChangeset
for help on using the changeset viewer.