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

Changeset 267568 in webkit


Ignore:
Timestamp:
Sep 25, 2020, 7:35:47 AM (6 years ago)
Author:
youenn@apple.com
Message:

Implement default behavior for getUserMedia requests in case where there is no delegate set
https://bugs.webkit.org/show_bug.cgi?id=216968

Reviewed by Eric Carlson.

Source/WebKit:

In case page UIDelegate is not set, make the getUserMedia request do its default action.
In case there is a UIDelegate but no getUserMedia specific delegates, make the getUserMedia request do its default action.
Default action is deny for getDisplayMedia and for non cocoa ports.
For cocoa ports, a prompt is shown.

Manually tested with MiniBrowser and MobileMiniBrowser.

  • SourcesCocoa.txt:
  • UIProcess/API/APIUIClient.h:

(API::UIClient::decidePolicyForUserMediaPermissionRequest):

  • UIProcess/Cocoa/UIDelegate.mm:

(WebKit::requestUserMediaAuthorizationForFrame):

  • UIProcess/Cocoa/UserMediaPermissionRequestProxy.mm: Renamed from Source/WebKit/UIProcess/Cocoa/WKUserMediaCaptureAccessAlert.mm.

(WebKit::alertMessageText):
(WebKit::UserMediaPermissionRequestProxy::doDefaultAction):

  • UIProcess/Cocoa/WKUserMediaCaptureAccessAlert.h: Removed.
  • UIProcess/UserMediaPermissionRequestProxy.cpp:

(WebKit::UserMediaPermissionRequestProxy::doDefaultAction):

  • UIProcess/UserMediaPermissionRequestProxy.h:
  • WebKit.xcodeproj/project.pbxproj:

Tools:

Add camera and microphone entitlements to MobileMiniBrowser.
Expose mediaDevices to web pages and use mock devices.

  • MobileMiniBrowser/MobileMiniBrowser/Info.plist:
  • MobileMiniBrowser/MobileMiniBrowserFramework/WebViewController.m:

(-[WebViewController createWebView]):

