Changeset 231979 in webkit


Ignore:
Timestamp:
May 18, 2018 1:13:34 PM (6 years ago)
Author:
eric.carlson@apple.com
Message:

Handle failure to extend sandbox gracefully
https://bugs.webkit.org/show_bug.cgi?id=185779
<rdar://problem/40316349>

Reviewed by Brent Fulgham.

Source/WebCore:

Test: TestWebKitAPI/Tests/WebKitCocoa/UserMediaSimulateFailedSandbox.mm

  • Modules/mediastream/UserMediaRequest.cpp:

(WebCore::UserMediaRequest::deny): Include the error string in the promise rejection.

  • Modules/mediastream/UserMediaRequest.h:

Source/WebKit:

  • UIProcess/API/Cocoa/WKWebView.mm:

(-[WKWebView _denyNextUserMediaRequest]):

  • UIProcess/API/Cocoa/WKWebViewPrivate.h:
  • UIProcess/UserMediaPermissionRequestManagerProxy.cpp:

(WebKit::UserMediaPermissionRequestManagerProxy::userMediaAccessWasGranted): Don't append
the request to m_grantedRequests if it failed.
(WebKit::UserMediaPermissionRequestManagerProxy::grantAccess): Deny request if willCreateMediaStream
fails.

  • UIProcess/UserMediaPermissionRequestManagerProxy.h:
  • UIProcess/UserMediaProcessManager.cpp:

(WebKit::UserMediaProcessManager::willCreateMediaStream): Don't try to extend sandbox if
we fail to allocate all necessary handles.

  • UIProcess/UserMediaProcessManager.h:

(WebKit::UserMediaProcessManager::denyNextUserMediaRequest): New, for testing.

Tools:

  • TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
  • TestWebKitAPI/Tests/WebKitCocoa/UserMediaSimulateFailedSandbox.mm: Added.

(-[SimulateFailedSandboxMessageHandler userContentController:didReceiveScriptMessage:]):
(-[SimulateFailedSandboxUIDelegate _webView:requestUserMediaAuthorizationForDevices:url:mainFrameURL:decisionHandler:]):
(-[SimulateFailedSandboxUIDelegate _webView:checkUserMediaPermissionForURL:mainFrameURL:frameIdentifier:decisionHandler:]):
(MediaCaptureSimulateFailedSandbox::SetUp):
(MediaCaptureSimulateFailedSandbox::loadTestAndWaitForMessage):
(TEST_F):

  • TestWebKitAPI/Tests/WebKitCocoa/disableGetUserMedia.html:
