Changeset 276504 in webkit
- Timestamp:
- Apr 23, 2021, 10:21:25 AM (5 years ago)
- Location:
- trunk
- Files:
-
- 7 edited
-
Source/WebKit/ChangeLog (modified) (1 diff)
-
Source/WebKit/UIProcess/Cocoa/PageClientImplCocoa.h (modified) (1 diff)
-
Source/WebKit/UIProcess/Cocoa/PageClientImplCocoa.mm (modified) (1 diff)
-
Source/WebKit/UIProcess/PageClient.h (modified) (1 diff)
-
Source/WebKit/UIProcess/WebPageProxy.cpp (modified) (1 diff)
-
Tools/ChangeLog (modified) (1 diff)
-
Tools/TestWebKitAPI/Tests/WebKit/GetUserMedia.mm (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r276502 r276504 1 2021-04-23 Youenn Fablet <youenn@apple.com> 2 3 Fix KVO for camera/microphone capture state WKWebView API 4 https://bugs.webkit.org/show_bug.cgi?id=224922 5 <rdar://problem/77008199> 6 7 Reviewed by Eric Carlson. 8 9 Add missing willChange observer call and migrate keys to API keys. 10 Covered by API test. 11 12 * UIProcess/Cocoa/PageClientImplCocoa.h: 13 * UIProcess/Cocoa/PageClientImplCocoa.mm: 14 (WebKit::PageClientImplCocoa::microphoneCaptureWillChange): 15 (WebKit::PageClientImplCocoa::cameraCaptureWillChange): 16 (WebKit::PageClientImplCocoa::microphoneCaptureChanged): 17 (WebKit::PageClientImplCocoa::cameraCaptureChanged): 18 * UIProcess/PageClient.h: 19 (WebKit::PageClient::microphoneCaptureWillChange): 20 (WebKit::PageClient::cameraCaptureWillChange): 21 * UIProcess/WebPageProxy.cpp: 22 (WebKit::WebPageProxy::updateReportedMediaCaptureState): 23 1 24 2021-04-23 Chris Dumez <cdumez@apple.com> 2 25 -
trunk/Source/WebKit/UIProcess/Cocoa/PageClientImplCocoa.h
r275442 r276504 78 78 #endif 79 79 80 void microphoneCaptureWillChange() final; 81 void cameraCaptureWillChange() final; 80 82 void microphoneCaptureChanged() final; 81 83 void cameraCaptureChanged() final; -
trunk/Source/WebKit/UIProcess/Cocoa/PageClientImplCocoa.mm
r275984 r276504 148 148 } 149 149 150 void PageClientImplCocoa::microphoneCaptureWillChange() 151 { 152 [m_webView willChangeValueForKey:@"microphoneCaptureState"]; 153 } 154 155 void PageClientImplCocoa::cameraCaptureWillChange() 156 { 157 [m_webView willChangeValueForKey:@"cameraCaptureState"]; 158 } 159 150 160 void PageClientImplCocoa::microphoneCaptureChanged() 151 161 { 152 [m_webView didChangeValueForKey:@" _microphoneCaptureState"];162 [m_webView didChangeValueForKey:@"microphoneCaptureState"]; 153 163 } 154 164 155 165 void PageClientImplCocoa::cameraCaptureChanged() 156 166 { 157 [m_webView didChangeValueForKey:@" _cameraCaptureState"];167 [m_webView didChangeValueForKey:@"cameraCaptureState"]; 158 168 } 159 169 -
trunk/Source/WebKit/UIProcess/PageClient.h
r276148 r276504 543 543 #endif 544 544 545 virtual void microphoneCaptureWillChange() { } 546 virtual void cameraCaptureWillChange() { } 545 547 virtual void microphoneCaptureChanged() { } 546 548 virtual void cameraCaptureChanged() { } -
trunk/Source/WebKit/UIProcess/WebPageProxy.cpp
r276490 r276504 9231 9231 bool cameraCaptureChanged = (m_reportedMediaCaptureState & MediaProducer::VideoCaptureMask) != (activeCaptureState & MediaProducer::VideoCaptureMask); 9232 9232 9233 if (microphoneCaptureChanged) 9234 pageClient().microphoneCaptureWillChange(); 9235 if (cameraCaptureChanged) 9236 pageClient().cameraCaptureWillChange(); 9237 9233 9238 m_reportedMediaCaptureState = activeCaptureState; 9234 9239 m_uiClient->mediaCaptureStateDidChange(m_mediaState); 9240 9235 9241 if (microphoneCaptureChanged) 9236 9242 pageClient().microphoneCaptureChanged(); -
trunk/Tools/ChangeLog
r276488 r276504 1 2021-04-23 Youenn Fablet <youenn@apple.com> 2 3 Fix KVO for camera/microphone capture state WKWebView API 4 https://bugs.webkit.org/show_bug.cgi?id=224922 5 <rdar://problem/77008199> 6 7 Reviewed by Eric Carlson. 8 9 Add tests for capture state API. 10 11 * TestWebKitAPI/Tests/WebKit/GetUserMedia.mm: 12 (-[MediaCaptureObserver observeValueForKeyPath:ofObject:change:context:]): 13 (TestWebKitAPI::waitUntilCameraState): 14 (TestWebKitAPI::waitUntilMicrophoneState): 15 (TestWebKitAPI::TEST): 16 1 17 2021-04-22 Tyler Wilcock <twilco.o@protonmail.com> 2 18 -
trunk/Tools/TestWebKitAPI/Tests/WebKit/GetUserMedia.mm
r275975 r276504 89 89 @end 90 90 91 static bool cameraCaptureStateChange; 92 static bool microphoneCaptureStateChange; 93 static WKMediaCaptureState cameraCaptureState; 94 static WKMediaCaptureState microphoneCaptureState; 95 96 @interface MediaCaptureObserver : NSObject 97 @end 98 99 @implementation MediaCaptureObserver 100 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *, id> *)change context:(void *)context 101 { 102 EXPECT_TRUE([keyPath isEqualToString:NSStringFromSelector(@selector(cameraCaptureState))] || [keyPath isEqualToString:NSStringFromSelector(@selector(microphoneCaptureState))]); 103 EXPECT_TRUE([[object class] isEqual:[TestWKWebView class]]); 104 if ([keyPath isEqualToString:NSStringFromSelector(@selector(cameraCaptureState))]) { 105 cameraCaptureState = (WKMediaCaptureState)[[change objectForKey:NSKeyValueChangeNewKey] unsignedIntegerValue]; 106 cameraCaptureStateChange = true; 107 return; 108 } 109 microphoneCaptureState = (WKMediaCaptureState)[[change objectForKey:NSKeyValueChangeNewKey] unsignedIntegerValue]; 110 microphoneCaptureStateChange = true; 111 } 112 @end 113 91 114 namespace TestWebKitAPI { 92 115 … … 192 215 } 193 216 217 bool waitUntilCameraState(WKWebView *webView, WKMediaCaptureState expectedState) 218 { 219 if (expectedState == cameraCaptureState) 220 return true; 221 TestWebKitAPI::Util::run(&cameraCaptureStateChange); 222 return expectedState == cameraCaptureState; 223 } 224 225 bool waitUntilMicrophoneState(WKWebView *webView, WKMediaCaptureState expectedState) 226 { 227 if (expectedState == microphoneCaptureState) 228 return true; 229 TestWebKitAPI::Util::run(µphoneCaptureStateChange); 230 return expectedState == microphoneCaptureState; 231 } 232 233 TEST(WebKit2, CaptureMuteAPI) 234 { 235 auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]); 236 auto processPoolConfig = adoptNS([[_WKProcessPoolConfiguration alloc] init]); 237 auto preferences = [configuration preferences]; 238 preferences._mediaCaptureRequiresSecureConnection = NO; 239 configuration.get()._mediaCaptureEnabled = YES; 240 preferences._mockCaptureDevicesEnabled = YES; 241 auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 500) configuration:configuration.get() processPoolConfiguration:processPoolConfig.get()]); 242 auto delegate = adoptNS([[UserMediaCaptureUIDelegate alloc] init]); 243 [webView setUIDelegate:delegate.get()]; 244 245 [webView _setMediaCaptureReportingDelayForTesting:0]; 246 247 auto observer = adoptNS([[MediaCaptureObserver alloc] init]); 248 [webView addObserver:observer.get() forKeyPath:@"microphoneCaptureState" options:NSKeyValueObservingOptionNew context:nil]; 249 [webView addObserver:observer.get() forKeyPath:@"cameraCaptureState" options:NSKeyValueObservingOptionNew context:nil]; 250 251 cameraCaptureStateChange = false; 252 [webView loadTestPageNamed:@"getUserMedia"]; 253 EXPECT_TRUE(waitUntilCameraState(webView.get(), WKMediaCaptureStateActive)); 254 255 cameraCaptureStateChange = false; 256 [webView setCameraCaptureState:WKMediaCaptureStateMuted completionHandler:nil]; 257 EXPECT_TRUE(waitUntilCameraState(webView.get(), WKMediaCaptureStateMuted)); 258 259 cameraCaptureStateChange = false; 260 [webView setCameraCaptureState:WKMediaCaptureStateActive completionHandler:nil]; 261 EXPECT_TRUE(waitUntilCameraState(webView.get(), WKMediaCaptureStateActive)); 262 263 cameraCaptureStateChange = false; 264 [webView stringByEvaluatingJavaScript:@"stop()"]; 265 EXPECT_TRUE(waitUntilCameraState(webView.get(), WKMediaCaptureStateNone)); 266 267 microphoneCaptureStateChange = false; 268 [webView stringByEvaluatingJavaScript:@"captureAudio()"]; 269 EXPECT_TRUE(waitUntilMicrophoneState(webView.get(), WKMediaCaptureStateActive)); 270 271 microphoneCaptureStateChange = false; 272 [webView setMicrophoneCaptureState:WKMediaCaptureStateMuted completionHandler:nil]; 273 EXPECT_TRUE(waitUntilMicrophoneState(webView.get(), WKMediaCaptureStateMuted)); 274 275 microphoneCaptureStateChange = false; 276 [webView setMicrophoneCaptureState:WKMediaCaptureStateActive completionHandler:nil]; 277 EXPECT_TRUE(waitUntilMicrophoneState(webView.get(), WKMediaCaptureStateActive)); 278 279 microphoneCaptureStateChange = false; 280 [webView stringByEvaluatingJavaScript:@"stop()"]; 281 EXPECT_TRUE(waitUntilMicrophoneState(webView.get(), WKMediaCaptureStateNone)); 282 283 microphoneCaptureStateChange = false; 284 cameraCaptureStateChange = false; 285 [webView stringByEvaluatingJavaScript:@"captureAudioAndVideo()"]; 286 EXPECT_TRUE(waitUntilMicrophoneState(webView.get(), WKMediaCaptureStateActive)); 287 EXPECT_TRUE(waitUntilCameraState(webView.get(), WKMediaCaptureStateActive)); 288 289 cameraCaptureStateChange = false; 290 [webView setCameraCaptureState:WKMediaCaptureStateMuted completionHandler:nil]; 291 EXPECT_TRUE(waitUntilCameraState(webView.get(), WKMediaCaptureStateMuted)); 292 EXPECT_TRUE(waitUntilMicrophoneState(webView.get(), WKMediaCaptureStateActive)); 293 294 microphoneCaptureStateChange = false; 295 [webView setMicrophoneCaptureState:WKMediaCaptureStateMuted completionHandler:nil]; 296 EXPECT_TRUE(waitUntilCameraState(webView.get(), WKMediaCaptureStateMuted)); 297 EXPECT_TRUE(waitUntilMicrophoneState(webView.get(), WKMediaCaptureStateActive)); 298 299 microphoneCaptureStateChange = false; 300 cameraCaptureStateChange = false; 301 [webView stringByEvaluatingJavaScript:@"stop()"]; 302 EXPECT_TRUE(waitUntilMicrophoneState(webView.get(), WKMediaCaptureStateNone)); 303 EXPECT_TRUE(waitUntilCameraState(webView.get(), WKMediaCaptureStateNone)); 304 305 [webView removeObserver:observer.get() forKeyPath:@"microphoneCaptureState"]; 306 [webView removeObserver:observer.get() forKeyPath:@"cameraCaptureState"]; 307 } 308 194 309 TEST(WebKit2, CaptureStop) 195 310 {
Note:
See TracChangeset
for help on using the changeset viewer.