⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 276504 in webkit


Ignore:
Timestamp:
Apr 23, 2021, 10:21:25 AM (5 years ago)
Author:
youenn@apple.com
Message:

Fix KVO for camera/microphone capture state WKWebView API
https://bugs.webkit.org/show_bug.cgi?id=224922
<rdar://problem/77008199>

Reviewed by Eric Carlson.

Source/WebKit:

Add missing willChange observer call and migrate keys to API keys.
Covered by API test.

  • UIProcess/Cocoa/PageClientImplCocoa.h:
  • UIProcess/Cocoa/PageClientImplCocoa.mm:

(WebKit::PageClientImplCocoa::microphoneCaptureWillChange):
(WebKit::PageClientImplCocoa::cameraCaptureWillChange):
(WebKit::PageClientImplCocoa::microphoneCaptureChanged):
(WebKit::PageClientImplCocoa::cameraCaptureChanged):

  • UIProcess/PageClient.h:

(WebKit::PageClient::microphoneCaptureWillChange):
(WebKit::PageClient::cameraCaptureWillChange):

  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::updateReportedMediaCaptureState):

Tools:

Add tests for capture state API.

  • TestWebKitAPI/Tests/WebKit/GetUserMedia.mm:

(-[MediaCaptureObserver observeValueForKeyPath:ofObject:change:context:]):
(TestWebKitAPI::waitUntilCameraState):
(TestWebKitAPI::waitUntilMicrophoneState):
(TestWebKitAPI::TEST):

Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r276502 r276504  
     12021-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
    1242021-04-23  Chris Dumez  <cdumez@apple.com>
    225
  • trunk/Source/WebKit/UIProcess/Cocoa/PageClientImplCocoa.h

    r275442 r276504  
    7878#endif
    7979
     80    void microphoneCaptureWillChange() final;
     81    void cameraCaptureWillChange() final;
    8082    void microphoneCaptureChanged() final;
    8183    void cameraCaptureChanged() final;
  • trunk/Source/WebKit/UIProcess/Cocoa/PageClientImplCocoa.mm

    r275984 r276504  
    148148}
    149149
     150void PageClientImplCocoa::microphoneCaptureWillChange()
     151{
     152    [m_webView willChangeValueForKey:@"microphoneCaptureState"];
     153}
     154
     155void PageClientImplCocoa::cameraCaptureWillChange()
     156{
     157    [m_webView willChangeValueForKey:@"cameraCaptureState"];
     158}
     159
    150160void PageClientImplCocoa::microphoneCaptureChanged()
    151161{
    152     [m_webView didChangeValueForKey:@"_microphoneCaptureState"];
     162    [m_webView didChangeValueForKey:@"microphoneCaptureState"];
    153163}
    154164
    155165void PageClientImplCocoa::cameraCaptureChanged()
    156166{
    157     [m_webView didChangeValueForKey:@"_cameraCaptureState"];
     167    [m_webView didChangeValueForKey:@"cameraCaptureState"];
    158168}
    159169
  • trunk/Source/WebKit/UIProcess/PageClient.h

    r276148 r276504  
    543543#endif
    544544
     545    virtual void microphoneCaptureWillChange() { }
     546    virtual void cameraCaptureWillChange() { }
    545547    virtual void microphoneCaptureChanged() { }
    546548    virtual void cameraCaptureChanged() { }
  • trunk/Source/WebKit/UIProcess/WebPageProxy.cpp

    r276490 r276504  
    92319231    bool cameraCaptureChanged = (m_reportedMediaCaptureState & MediaProducer::VideoCaptureMask) != (activeCaptureState & MediaProducer::VideoCaptureMask);
    92329232
     9233    if (microphoneCaptureChanged)
     9234        pageClient().microphoneCaptureWillChange();
     9235    if (cameraCaptureChanged)
     9236        pageClient().cameraCaptureWillChange();
     9237
    92339238    m_reportedMediaCaptureState = activeCaptureState;
    92349239    m_uiClient->mediaCaptureStateDidChange(m_mediaState);
     9240
    92359241    if (microphoneCaptureChanged)
    92369242        pageClient().microphoneCaptureChanged();
  • trunk/Tools/ChangeLog

    r276488 r276504  
     12021-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
    1172021-04-22  Tyler Wilcock  <twilco.o@protonmail.com>
    218
  • trunk/Tools/TestWebKitAPI/Tests/WebKit/GetUserMedia.mm

    r275975 r276504  
    8989@end
    9090
     91static bool cameraCaptureStateChange;
     92static bool microphoneCaptureStateChange;
     93static WKMediaCaptureState cameraCaptureState;
     94static 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
    91114namespace TestWebKitAPI {
    92115
     
    192215}
    193216
     217bool waitUntilCameraState(WKWebView *webView, WKMediaCaptureState expectedState)
     218{
     219    if (expectedState == cameraCaptureState)
     220        return true;
     221    TestWebKitAPI::Util::run(&cameraCaptureStateChange);
     222    return expectedState == cameraCaptureState;
     223}
     224
     225bool waitUntilMicrophoneState(WKWebView *webView, WKMediaCaptureState expectedState)
     226{
     227    if (expectedState == microphoneCaptureState)
     228        return true;
     229    TestWebKitAPI::Util::run(&microphoneCaptureStateChange);
     230    return expectedState == microphoneCaptureState;
     231}
     232
     233TEST(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
    194309TEST(WebKit2, CaptureStop)
    195310{
Note: See TracChangeset for help on using the changeset viewer.