Location:
trunk
Files:
1 deleted
10 edited
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r267563 r267568  
     12020-09-25  Youenn Fablet  <youenn@apple.com>
     2
     3        Implement default behavior for getUserMedia requests in case where there is no delegate set
     4        https://bugs.webkit.org/show_bug.cgi?id=216968
     5
     6        Reviewed by Eric Carlson.
     7
     8        In case page UIDelegate is not set, make the getUserMedia request do its default action.
     9        In case there is a UIDelegate but no getUserMedia specific delegates, make the getUserMedia request do its default action.
     10        Default action is deny for getDisplayMedia and for non cocoa ports.
     11        For cocoa ports, a prompt is shown.
     12
     13        Manually tested with MiniBrowser and MobileMiniBrowser.
     14
     15        * SourcesCocoa.txt:
     16        * UIProcess/API/APIUIClient.h:
     17        (API::UIClient::decidePolicyForUserMediaPermissionRequest):
     18        * UIProcess/Cocoa/UIDelegate.mm:
     19        (WebKit::requestUserMediaAuthorizationForFrame):
     20        * UIProcess/Cocoa/UserMediaPermissionRequestProxy.mm: Renamed from Source/WebKit/UIProcess/Cocoa/WKUserMediaCaptureAccessAlert.mm.
     21        (WebKit::alertMessageText):
     22        (WebKit::UserMediaPermissionRequestProxy::doDefaultAction):
     23        * UIProcess/Cocoa/WKUserMediaCaptureAccessAlert.h: Removed.
     24        * UIProcess/UserMediaPermissionRequestProxy.cpp:
     25        (WebKit::UserMediaPermissionRequestProxy::doDefaultAction):
     26        * UIProcess/UserMediaPermissionRequestProxy.h:
     27        * WebKit.xcodeproj/project.pbxproj:
     28
    1292020-09-25  Youenn Fablet  <youenn@apple.com>
    230
  • trunk/Source/WebKit/SourcesCocoa.txt

    r267411 r267568  
    387387UIProcess/Cocoa/UIRemoteObjectRegistry.cpp
    388388UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp
     389UIProcess/Cocoa/UserMediaPermissionRequestProxy.mm
    389390UIProcess/Cocoa/VersionChecks.mm
    390391UIProcess/Cocoa/VideoFullscreenManagerProxy.mm
  • trunk/Source/WebKit/UIProcess/API/APIUIClient.h

    r266890 r267568  
    139139    virtual bool runOpenPanel(WebKit::WebPageProxy&, WebKit::WebFrameProxy*, WebKit::FrameInfoData&&, OpenPanelParameters*, WebKit::WebOpenPanelResultListenerProxy*) { return false; }
    140140    virtual void decidePolicyForGeolocationPermissionRequest(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, const WebKit::FrameInfoData&, Function<void(bool)>&) { }
    141     virtual void decidePolicyForUserMediaPermissionRequest(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, SecurityOrigin&, SecurityOrigin&, WebKit::UserMediaPermissionRequestProxy& request) { request.deny(); }
     141    virtual void decidePolicyForUserMediaPermissionRequest(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, SecurityOrigin&, SecurityOrigin&, WebKit::UserMediaPermissionRequestProxy& request) { request.doDefaultAction(); }
    142142    virtual void checkUserMediaPermissionForOrigin(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, SecurityOrigin&, SecurityOrigin&, WebKit::UserMediaPermissionCheckProxy& request) { request.deny(); }
    143143    virtual void decidePolicyForNotificationPermissionRequest(WebKit::WebPageProxy&, SecurityOrigin&, Function<void(bool)>&& completionHandler) { completionHandler(false); }
  • trunk/Source/WebKit/UIProcess/Cocoa/UIDelegate.mm

    r267414 r267568  
    4545#import "WKStorageAccessAlert.h"
    4646#import "WKUIDelegatePrivate.h"
    47 #import "WKUserMediaCaptureAccessAlert.h"
    4847#import "WKWebViewConfigurationInternal.h"
    4948#import "WKWebViewInternal.h"
     
    897896static void requestUserMediaAuthorizationForFrame(const WebFrameProxy& frame, API::SecurityOrigin& topLevelOrigin, UserMediaPermissionRequestProxy& request, id <WKUIDelegatePrivate> delegate, WKWebView& webView)
    898897{
     898    bool respondsToRequestMediaCaptureAuthorization = [delegate respondsToSelector:@selector(_webView:requestMediaCaptureAuthorization:decisionHandler:)];
     899    bool respondsToRequestUserMediaAuthorizationForDevices = [delegate respondsToSelector:@selector(_webView:requestUserMediaAuthorizationForDevices:url:mainFrameURL:decisionHandler:)];
     900
     901    if (!respondsToRequestMediaCaptureAuthorization && !respondsToRequestUserMediaAuthorizationForDevices) {
     902        request.doDefaultAction();
     903        return;
     904    }
     905
    899906    auto checker = CompletionHandlerCallChecker::create(delegate, @selector(_webView:requestMediaCaptureAuthorization:decisionHandler:));
    900907    auto decisionHandler = makeBlockPtr([protectedRequest = makeRef(request), checker = WTFMove(checker)](BOOL authorized) {
     
    920927        devices |= _WKCaptureDeviceDisplay;
    921928        ASSERT(!(devices & _WKCaptureDeviceCamera));
    922     }
    923 
    924     bool respondsToRequestMediaCaptureAuthorization = [delegate respondsToSelector:@selector(_webView:requestMediaCaptureAuthorization:decisionHandler:)];
    925     bool respondsToRequestUserMediaAuthorizationForDevices = [delegate respondsToSelector:@selector(_webView:requestUserMediaAuthorizationForDevices:url:mainFrameURL:decisionHandler:)];
    926     if (!request.requiresDisplayCapture() && !respondsToRequestUserMediaAuthorizationForDevices && !respondsToRequestMediaCaptureAuthorization) {
    927         presentUserMediaCaptureAccessAlert(&webView, topLevelOrigin, devices, [decisionHandler = WTFMove(decisionHandler)](bool authorized) mutable {
    928             decisionHandler(authorized);
    929         });
    930         return;
    931929    }
    932930
  • trunk/Source/WebKit/UIProcess/Cocoa/UserMediaPermissionRequestProxy.mm

    r267567 r267568  
    2525
    2626#import "config.h"
    27 #import "WKUserMediaCaptureAccessAlert.h"
     27#import "UserMediaPermissionRequestProxy.h"
    2828
    2929#if ENABLE(MEDIA_STREAM)
    3030
     31#import "UserMediaPermissionRequestManagerProxy.h"
    3132#import "WKWebViewInternal.h"
    32 #import "WKWebViewPrivate.h"
    33 #import "WebPageProxy.h"
    3433#import <WebCore/LocalizedStrings.h>
    3534#import <wtf/BlockPtr.h>
    3635#import <wtf/URLHelpers.h>
    37 #import <wtf/text/WTFString.h>
    3836
    3937namespace WebKit {
     
    4543}
    4644
    47 static NSString *alertMessageText(API::SecurityOrigin& topLevelOrigin, _WKCaptureDevices devices)
     45static NSString *alertMessageText(const WebCore::SecurityOrigin& origin, bool shouldAskUserForAccessToMicrophone, bool shouldAskUserForAccessToCamera)
    4846{
    49     bool shouldAskUserForAccessToCamera = devices & _WKCaptureDeviceCamera;
    50     bool shouldAskUserForAccessToMicrophone = devices & _WKCaptureDeviceMicrophone;
    51 
    52     auto& origin = topLevelOrigin.securityOrigin();
    5347    if (origin.protocol() != "http" && origin.protocol() != "https")
    5448        return nil;
     
    6357}
    6458
    65 void presentUserMediaCaptureAccessAlert(WKWebView *webView, API::SecurityOrigin& topLevelOrigin, _WKCaptureDevices devices, CompletionHandler<void(bool)>&& completionHandler)
     59void UserMediaPermissionRequestProxy::doDefaultAction()
    6660{
    67     auto *alertTitle = alertMessageText(topLevelOrigin, devices);
    68     if (!alertTitle) {
    69         completionHandler(false);
     61    ASSERT(m_manager);
     62    if (!m_manager) {
     63        deny();
     64        return;
     65    }
     66    auto *webView = fromWebPageProxy(m_manager->page());
     67    if (!webView) {
     68        deny();
     69        return;
     70    }
     71    if (requiresDisplayCapture()) {
     72        // FIXME: Implement getDisplayMedia prompt, for now deny.
     73        deny();
    7074        return;
    7175    }
    7276
    73     auto completionBlock = makeBlockPtr([completionHandler = WTFMove(completionHandler)](bool shouldAllow) mutable {
    74         completionHandler(shouldAllow);
     77    auto *alertTitle = alertMessageText(topLevelDocumentSecurityOrigin(), requiresAudioCapture(), requiresVideoCapture());
     78    if (!alertTitle) {
     79        deny();
     80        return;
     81    }
     82
     83    auto completionBlock = makeBlockPtr([this, protectedThis = makeRef(*this)](bool shouldAllow) mutable {
     84        if (!shouldAllow)
     85            deny();
     86        else
     87            allow();
    7588    });
    7689
     
    106119} // namespace WebKit
    107120
    108 #endif // ENABLE(DEVICE_ORIENTATION)
     121#else
     122
     123namespace WebKit {
     124
     125void UserMediaPermissionRequestProxy::doDefaultAction()
     126{
     127    ASSERT_NOT_REACHED();
     128}
     129
     130}
     131#endif // ENABLE(MEDIA_STREAM)
  • trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestProxy.cpp

    r248713 r267568  
    9696}
    9797
     98#if !PLATFORM(COCOA)
     99void UserMediaPermissionRequestProxy::doDefaultAction()
     100{
     101    deny();
     102}
     103#endif
     104
    98105void UserMediaPermissionRequestProxy::invalidate()
    99106{
  • trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestProxy.h

    r252048 r267568  
    4747    enum class UserMediaAccessDenialReason { NoConstraints, UserMediaDisabled, NoCaptureDevices, InvalidConstraint, HardwareError, PermissionDenied, OtherFailure };
    4848    void deny(UserMediaAccessDenialReason = UserMediaAccessDenialReason::UserMediaDisabled);
     49
     50    void doDefaultAction();
    4951
    5052    void invalidate();
  • trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj

    r267427 r267568  
    903903                413CCD5020DEBC740065A21A /* com.google.googletalkbrowserplugin.sb in Copy Plug-in Sandbox Profiles */ = {isa = PBXBuildFile; fileRef = 413CCD4F20DEBC2F0065A21A /* com.google.googletalkbrowserplugin.sb */; };
    904904                4143751C20EAEA2D00FAD06C /* cn.microdone.cmb.safari.sb in Copy Plug-in Sandbox Profiles */ = {isa = PBXBuildFile; fileRef = 4143751B20EAEA1E00FAD06C /* cn.microdone.cmb.safari.sb */; };
    905                 4147DC692519EC3300214EE7 /* WKUserMediaCaptureAccessAlert.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4147DC672519E29D00214EE7 /* WKUserMediaCaptureAccessAlert.mm */; };
    906905                414DD37920BF43F5006959FB /* com.cisco.webex.plugin.gpc64.sb in Resources */ = {isa = PBXBuildFile; fileRef = 414DD37820BF43EA006959FB /* com.cisco.webex.plugin.gpc64.sb */; };
    907906                414DD37A20BF49A5006959FB /* com.cisco.webex.plugin.gpc64.sb in Copy Plug-in Sandbox Profiles */ = {isa = PBXBuildFile; fileRef = 414DD37820BF43EA006959FB /* com.cisco.webex.plugin.gpc64.sb */; };
     
    33913390                411A8DD920DDB6050060D34F /* WKMockMediaDevice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKMockMediaDevice.h; sourceTree = "<group>"; };
    33923391                411A8DDA20DDB6050060D34F /* WKMockMediaDevice.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WKMockMediaDevice.cpp; sourceTree = "<group>"; };
     3392                411A9A9A251DE93E00807D7E /* UserMediaPermissionRequestProxy.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = UserMediaPermissionRequestProxy.mm; sourceTree = "<group>"; };
    33933393                411B22621E371244004F7363 /* LibWebRTCNetwork.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LibWebRTCNetwork.h; path = Network/webrtc/LibWebRTCNetwork.h; sourceTree = "<group>"; };
    33943394                41287D4B225C05C4009A3E26 /* WebSocketTaskCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebSocketTaskCocoa.mm; sourceTree = "<group>"; };
     
    34133413                413CCD4F20DEBC2F0065A21A /* com.google.googletalkbrowserplugin.sb */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = com.google.googletalkbrowserplugin.sb; sourceTree = "<group>"; };
    34143414                4143751B20EAEA1E00FAD06C /* cn.microdone.cmb.safari.sb */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = cn.microdone.cmb.safari.sb; sourceTree = "<group>"; };
    3415                 4147DC672519E29D00214EE7 /* WKUserMediaCaptureAccessAlert.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = WKUserMediaCaptureAccessAlert.mm; sourceTree = "<group>"; };
    3416                 4147DC682519E29D00214EE7 /* WKUserMediaCaptureAccessAlert.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WKUserMediaCaptureAccessAlert.h; sourceTree = "<group>"; };
    34173415                414DD37820BF43EA006959FB /* com.cisco.webex.plugin.gpc64.sb */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = com.cisco.webex.plugin.gpc64.sb; sourceTree = "<group>"; };
    34183416                4150A5A023E06C910051264A /* GPUProcessSessionParameters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPUProcessSessionParameters.h; sourceTree = "<group>"; };
     
    63626360                                463236862314833F00A48FA7 /* UIRemoteObjectRegistry.cpp */,
    63636361                                463236852314833F00A48FA7 /* UIRemoteObjectRegistry.h */,
     6362                                411A9A9A251DE93E00807D7E /* UserMediaPermissionRequestProxy.mm */,
    63646363                                E4E8648E1B1673FB00C82F40 /* VersionChecks.h */,
    63656364                                E4E8648F1B1673FB00C82F40 /* VersionChecks.mm */,
     
    63946393                                2DC6D9C118C44A610043BAD4 /* WKWebViewContentProviderRegistry.h */,
    63956394                                2DC6D9C218C44A610043BAD4 /* WKWebViewContentProviderRegistry.mm */,
    6396                                 4147DC682519E29D00214EE7 /* WKUserMediaCaptureAccessAlert.h */,
    6397                                 4147DC672519E29D00214EE7 /* WKUserMediaCaptureAccessAlert.mm */,
    63986395                                C1710CF224A7BD0300D7C112 /* XPCEventHandler.h */,
    63996396                        );
     
    1297612973                                2D11B7C12126A283006F8878 /* UnifiedSource57-mm.mm in Sources */,
    1297712974                                2D11B7C22126A283006F8878 /* UnifiedSource57.cpp in Sources */,
    12978                                 4147DC692519EC3300214EE7 /* WKUserMediaCaptureAccessAlert.mm in Sources */,
    1297912975                                2D11B7C32126A283006F8878 /* UnifiedSource58-mm.mm in Sources */,
    1298012976                                2D11B7C42126A283006F8878 /* UnifiedSource58.cpp in Sources */,
  • trunk/Tools/ChangeLog

    r267567 r267568  
     12020-09-25  Youenn Fablet  <youenn@apple.com>
     2
     3        Implement default behavior for getUserMedia requests in case where there is no delegate set
     4        https://bugs.webkit.org/show_bug.cgi?id=216968
     5
     6        Reviewed by Eric Carlson.
     7
     8        Add camera and microphone entitlements to MobileMiniBrowser.
     9        Expose mediaDevices to web pages and use mock devices.
     10
     11        * MobileMiniBrowser/MobileMiniBrowser/Info.plist:
     12        * MobileMiniBrowser/MobileMiniBrowserFramework/WebViewController.m:
     13        (-[WebViewController createWebView]):
     14
    1152020-09-25  Lauro Moura  <lmoura@igalia.com>
    216
  • trunk/Tools/MobileMiniBrowser/MobileMiniBrowser/Info.plist

    r245777 r267568  
    5555                <true/>
    5656        </dict>
     57    <key>com.apple.security.device.camera</key>
     58    <true/>
     59    <key>com.apple.security.device.microphone</key>
     60    <true/>
     61    <key>NSCameraUsageDescription</key>
     62    <string>Camera usage description</string>
    5763</dict>
    5864</plist>
  • trunk/Tools/MobileMiniBrowser/MobileMiniBrowserFramework/WebViewController.m

    r247195 r267568  
    2929#import <WebKit/WKNavigation.h>
    3030#import <WebKit/WKNavigationDelegate.h>
     31#import <WebKit/WKPreferencesPrivate.h>
    3132#import <WebKit/WKWebView.h>
    3233#import <WebKit/WKWebViewConfiguration.h>
     
    176177{
    177178    WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
     179
     180    configuration.preferences._mediaDevicesEnabled = YES;
     181    configuration.preferences._mockCaptureDevicesEnabled = YES;
     182
    178183    WKWebView *webView = [[WKWebView alloc] initWithFrame:self.webViewContainer.bounds configuration:configuration];
    179184    webView.navigationDelegate = self;
Note: See TracChangeset for help on using the changeset viewer.