Changeset 248104 in webkit


Ignore:
Timestamp:
Aug 1, 2019 9:17:56 AM (5 years ago)
Author:
youenn@apple.com
Message:

UserMediaPermissionRequestManagerProxy should not use audio+video denied requests to deny audio-only or video-only requests
https://bugs.webkit.org/show_bug.cgi?id=200317

Reviewed by Eric Carlson.

Source/WebKit:

Only match audio+video denied requests with new audio+video requests.
That will ensure that audio can still be captured if user denied access to the camera through preferences
and website started with a getUserMedia({audio: true, video: true}) call.
Covered by added API test.

  • UIProcess/UserMediaPermissionRequestManagerProxy.cpp:

(WebKit::UserMediaPermissionRequestManagerProxy::wasRequestDenied):

Tools:

  • TestWebKitAPI/Tests/WebKit/getUserMediaAudioVideoCapture.html: Added
  • TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
  • TestWebKitAPI/Tests/WebKit/GetUserMediaReprompt.mm:

(-[GetUserMediaOnlyAudioUIDelegate _webView:requestMediaCaptureAuthorization:decisionHandler:]):
(-[GetUserMediaOnlyAudioUIDelegate _webView:checkUserMediaPermissionForURL:mainFrameURL:frameIdentifier:decisionHandler:]):
(TestWebKitAPI::TEST):

LayoutTests:

Update existing test with new behavior.
Added new test for the case where video is blocked but not audio.

  • fast/mediastream/getUserMedia-deny-persistency3-expected.txt:
  • fast/mediastream/getUserMedia-deny-persistency3.html:
  • fast/mediastream/getUserMedia-deny-persistency4-expected.txt: Added.
  • fast/mediastream/getUserMedia-deny-persistency4.html: Added.