Location:
trunk
Files:
1 added
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r231977 r231979  
     12018-05-18  Eric Carlson  <eric.carlson@apple.com>
     2
     3        Handle failure to extend sandbox gracefully
     4        https://bugs.webkit.org/show_bug.cgi?id=185779
     5        <rdar://problem/40316349>
     6
     7        Reviewed by Brent Fulgham.
     8
     9        Test: TestWebKitAPI/Tests/WebKitCocoa/UserMediaSimulateFailedSandbox.mm
     10
     11        * Modules/mediastream/UserMediaRequest.cpp:
     12        (WebCore::UserMediaRequest::deny): Include the error string in the promise rejection.
     13        * Modules/mediastream/UserMediaRequest.h:
     14
    1152018-05-18  Antoine Quint  <graouts@apple.com>
    216
  • trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp

    r230211 r231979  
    258258}
    259259
    260 void UserMediaRequest::deny(MediaAccessDenialReason reason, const String& invalidConstraint)
     260void UserMediaRequest::deny(MediaAccessDenialReason reason, const String& message)
    261261{
    262262    if (!m_scriptExecutionContext)
    263263        return;
    264264
     265    ExceptionCode code;
    265266    switch (reason) {
    266267    case MediaAccessDenialReason::NoConstraints:
    267268        RELEASE_LOG(MediaStream, "UserMediaRequest::deny - no constraints");
    268         m_promise.reject(TypeError);
     269        code = TypeError;
    269270        break;
    270271    case MediaAccessDenialReason::UserMediaDisabled:
    271272        RELEASE_LOG(MediaStream, "UserMediaRequest::deny - user media disabled");
    272         m_promise.reject(SecurityError);
     273        code = SecurityError;
    273274        break;
    274275    case MediaAccessDenialReason::NoCaptureDevices:
    275276        RELEASE_LOG(MediaStream, "UserMediaRequest::deny - no capture devices");
    276         m_promise.reject(NotFoundError);
     277        code = NotFoundError;
    277278        break;
    278279    case MediaAccessDenialReason::InvalidConstraint:
    279         RELEASE_LOG(MediaStream, "UserMediaRequest::deny - invalid constraint - %s", invalidConstraint.utf8().data());
    280         m_promise.rejectType<IDLInterface<OverconstrainedError>>(OverconstrainedError::create(invalidConstraint, ASCIILiteral("Invalid constraint")).get());
    281         break;
     280        RELEASE_LOG(MediaStream, "UserMediaRequest::deny - invalid constraint - %s", message.utf8().data());
     281        m_promise.rejectType<IDLInterface<OverconstrainedError>>(OverconstrainedError::create(message, ASCIILiteral("Invalid constraint")).get());
     282        return;
    282283    case MediaAccessDenialReason::HardwareError:
    283284        RELEASE_LOG(MediaStream, "UserMediaRequest::deny - hardware error");
    284         m_promise.reject(NotReadableError);
     285        code = NotReadableError;
    285286        break;
    286287    case MediaAccessDenialReason::OtherFailure:
    287288        RELEASE_LOG(MediaStream, "UserMediaRequest::deny - other failure");
    288         m_promise.reject(AbortError);
     289        code = AbortError;
    289290        break;
    290291    case MediaAccessDenialReason::PermissionDenied:
    291292        RELEASE_LOG(MediaStream, "UserMediaRequest::deny - permission denied");
    292         m_promise.reject(NotAllowedError);
     293        code = NotAllowedError;
    293294        break;
    294295    case MediaAccessDenialReason::InvalidAccess:
    295296        RELEASE_LOG(MediaStream, "UserMediaRequest::deny - invalid access");
    296         m_promise.reject(InvalidAccessError);
    297         break;
    298     }
     297        code = InvalidAccessError;
     298        break;
     299    }
     300
     301    if (!message.isEmpty())
     302        m_promise.reject(code, message);
     303    else
     304        m_promise.reject(code);
    299305}
    300306
  • trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.h

    r226211 r231979  
    5858
    5959    enum MediaAccessDenialReason { NoConstraints, UserMediaDisabled, NoCaptureDevices, InvalidConstraint, HardwareError, PermissionDenied, InvalidAccess, OtherFailure };
    60     WEBCORE_EXPORT void deny(MediaAccessDenialReason, const String& invalidConstraint = emptyString());
     60    WEBCORE_EXPORT void deny(MediaAccessDenialReason, const String& errorMessage = emptyString());
    6161
    6262    const Vector<String>& audioDeviceUIDs() const { return m_audioDeviceUIDs; }
  • trunk/Source/WebKit/ChangeLog

    r231977 r231979  
     12018-05-18  Eric Carlson  <eric.carlson@apple.com>
     2
     3        Handle failure to extend sandbox gracefully
     4        https://bugs.webkit.org/show_bug.cgi?id=185779
     5        <rdar://problem/40316349>
     6
     7        Reviewed by Brent Fulgham.
     8
     9        * UIProcess/API/Cocoa/WKWebView.mm:
     10        (-[WKWebView _denyNextUserMediaRequest]):
     11        * UIProcess/API/Cocoa/WKWebViewPrivate.h:
     12
     13        * UIProcess/UserMediaPermissionRequestManagerProxy.cpp:
     14        (WebKit::UserMediaPermissionRequestManagerProxy::userMediaAccessWasGranted): Don't append
     15        the request to m_grantedRequests if it failed.
     16        (WebKit::UserMediaPermissionRequestManagerProxy::grantAccess): Deny request if willCreateMediaStream
     17        fails.
     18        * UIProcess/UserMediaPermissionRequestManagerProxy.h:
     19
     20        * UIProcess/UserMediaProcessManager.cpp:
     21        (WebKit::UserMediaProcessManager::willCreateMediaStream): Don't try to extend sandbox if
     22        we fail to allocate all necessary handles.
     23        * UIProcess/UserMediaProcessManager.h:
     24        (WebKit::UserMediaProcessManager::denyNextUserMediaRequest): New, for testing.
     25
    1262018-05-18  Antoine Quint  <graouts@apple.com>
    227
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm

    r231785 r231979  
    4848#import "SandboxUtilities.h"
    4949#import "UIDelegate.h"
     50#import "UserMediaProcessManager.h"
    5051#import "VersionChecks.h"
    5152#import "ViewGestureController.h"
     
    63866387}
    63876388
     6389- (void)_denyNextUserMediaRequest
     6390{
     6391    WebKit::UserMediaProcessManager::singleton().denyNextUserMediaRequest();
     6392}
    63886393@end
    63896394
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h

    r231785 r231979  
    460460- (void)_executeEditCommand:(NSString *)command argument:(NSString *)argument completion:(void (^)(BOOL))completion WK_API_AVAILABLE(macosx(10.13.4), ios(11.3));
    461461
     462- (void)_denyNextUserMediaRequest WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
     463
    462464- (BOOL)_beginBackSwipeForTesting;
    463465- (BOOL)_completeBackSwipeForTesting;
  • trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp

    r229950 r231979  
    154154        return;
    155155
    156     grantAccess(userMediaID, WTFMove(audioDevice), WTFMove(videoDevice), request->deviceIdentifierHashSalt());
    157     m_grantedRequests.append(request.releaseNonNull());
     156    if (grantAccess(userMediaID, WTFMove(audioDevice), WTFMove(videoDevice), request->deviceIdentifierHashSalt()))
     157        m_grantedRequests.append(request.releaseNonNull());
     158
    158159#else
    159160    UNUSED_PARAM(userMediaID);
     
    221222}
    222223
    223 void UserMediaPermissionRequestManagerProxy::grantAccess(uint64_t userMediaID, const CaptureDevice audioDevice, const CaptureDevice videoDevice, const String& deviceIdentifierHashSalt)
    224 {
    225     UserMediaProcessManager::singleton().willCreateMediaStream(*this, !!audioDevice, !!videoDevice);
     224bool UserMediaPermissionRequestManagerProxy::grantAccess(uint64_t userMediaID, const CaptureDevice audioDevice, const CaptureDevice videoDevice, const String& deviceIdentifierHashSalt)
     225{
     226    if (!UserMediaProcessManager::singleton().willCreateMediaStream(*this, !!audioDevice, !!videoDevice)) {
     227        denyRequest(userMediaID, UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::OtherFailure, "Unable to extend sandbox.");
     228        return false;
     229    }
     230
    226231    m_page.process().send(Messages::WebPage::UserMediaAccessWasGranted(userMediaID, audioDevice, videoDevice, deviceIdentifierHashSalt), m_page.pageID());
     232    return true;
    227233}
    228234#endif
  • trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.h

    r226160 r231979  
    6969    void denyRequest(uint64_t userMediaID, UserMediaPermissionRequestProxy::UserMediaAccessDenialReason, const String& invalidConstraint);
    7070#if ENABLE(MEDIA_STREAM)
    71     void grantAccess(uint64_t userMediaID, const WebCore::CaptureDevice audioDevice, const WebCore::CaptureDevice videoDevice, const String& deviceIdentifierHashSalt);
     71    bool grantAccess(uint64_t userMediaID, const WebCore::CaptureDevice audioDevice, const WebCore::CaptureDevice videoDevice, const String& deviceIdentifierHashSalt);
    7272
    7373    const UserMediaPermissionRequestProxy* searchForGrantedRequest(uint64_t frameID, const WebCore::SecurityOrigin& userMediaDocumentOrigin, const WebCore::SecurityOrigin& topLevelDocumentOrigin, bool needsAudio, bool needsVideo) const;
  • trunk/Source/WebKit/UIProcess/UserMediaProcessManager.cpp

    r220995 r231979  
    127127}
    128128
    129 void UserMediaProcessManager::willCreateMediaStream(UserMediaPermissionRequestManagerProxy& proxy, bool withAudio, bool withVideo)
     129bool UserMediaProcessManager::willCreateMediaStream(UserMediaPermissionRequestManagerProxy& proxy, bool withAudio, bool withVideo)
    130130{
    131131#if ENABLE(SANDBOX_EXTENSIONS)
     
    134134    ASSERT(stateMap().contains(&processStartingCapture));
    135135
    136     proxy.page().activateMediaStreamCaptureInPage();
     136    if (m_denyNextRequest) {
     137        m_denyNextRequest = false;
     138        return false;
     139    }
    137140
    138141    auto& state = processState(processStartingCapture);
     
    172175        }
    173176
     177        if (ids.size() != handles.size()) {
     178            WTFLogAlways("Could not create a required sandbox extension, capture will fail!");
     179            return false;
     180        }
     181
    174182        state.setSandboxExtensionsGranted(currentExtensions);
    175183        processStartingCapture.send(Messages::WebPage::GrantUserMediaDeviceSandboxExtensions(MediaDeviceSandboxExtensions(ids, WTFMove(handles))), proxy.page().pageID());
    176184    }
    177 #endif
     185#else
     186    UNUSED_PARAM(proxy);
     187    UNUSED_PARAM(withAudio);
     188    UNUSED_PARAM(withVideo);
     189#endif
     190
     191    proxy.page().activateMediaStreamCaptureInPage();
     192
     193    return true;
    178194}
    179195
  • trunk/Source/WebKit/UIProcess/UserMediaProcessManager.h

    r217837 r231979  
    3535    void removeUserMediaPermissionRequestManagerProxy(UserMediaPermissionRequestManagerProxy&);
    3636
    37     void willCreateMediaStream(UserMediaPermissionRequestManagerProxy&, bool withAudio, bool withVideo);
     37    bool willCreateMediaStream(UserMediaPermissionRequestManagerProxy&, bool withAudio, bool withVideo);
    3838    void muteCaptureMediaStreamsExceptIn(WebPageProxy&);
    3939
     
    4444    bool captureEnabled() const { return m_captureEnabled; }
    4545
     46    void denyNextUserMediaRequest() { m_denyNextRequest = true; }
     47
    4648private:
    4749    bool m_captureEnabled { true };
     50    bool m_denyNextRequest { false };
    4851};
    4952
  • trunk/Tools/ChangeLog

    r231978 r231979  
     12018-05-18  Eric Carlson  <eric.carlson@apple.com>
     2
     3        Handle failure to extend sandbox gracefully
     4        https://bugs.webkit.org/show_bug.cgi?id=185779
     5        <rdar://problem/40316349>
     6
     7        Reviewed by Brent Fulgham.
     8
     9        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
     10        * TestWebKitAPI/Tests/WebKitCocoa/UserMediaSimulateFailedSandbox.mm: Added.
     11        (-[SimulateFailedSandboxMessageHandler userContentController:didReceiveScriptMessage:]):
     12        (-[SimulateFailedSandboxUIDelegate _webView:requestUserMediaAuthorizationForDevices:url:mainFrameURL:decisionHandler:]):
     13        (-[SimulateFailedSandboxUIDelegate _webView:checkUserMediaPermissionForURL:mainFrameURL:frameIdentifier:decisionHandler:]):
     14        (MediaCaptureSimulateFailedSandbox::SetUp):
     15        (MediaCaptureSimulateFailedSandbox::loadTestAndWaitForMessage):
     16        (TEST_F):
     17        * TestWebKitAPI/Tests/WebKitCocoa/disableGetUserMedia.html:
     18
    1192018-05-18  Daniel Bates  <dabates@apple.com>
    220
  • trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj

    r231785 r231979  
    3636                07E1F6A31FFC4B760096C7EC /* GetDisplayMedia.mm in Sources */ = {isa = PBXBuildFile; fileRef = 07E1F6A01FFC3A080096C7EC /* GetDisplayMedia.mm */; };
    3737                07E499911F9E56DF002F1EF3 /* GetUserMediaReprompt.mm in Sources */ = {isa = PBXBuildFile; fileRef = 07E499901F9E56A1002F1EF3 /* GetUserMediaReprompt.mm */; };
     38                07F4E92E20AF59E2002E3803 /* UserMediaSimulateFailedSandbox.mm in Sources */ = {isa = PBXBuildFile; fileRef = 07F4E92D20AF58D3002E3803 /* UserMediaSimulateFailedSandbox.mm */; };
    3839                0EBBCC661FFF9E0C00FA42AB /* pop-up-check.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 0EBBCC651FFF9DCE00FA42AB /* pop-up-check.html */; };
    3940                0F139E771A423A5B00F590F5 /* WeakObjCPtr.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0F139E751A423A5300F590F5 /* WeakObjCPtr.mm */; };
     
    11521153                07E499901F9E56A1002F1EF3 /* GetUserMediaReprompt.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = GetUserMediaReprompt.mm; sourceTree = "<group>"; };
    11531154                07EDEFAC1EB9400C00D43292 /* UserMediaDisabled.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UserMediaDisabled.mm; sourceTree = "<group>"; };
     1155                07F4E92D20AF58D3002E3803 /* UserMediaSimulateFailedSandbox.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UserMediaSimulateFailedSandbox.mm; sourceTree = "<group>"; };
    11541156                0BCD833414857CE400EA2003 /* HashMap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HashMap.cpp; sourceTree = "<group>"; };
    11551157                0BCD85691485C98B00EA2003 /* SetForScope.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SetForScope.cpp; sourceTree = "<group>"; };
     
    22592261                                7CCB99201D3B41F6003922F6 /* UserInitiatedActionInNavigationAction.mm */,
    22602262                                07EDEFAC1EB9400C00D43292 /* UserMediaDisabled.mm */,
     2263                                07F4E92D20AF58D3002E3803 /* UserMediaSimulateFailedSandbox.mm */,
    22612264                                93E943F11CD3E87E00AC08C2 /* VideoControlsManager.mm */,
    22622265                                6356FB211EC4E0BA0044BF18 /* VisibleContentRect.mm */,
     
    37833786                                7CCE7F171A411AE600447C4C /* UserMedia.cpp in Sources */,
    37843787                                0799C3491EBA2D7B003B7532 /* UserMediaDisabled.mm in Sources */,
     3788                                07F4E92E20AF59E2002E3803 /* UserMediaSimulateFailedSandbox.mm in Sources */,
    37853789                                7CCE7F181A411AE600447C4C /* UserMessage.cpp in Sources */,
    37863790                                7C83E03A1D0A602700FEBCF3 /* UtilitiesCocoa.mm in Sources */,
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/disableGetUserMedia.html

    r216197 r231979  
    11<script>
     2    let err = '';
    23    function gotUserMedia(mediaStream)
    34    {
     
    78    function userMediaError(error)
    89    {
     10        err = `${error.name},${error.message}`;
    911        window.webkit.messageHandlers.testHandler.postMessage('denied');
    1012    }
    1113
    12     var constraints = { audio: false, video: true};
     14    function lastError()
     15    {
     16        return err;
     17    }
     18
     19    let constraints = { audio: false, video: true};
    1320    navigator.mediaDevices.getUserMedia(constraints)
    1421        .then(gotUserMedia).
Note: See TracChangeset for help on using the changeset viewer.