Location:
trunk
Files:
3 added
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r248102 r248104  
     12019-08-01  Youenn Fablet  <youenn@apple.com>
     2
     3        UserMediaPermissionRequestManagerProxy should not use audio+video denied requests to deny audio-only or video-only requests
     4        https://bugs.webkit.org/show_bug.cgi?id=200317
     5
     6        Reviewed by Eric Carlson.
     7
     8        Update existing test with new behavior.
     9        Added new test for the case where video is blocked but not audio.
     10
     11        * fast/mediastream/getUserMedia-deny-persistency3-expected.txt:
     12        * fast/mediastream/getUserMedia-deny-persistency3.html:
     13        * fast/mediastream/getUserMedia-deny-persistency4-expected.txt: Added.
     14        * fast/mediastream/getUserMedia-deny-persistency4.html: Added.
     15
    1162019-08-01  Carlos Garcia Campos  <cgarcia@igalia.com>
    217
  • trunk/LayoutTests/fast/mediastream/getUserMedia-deny-persistency3-expected.txt

    r217945 r248104  
    11
    2 PASS Testing same page getUserMedia deny persistency with audio and video denied
     2PASS Testing same page getUserMedia deny persistency, the first denied request being audio and video, the second granted request being audio
    33
  • trunk/LayoutTests/fast/mediastream/getUserMedia-deny-persistency3.html

    r217945 r248104  
    77    <body>
    88        <script>
    9 
    10 promise_test((test) => {
     9promise_test(async (test) => {
    1110    if (window.testRunner)
    1211        testRunner.setUserMediaPermission(false);
    13     return navigator.mediaDevices.getUserMedia({audio:true, video:true}).then(assert_unreached, (e) => {
     12    await navigator.mediaDevices.getUserMedia({audio:true, video:true}).then(assert_unreached, (e) => {
    1413        assert_equals(e.name, "NotAllowedError");
    15         if (window.testRunner)
    16             testRunner.setUserMediaPermission(true);
    17         return navigator.mediaDevices.getUserMedia({audio:true, video:false}).then(assert_unreached, (e) => {
    18             assert_equals(e.name, "NotAllowedError");
    19         });
    20     }).then(() => {
    21         return navigator.mediaDevices.getUserMedia({audio:true, video:false}).then(assert_unreached, (e) => {
    22             assert_equals(e.name, "NotAllowedError");
    23         });
    2414    });
    25 }, "Testing same page getUserMedia deny persistency with audio and video denied");
     15    if (window.testRunner)
     16        testRunner.setUserMediaPermission(true);
     17    await navigator.mediaDevices.getUserMedia({audio:true});
     18    if (window.testRunner)
     19        testRunner.setUserMediaPermission(false);
     20    await navigator.mediaDevices.getUserMedia({audio:true});
     21
     22    await navigator.mediaDevices.getUserMedia({video:true}).then(assert_unreached, (e) => {
     23        assert_equals(e.name, "NotAllowedError");
     24    });
     25}, "Testing same page getUserMedia deny persistency, the first denied request being audio and video, the second granted request being audio");
    2626        </script>
    2727    </body>
  • trunk/Source/WebKit/ChangeLog

    r248102 r248104  
     12019-08-01  Youenn Fablet  <youenn@apple.com>
     2
     3        UserMediaPermissionRequestManagerProxy should not use audio+video denied requests to deny audio-only or video-only requests
     4        https://bugs.webkit.org/show_bug.cgi?id=200317
     5
     6        Reviewed by Eric Carlson.
     7
     8        Only match audio+video denied requests with new audio+video requests.
     9        That will ensure that audio can still be captured if user denied access to the camera through preferences
     10        and website started with a getUserMedia({audio: true, video: true}) call.
     11        Covered by added API test.
     12
     13        * UIProcess/UserMediaPermissionRequestManagerProxy.cpp:
     14        (WebKit::UserMediaPermissionRequestManagerProxy::wasRequestDenied):
     15
    1162019-08-01  Carlos Garcia Campos  <cgarcia@igalia.com>
    217
  • trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp

    r247662 r248104  
    292292        if (deniedRequest.mainFrameID != mainFrameID)
    293293            continue;
     294
     295        if (deniedRequest.isScreenCaptureDenied && needsScreenCapture)
     296            return true;
     297
     298        // In case we asked for both audio and video, maybe the callback would have returned true for just audio or just video.
     299        if (deniedRequest.isAudioDenied && deniedRequest.isVideoDenied) {
     300            if (needsAudio && needsVideo)
     301                return true;
     302            continue;
     303        }
     304
    294305        if (deniedRequest.isAudioDenied && needsAudio)
    295306            return true;
    296307        if (deniedRequest.isVideoDenied && needsVideo)
    297             return true;
    298         if (deniedRequest.isScreenCaptureDenied && needsScreenCapture)
    299308            return true;
    300309    }
  • trunk/Tools/ChangeLog

    r248103 r248104  
     12019-08-01  Youenn Fablet  <youenn@apple.com>
     2
     3        UserMediaPermissionRequestManagerProxy should not use audio+video denied requests to deny audio-only or video-only requests
     4        https://bugs.webkit.org/show_bug.cgi?id=200317
     5
     6        Reviewed by Eric Carlson.
     7
     8        * TestWebKitAPI/Tests/WebKit/getUserMediaAudioVideoCapture.html: Added
     9        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
     10        * TestWebKitAPI/Tests/WebKit/GetUserMediaReprompt.mm:
     11        (-[GetUserMediaOnlyAudioUIDelegate _webView:requestMediaCaptureAuthorization:decisionHandler:]):
     12        (-[GetUserMediaOnlyAudioUIDelegate _webView:checkUserMediaPermissionForURL:mainFrameURL:frameIdentifier:decisionHandler:]):
     13        (TestWebKitAPI::TEST):
     14
    1152019-08-01  Aakash Jain  <aakash_jain@apple.com>
    216
  • trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj

    r248095 r248104  
    3939                07492B3C1DF8B86600633DE1 /* enumerateMediaDevices.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 07492B391DF8ADA400633DE1 /* enumerateMediaDevices.html */; };
    4040                074994421EA5034B000DA44E /* getUserMedia.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 4A410F4D19AF7BEF002EBAB5 /* getUserMedia.html */; };
     41                074994421EA5034B000DA45E /* getUserMediaAudioVideoCapture.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 4A410F4D19AF7BEF002EBAC5 /* getUserMediaAudioVideoCapture.html */; };
    4142                074994421EA5034B000DA44F /* ondevicechange.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 4A410F4D19AF7BEF002EBAB6 /* ondevicechange.html */; };
    4243                076E507F1F4513D6006E9F5A /* Logging.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 076E507E1F45031E006E9F5A /* Logging.cpp */; };
     
    12061207                                467C565321B5ED130057516D /* GetSessionCookie.html in Copy Resources */,
    12071208                                074994421EA5034B000DA44E /* getUserMedia.html in Copy Resources */,
     1209                                074994421EA5034B000DA45E /* getUserMediaAudioVideoCapture.html in Copy Resources */,
    12081210                                F46A095B1ED8A6E600D4AA55 /* gif-and-file-input.html in Copy Resources */,
    12091211                                573255A522139BC700396AE8 /* helloworld.webarchive in Copy Resources */,
     
    16691671                4A410F4B19AF7BD6002EBAB5 /* UserMedia.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UserMedia.cpp; sourceTree = "<group>"; };
    16701672                4A410F4D19AF7BEF002EBAB5 /* getUserMedia.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = getUserMedia.html; sourceTree = "<group>"; };
     1673                4A410F4D19AF7BEF002EBAC5 /* getUserMediaAudioVideoCapture.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = getUserMediaAudioVideoCapture.html; sourceTree = "<group>"; };
    16711674                4A410F4D19AF7BEF002EBAB6 /* ondevicechange.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = ondevicechange.html; sourceTree = "<group>"; };
    16721675                4BB4160116815B2600824238 /* JSWrapperForNodeInWebFrame.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = JSWrapperForNodeInWebFrame.mm; sourceTree = "<group>"; };
     
    36243627                                26F52EB118288F0F0023D412 /* geolocationWatchPositionWithHighAccuracy.html */,
    36253628                                4A410F4D19AF7BEF002EBAB5 /* getUserMedia.html */,
     3629                                4A410F4D19AF7BEF002EBAC5 /* getUserMediaAudioVideoCapture.html */,
    36263630                                BCBD372E125ABBE600D2C29F /* icon.png */,
    36273631                                CE3524F51B142BBB0028A7C5 /* input-focus-blur.html */,
  • trunk/Tools/TestWebKitAPI/Tests/WebKit/GetUserMediaReprompt.mm

    r246093 r248104  
    5151    wasPrompted = true;
    5252    decisionHandler(YES);
     53}
     54
     55- (void)_webView:(WKWebView *)webView checkUserMediaPermissionForURL:(NSURL *)url mainFrameURL:(NSURL *)mainFrameURL frameIdentifier:(NSUInteger)frameIdentifier decisionHandler:(void (^)(NSString *salt, BOOL authorized))decisionHandler
     56{
     57    decisionHandler(@"0x987654321", YES);
     58}
     59@end
     60
     61@interface GetUserMediaOnlyAudioUIDelegate : NSObject<WKUIDelegate>
     62- (void)_webView:(WKWebView *)webView requestMediaCaptureAuthorization: (_WKCaptureDevices)devices decisionHandler:(void (^)(BOOL))decisionHandler;
     63- (void)_webView:(WKWebView *)webView checkUserMediaPermissionForURL:(NSURL *)url mainFrameURL:(NSURL *)mainFrameURL frameIdentifier:(NSUInteger)frameIdentifier decisionHandler:(void (^)(NSString *salt, BOOL authorized))decisionHandler;
     64@end
     65
     66@implementation GetUserMediaOnlyAudioUIDelegate
     67- (void)_webView:(WKWebView *)webView requestMediaCaptureAuthorization: (_WKCaptureDevices)devices decisionHandler:(void (^)(BOOL))decisionHandler
     68{
     69    numberOfPrompts++;
     70    wasPrompted = true;
     71    decisionHandler((devices == _WKCaptureDeviceMicrophone) ? YES : NO);
    5372}
    5473
     
    120139}
    121140
     141TEST(WebKit2, GetUserMediaRepromptAfterAudioVideoBeingDenied)
     142{
     143    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
     144    auto processPoolConfig = adoptNS([[_WKProcessPoolConfiguration alloc] init]);
     145    auto preferences = [configuration preferences];
     146    preferences._mediaCaptureRequiresSecureConnection = NO;
     147    preferences._mediaDevicesEnabled = YES;
     148    preferences._mockCaptureDevicesEnabled = YES;
     149    auto webView = [[GetUserMediaRepromptTestView alloc] initWithFrame:CGRectMake(0, 0, 320, 500) configuration:configuration.get() processPoolConfiguration:processPoolConfig.get()];
     150    auto delegate = adoptNS([[GetUserMediaOnlyAudioUIDelegate alloc] init]);
     151    webView.UIDelegate = delegate.get();
     152
     153    wasPrompted = false;
     154    [webView loadTestPageNamed:@"getUserMediaAudioVideoCapture"];
     155    TestWebKitAPI::Util::run(&wasPrompted);
     156    EXPECT_TRUE([webView haveStream:NO]);
     157
     158    wasPrompted = false;
     159    [webView stringByEvaluatingJavaScript:@"promptForAudioOnly()"];
     160    TestWebKitAPI::Util::run(&wasPrompted);
     161    EXPECT_TRUE([webView haveStream:YES]);
     162}
     163
    122164TEST(WebKit2, MultipleGetUserMediaSynchronously)
    123165{
Note: See TracChangeset for help on using the changeset viewer.