Changeset 193944 in webkit


Ignore:
Timestamp:
Dec 10, 2015, 8:06:05 PM (9 years ago)
Author:
eric.carlson@apple.com
Message:

[MediaStream] Expose media capture devices persistent permissions to WebCore
https://bugs.webkit.org/show_bug.cgi?id=152087

Source/WebCore:

Reviewed by Chris Dumez.

No new tests, an existing test was updated to test the change.

  • CMakeLists.txt: Add UserMediaPermissionCheck.cpp.
  • Modules/mediastream/MediaDevicesRequest.cpp:

(WebCore::MediaDevicesRequest::~MediaDevicesRequest): Clear the permission checker client.
(WebCore::MediaDevicesRequest::contextDestroyed): Ditto.
(WebCore::MediaDevicesRequest::start): Create a permission checker and start it running.
(WebCore::MediaDevicesRequest::didCompleteCheck): Start the media source checker.
(WebCore::MediaDevicesRequest::didCompleteRequest): Only include a track's label if the

page has permission to use a capture device.

  • Modules/mediastream/MediaDevicesRequest.h:
  • Modules/mediastream/UserMediaClient.h: Include prototypes for permission checker.

(WebCore::UserMediaClient::~UserMediaClient):

  • Modules/mediastream/MediaStreamTrackSourcesRequest.cpp: Removed, not longer used.
  • Modules/mediastream/MediaStreamTrackSourcesRequest.h:
  • Modules/mediastream/UserMediaController.h:

(WebCore::UserMediaController::checkUserMediaPermission): New.
(WebCore::UserMediaController::cancelUserMediaPermissionCheck): Ditto.

  • Modules/mediastream/UserMediaPermissionCheck.cpp: Added.

(WebCore::UserMediaPermissionCheck::create):
(WebCore::UserMediaPermissionCheck::UserMediaPermissionCheck):
(WebCore::UserMediaPermissionCheck::~UserMediaPermissionCheck):
(WebCore::UserMediaPermissionCheck::securityOrigin):
(WebCore::UserMediaPermissionCheck::contextDestroyed):
(WebCore::UserMediaPermissionCheck::start):
(WebCore::UserMediaPermissionCheck::setDeviceAccessMode):

  • Modules/mediastream/UserMediaPermissionCheck.h: Added.

(WebCore::UserMediaPermissionCheckClient::~UserMediaPermissionCheckClient):
(WebCore::UserMediaPermissionCheck::setClient):

  • WebCore.xcodeproj/project.pbxproj: Add UserMediaPermissionCheck.cpp|.h
  • platform/mock/UserMediaClientMock.h: Removed, it is no longer used.
  • testing/Internals.cpp: Remove UserMediaClientMock.h include, it is gone.

Source/WebKit/mac:

Reviewed by Chris Dumez.

Add methods and helpers for WK1 permission checker interface.

  • WebCoreSupport/WebUserMediaClient.h:
  • WebCoreSupport/WebUserMediaClient.mm:

(userMediaRequestsMap):
(AddRequestToRequestMap):
(RemoveRequestFromRequestMap):
(userMediaCheckMap):
(AddPermissionCheckToMap):
(RemovePermissionCheckFromMap):
(WebUserMediaClient::WebUserMediaClient):
(WebUserMediaClient::requestUserMediaAccess):
(WebUserMediaClient::cancelUserMediaAccessRequest):
(WebUserMediaClient::checkUserMediaPermission):
(WebUserMediaClient::cancelUserMediaPermissionCheck):
(-[WebUserMediaPolicyListener allow]):
(-[WebUserMediaPolicyListener deny]):
(-[WebUserMediaPolicyCheckerListener initWithUserMediaPermissionCheck:]):
(-[WebUserMediaPolicyCheckerListener cancelUserMediaPermissionCheck]):
(-[WebUserMediaPolicyCheckerListener allow]):
(-[WebUserMediaPolicyCheckerListener deny]):
(-[WebUserMediaPolicyCheckerListener denyOnlyThisRequest]):
(-[WebUserMediaPolicyCheckerListener shouldClearCache]):
(AddRequestToMap): Deleted.
(RemoveRequestFromMap): Deleted.

  • WebView/WebUIDelegatePrivate.h:

Source/WebKit2:

Reviewed by Chris Dumez.

  • CMakeLists.txt: Add UserMediaPermissionCheckProxy.cpp and WKUserMediaPermissionCheck.cpp.
  • Shared/API/APIObject.h: Define UserMediaPermissionCheck.
  • Shared/API/c/WKBase.h: Add WKUserMediaPermissionCheckRef typedef.
  • UIProcess/API/APIUIClient.h:

(API::UIClient::checkUserMediaPermissionForOrigin): New.

  • UIProcess/API/C/WKAPICast.h: Add WKUserMediaPermissionCheckRef/UserMediaPermissionCheckProxy mapping.
  • UIProcess/API/C/WKPage.cpp:

(WKPageSetPageUIClient): Implement checkUserMediaPermissionForOrigin.

  • UIProcess/API/C/WKPageUIClient.h: Add WKCheckUserMediaPermissionCallback typedef and add checkUserMediaPermissionForOrigin to WKPageUIClientV6.
  • UIProcess/API/C/WKUserMediaPermissionCheck.cpp: Added.

(WKUserMediaPermissionCheckGetTypeID):
(WKUserMediaPermissionCheckSetHasPermission):

  • UIProcess/API/C/WKUserMediaPermissionCheck.h: Added.
  • UIProcess/UserMediaPermissionCheckProxy.cpp: Added.

(WebKit::UserMediaPermissionCheckProxy::UserMediaPermissionCheckProxy):
(WebKit::UserMediaPermissionCheckProxy::setHasPermission):
(WebKit::UserMediaPermissionCheckProxy::invalidate):

  • UIProcess/UserMediaPermissionCheckProxy.h: Added.

(WebKit::UserMediaPermissionCheckProxy::create):

  • UIProcess/UserMediaPermissionRequestManagerProxy.cpp:

(WebKit::UserMediaPermissionRequestManagerProxy::invalidateRequests):
(WebKit::UserMediaPermissionRequestManagerProxy::createRequest):
(WebKit::UserMediaPermissionRequestManagerProxy::didReceiveUserMediaPermissionDecision):
(WebKit::UserMediaPermissionRequestManagerProxy::createUserMediaPermissionCheck):
(WebKit::UserMediaPermissionRequestManagerProxy::didCompleteUserMediaPermissionCheck):

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

(WebKit::WebPageProxy::requestUserMediaPermissionForFrame):
(WebKit::WebPageProxy::checkUserMediaPermissionForFrame):
(WebKit::WebPageProxy::requestNotificationPermission):

  • UIProcess/WebPageProxy.h:
  • UIProcess/WebPageProxy.messages.in:
  • WebKit2.xcodeproj/project.pbxproj: Add UserMediaPermissionCheckProxy.*, and WKUserMediaPermissionCheck.*.
  • WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp:

(WebKit::UserMediaPermissionRequestManager::startUserMediaRequest): Renamed from startRequest.
(WebKit::UserMediaPermissionRequestManager::cancelUserMediaRequest): Renamed from cancelRequest.
(WebKit::UserMediaPermissionRequestManager::didReceiveUserMediaPermissionDecision): m_requestToIDMap ->

m_userMediaRequestToIDMap.remove.

(WebKit::UserMediaPermissionRequestManager::startUserMediaPermissionCheck): New, start the request.
(WebKit::UserMediaPermissionRequestManager::cancelUserMediaPermissionCheck): New, cancel

the request.

(WebKit::UserMediaPermissionRequestManager::didCompleteUserMediaPermissionCheck): New,

all the request completion method.

(WebKit::UserMediaPermissionRequestManager::startRequest): Deleted.
(WebKit::UserMediaPermissionRequestManager::cancelRequest): Deleted.

  • WebProcess/MediaStream/UserMediaPermissionRequestManager.h:
  • WebProcess/WebCoreSupport/WebUserMediaClient.cpp:

(WebKit::WebUserMediaClient::requestUserMediaAccess): startRequest -> startUserMediaRequest.
(WebKit::WebUserMediaClient::cancelUserMediaAccessRequest): cancelRequest -> cancelUserMediaRequest.
(WebKit::WebUserMediaClient::checkUserMediaPermission): New.
(WebKit::WebUserMediaClient::cancelUserMediaPermissionCheck): New.

  • WebProcess/WebCoreSupport/WebUserMediaClient.h:
  • WebProcess/WebPage/WebPage.cpp:

(WebKit::WebPage::didCompleteUserMediaPermissionCheck): New.

  • WebProcess/WebPage/WebPage.h:
  • WebProcess/WebPage/WebPage.messages.in: Add DidCompleteUserMediaPermissionCheck.

Tools:

Add support for the new user media permission checker page UI client method.

Reviewed by Chris Dumez.

  • WebKitTestRunner/TestController.cpp:

(WTR::decidePolicyForUserMediaPermissionRequest):
(WTR::checkUserMediaPermissionForOrigin):
(WTR::TestController::createOtherPage): Add checkUserMediaPermissionForOrigin.
(WTR::TestController::createWebViewWithOptions): Ditto.
(WTR::TestController::resetStateToConsistentValues): Clear m_userMediaOriginPermissions.
(WTR::originUserVisibleName): New, create a string for the origin.
(WTR::TestController::handleCheckOfUserMediaPermissionForOrigin): Set the WKUserMediaPermissionCheckRef

according to the state of the origin permission map.

(WTR::TestController::handleUserMediaPermissionRequest): Remember both the origin and the

request so we can update the origin permission map in decidePolicyForUserMediaPermissionRequestIfPossible.

(WTR::TestController::decidePolicyForUserMediaPermissionRequestIfPossible): Update the

origin permission map.

  • WebKitTestRunner/TestController.h:

LayoutTests:

Reviewed by Chris Dumez.

  • fast/mediastream/MediaDevices-enumerateDevices-expected.txt:
  • fast/mediastream/MediaDevices-enumerateDevices.html:
Location:
trunk
Files:
6 added
3 deleted
40 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r193939 r193944  
     12015-12-10  Eric Carlson  <eric.carlson@apple.com>
     2
     3        [MediaStream] Expose media capture devices persistent permissions to WebCore
     4        https://bugs.webkit.org/show_bug.cgi?id=152087
     5
     6        Reviewed by Chris Dumez.
     7
     8        * fast/mediastream/MediaDevices-enumerateDevices-expected.txt:
     9        * fast/mediastream/MediaDevices-enumerateDevices.html:
     10
    1112015-12-10  Daniel Bates  <dabates@apple.com>
    212
  • trunk/LayoutTests/fast/mediastream/MediaDevices-enumerateDevices-expected.txt

    r189982 r193944  
    77PASS navigator.mediaDevices.enumerateDevices is an instance of Function
    88
     9
     10*** Calling mediaDevices.enumerateDevices when persistent access HAS NOT been granted
     11
    912PASS captureDevices.length is non-zero.
    1013
     
    1215PASS captureDevice.deviceId is non-null.
    1316PASS captureDevice.label is non-null.
     17PASS captureDevice.label is ""
    1418PASS captureDevice.groupId is non-null.
    1519
     
    1721PASS captureDevice.deviceId is non-null.
    1822PASS captureDevice.label is non-null.
     23PASS captureDevice.label is ""
     24PASS captureDevice.groupId is non-null.
     25
     26
     27*** Calling mediaDevices.enumerateDevices when persistent access HAS been granted
     28
     29PASS captureDevices.length is non-zero.
     30
     31PASS captureDevice.kind is non-null.
     32PASS captureDevice.deviceId is non-null.
     33PASS captureDevice.label is non-null.
     34PASS captureDevice.label is not ""
     35PASS captureDevice.groupId is non-null.
     36
     37PASS captureDevice.kind is non-null.
     38PASS captureDevice.deviceId is non-null.
     39PASS captureDevice.label is non-null.
     40PASS captureDevice.label is not ""
    1941PASS captureDevice.groupId is non-null.
    2042
  • trunk/LayoutTests/fast/mediastream/MediaDevices-enumerateDevices.html

    r189982 r193944  
    1010            var captureDevices;
    1111            var captureDevice;
     12            var havePermission;
    1213
    1314            description("Tests MediaDevices.enumerateDevices()");
     
    1819            debug("");
    1920
    20             navigator.mediaDevices.enumerateDevices()
    21                 .then(function(devices) {
    22                     captureDevices = devices;
    23                     shouldBeNonZero("captureDevices.length");
    24                     debug("");
    25                     devices.forEach(function(device) {
    26                         captureDevice = device;
    27                         shouldBeNonNull("captureDevice.kind");
    28                         shouldBeNonNull("captureDevice.deviceId");
    29                         shouldBeNonNull("captureDevice.label");
    30                         shouldBeNonNull("captureDevice.groupId");
     21            function enumerate(next)
     22            {
     23                debug(`<br>*** Calling mediaDevices.enumerateDevices when persistent access HAS ${havePermission ? "" : "NOT "}been granted<br>`);
     24                navigator.mediaDevices.enumerateDevices()
     25                    .then(function(devices) {
     26                        captureDevices = devices;
     27                        shouldBeNonZero("captureDevices.length");
    3128                        debug("");
     29                        devices.forEach(function(device) {
     30                            captureDevice = device;
     31                            shouldBeNonNull("captureDevice.kind");
     32                            shouldBeNonNull("captureDevice.deviceId");
     33                            shouldBeNonNull("captureDevice.label");
     34                            if (havePermission)
     35                                shouldNotBeEqualToString("captureDevice.label", "");
     36                            else
     37                                shouldBeEmptyString("captureDevice.label");
     38                            shouldBeNonNull("captureDevice.groupId");
     39                            debug("");
     40                        });
     41                        if (next)
     42                            next();
     43                        else
     44                            finishJSTest();
     45                    })
     46                    .catch(function(err) {
     47                        testFailed(err.name + ": " + err.message);
    3248                    });
     49            }
     50           
     51            function grantPermission()
     52            {
     53                if (window.testRunner) {
     54                    testRunner.setUserMediaPermission(true);
     55                    navigator.mediaDevices
     56                        .getUserMedia({audio:{}, video:{}})
     57                        .then(function(stream) {
     58                            havePermission = true;
     59                            enumerate(null);                       
     60                        })
     61                        .catch(function(err) {
     62                            testFailed(`mediaDevices.getUserMedia() failed with ${err.name}: ${err.message}`);
     63                        });
     64                }
     65            }
    3366
    34                     finishJSTest();
    35                 })
    36                 .catch(function(err) {
    37                     testFailed(err.name + ": " + err.message);
    38                 });
     67            havePermission = false;
     68            enumerate(grantPermission);
    3969
    4070            window.successfullyParsed = true;
  • trunk/Source/WebCore/CMakeLists.txt

    r193426 r193944  
    953953    Modules/mediastream/MediaStreamTrack.cpp
    954954    Modules/mediastream/MediaStreamTrackEvent.cpp
    955     Modules/mediastream/MediaStreamTrackSourcesRequest.cpp
    956955    Modules/mediastream/MediaTrackConstraint.cpp
    957956    Modules/mediastream/MediaTrackConstraintSet.cpp
     
    976975    Modules/mediastream/SourceInfo.cpp
    977976    Modules/mediastream/UserMediaController.cpp
     977    Modules/mediastream/UserMediaPermissionCheck.cpp
    978978    Modules/mediastream/UserMediaRequest.cpp
    979979
  • trunk/Source/WebCore/ChangeLog

    r193942 r193944  
     12015-12-10  Eric Carlson  <eric.carlson@apple.com>
     2
     3        [MediaStream] Expose media capture devices persistent permissions to WebCore
     4        https://bugs.webkit.org/show_bug.cgi?id=152087
     5
     6        Reviewed by Chris Dumez.
     7
     8        No new tests, an existing test was updated to test the change.
     9
     10        * CMakeLists.txt: Add UserMediaPermissionCheck.cpp.
     11
     12        * Modules/mediastream/MediaDevicesRequest.cpp:
     13        (WebCore::MediaDevicesRequest::~MediaDevicesRequest): Clear the permission checker client.
     14        (WebCore::MediaDevicesRequest::contextDestroyed): Ditto.
     15        (WebCore::MediaDevicesRequest::start): Create a permission checker and start it running.
     16        (WebCore::MediaDevicesRequest::didCompleteCheck): Start the media source checker.
     17        (WebCore::MediaDevicesRequest::didCompleteRequest): Only include a track's label if the
     18          page has permission to use a capture device.
     19        * Modules/mediastream/MediaDevicesRequest.h:
     20
     21        * Modules/mediastream/UserMediaClient.h: Include prototypes for permission checker.
     22        (WebCore::UserMediaClient::~UserMediaClient):
     23       
     24        * Modules/mediastream/MediaStreamTrackSourcesRequest.cpp: Removed, not longer used.
     25        * Modules/mediastream/MediaStreamTrackSourcesRequest.h:
     26
     27        * Modules/mediastream/UserMediaController.h:
     28        (WebCore::UserMediaController::checkUserMediaPermission): New.
     29        (WebCore::UserMediaController::cancelUserMediaPermissionCheck): Ditto.
     30
     31        * Modules/mediastream/UserMediaPermissionCheck.cpp: Added.
     32        (WebCore::UserMediaPermissionCheck::create):
     33        (WebCore::UserMediaPermissionCheck::UserMediaPermissionCheck):
     34        (WebCore::UserMediaPermissionCheck::~UserMediaPermissionCheck):
     35        (WebCore::UserMediaPermissionCheck::securityOrigin):
     36        (WebCore::UserMediaPermissionCheck::contextDestroyed):
     37        (WebCore::UserMediaPermissionCheck::start):
     38        (WebCore::UserMediaPermissionCheck::setDeviceAccessMode):
     39        * Modules/mediastream/UserMediaPermissionCheck.h: Added.
     40        (WebCore::UserMediaPermissionCheckClient::~UserMediaPermissionCheckClient):
     41        (WebCore::UserMediaPermissionCheck::setClient):
     42
     43        * WebCore.xcodeproj/project.pbxproj: Add UserMediaPermissionCheck.cpp|.h
     44
     45        * platform/mock/UserMediaClientMock.h: Removed, it is no longer used.
     46
     47        * testing/Internals.cpp: Remove UserMediaClientMock.h include, it is gone.
     48
    1492015-12-10  Myles C. Maxfield  <mmaxfield@apple.com>
    250
  • trunk/Source/WebCore/Modules/mediastream/MediaDevicesRequest.cpp

    r189982 r193944  
    5353MediaDevicesRequest::~MediaDevicesRequest()
    5454{
     55    if (m_permissionCheck)
     56        m_permissionCheck->setClient(nullptr);
    5557}
    5658
     
    6668{
    6769    ContextDestructionObserver::contextDestroyed();
     70    if (m_permissionCheck) {
     71        m_permissionCheck->setClient(nullptr);
     72        m_permissionCheck = nullptr;
     73    }
    6874    m_protector = nullptr;
    6975}
     
    7278{
    7379    m_protector = this;
    74     RealtimeMediaSourceCenter::singleton().getMediaStreamTrackSources(this);
     80    m_permissionCheck = UserMediaPermissionCheck::create(*downcast<Document>(scriptExecutionContext()), *this);
     81    m_permissionCheck->start();
     82}
     83
     84void MediaDevicesRequest::didCompleteCheck(bool canAccess)
     85{
     86    m_permissionCheck->setClient(nullptr);
     87    m_permissionCheck = nullptr;
     88
     89    m_hasUserMediaPermission = canAccess;
     90
     91    callOnMainThread([this] {
     92        RealtimeMediaSourceCenter::singleton().getMediaStreamTrackSources(this);
     93    });
    7594}
    7695
    7796void MediaDevicesRequest::didCompleteRequest(const TrackSourceInfoVector& capturedDevices)
    7897{
    79     if (!m_scriptExecutionContext)
     98    if (!m_scriptExecutionContext) {
     99        m_protector = nullptr;
    80100        return;
     101    }
    81102
    82103    Vector<RefPtr<MediaDeviceInfo>> deviceInfo;
     
    85106        String deviceType = trackInfo->kind() == TrackSourceInfo::SourceKind::Audio ? MediaDeviceInfo::audioInputType() : MediaDeviceInfo::videoInputType();
    86107
    87         // FIXME: label is supposed to be empty unless a device is attached to an active MediaStreamTrack in the current browsing context, or
    88         // persistent permission to access these local devices has been granted to the page's origin.
    89         deviceInfo.append(MediaDeviceInfo::create(m_scriptExecutionContext, trackInfo->label(), trackInfo->id(), trackInfo->groupId(), deviceType));
     108        AtomicString label = m_hasUserMediaPermission ? trackInfo->label() : emptyAtom;
     109        deviceInfo.append(MediaDeviceInfo::create(m_scriptExecutionContext, label, trackInfo->id(), trackInfo->groupId(), deviceType));
    90110    }
    91111
  • trunk/Source/WebCore/Modules/mediastream/MediaDevicesRequest.h

    r189982 r193944  
    3434#include "MediaStreamCreationClient.h"
    3535#include "MediaStreamTrackSourcesRequestClient.h"
     36#include "UserMediaPermissionCheck.h"
    3637#include <wtf/PassRefPtr.h>
    3738#include <wtf/RefCounted.h>
     
    4647typedef int ExceptionCode;
    4748
    48 class MediaDevicesRequest : public MediaStreamTrackSourcesRequestClient, public ContextDestructionObserver {
     49class MediaDevicesRequest : public MediaStreamTrackSourcesRequestClient, public UserMediaPermissionCheckClient, public ContextDestructionObserver {
    4950public:
    5051    static RefPtr<MediaDevicesRequest> create(Document*, MediaDevices::EnumerateDevicesPromise&&, ExceptionCode&);
     
    6465
    6566    // ContextDestructionObserver
    66     virtual void contextDestroyed() override final;
     67    void contextDestroyed() override final;
     68
     69    // UserMediaPermissionCheckClient
     70    void didCompleteCheck(bool) override final;
    6771
    6872    MediaDevices::EnumerateDevicesPromise m_promise;
    6973    RefPtr<MediaDevicesRequest> m_protector;
     74    RefPtr<UserMediaPermissionCheck> m_permissionCheck;
     75
     76    bool m_hasUserMediaPermission { false };
    7077};
    7178
  • trunk/Source/WebCore/Modules/mediastream/UserMediaClient.h

    r193764 r193944  
    3939
    4040class Page;
     41class UserMediaPermissionCheck;
    4142class UserMediaRequest;
    4243
     
    4546    virtual void pageDestroyed() = 0;
    4647
    47     virtual void requestUserMediaAccess(Ref<UserMediaRequest>&&) = 0;
     48    virtual void requestUserMediaAccess(UserMediaRequest&) = 0;
    4849    virtual void cancelUserMediaAccessRequest(UserMediaRequest&) = 0;
     50
     51    virtual void checkUserMediaPermission(UserMediaPermissionCheck&) = 0;
     52    virtual void cancelUserMediaPermissionCheck(UserMediaPermissionCheck&) = 0;
    4953
    5054protected:
  • trunk/Source/WebCore/Modules/mediastream/UserMediaController.h

    r193764 r193944  
    3030#include "Page.h"
    3131#include "UserMediaClient.h"
     32#include "UserMediaPermissionCheck.h"
    3233#include "UserMediaRequest.h"
    3334
     
    4142    UserMediaClient* client() const { return m_client; }
    4243
    43     void requestUserMediaAccess(Ref<UserMediaRequest>&&);
     44    void requestUserMediaAccess(UserMediaRequest&);
    4445    void cancelUserMediaAccessRequest(UserMediaRequest&);
     46
     47    void checkUserMediaPermission(UserMediaPermissionCheck&);
     48    void cancelUserMediaPermissionCheck(UserMediaPermissionCheck&);
    4549
    4650    WEBCORE_EXPORT static const char* supplementName();
     
    5155};
    5256
    53 inline void UserMediaController::requestUserMediaAccess(Ref<UserMediaRequest>&& request)
     57inline void UserMediaController::requestUserMediaAccess(UserMediaRequest& request)
    5458{
    55     m_client->requestUserMediaAccess(WTF::move(request));
     59    m_client->requestUserMediaAccess(request);
    5660}
    5761
     
    6165}
    6266
     67inline void UserMediaController::checkUserMediaPermission(UserMediaPermissionCheck& request)
     68{
     69    m_client->checkUserMediaPermission(request);
     70}
     71
     72inline void UserMediaController::cancelUserMediaPermissionCheck(UserMediaPermissionCheck& request)
     73{
     74    m_client->cancelUserMediaPermissionCheck(request);
     75}
     76
    6377} // namespace WebCore
    6478
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r193937 r193944  
    131131                07277E5417D018CC0015534D /* JSMediaStreamTrackEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07277E4817D018CC0015534D /* JSMediaStreamTrackEvent.cpp */; };
    132132                07277E5517D018CC0015534D /* JSMediaStreamTrackEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = 07277E4917D018CC0015534D /* JSMediaStreamTrackEvent.h */; };
     133                07297FA71C1881C5003F0735 /* UserMediaPermissionCheck.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07297FA51C1881C5003F0735 /* UserMediaPermissionCheck.cpp */; settings = {ASSET_TAGS = (); }; };
     134                07297FA81C1881C5003F0735 /* UserMediaPermissionCheck.h in Headers */ = {isa = PBXBuildFile; fileRef = 07297FA61C1881C5003F0735 /* UserMediaPermissionCheck.h */; settings = {ATTRIBUTES = (Private, ); }; };
    133135                072AE1E5183C0741000A5988 /* PluginReplacement.h in Headers */ = {isa = PBXBuildFile; fileRef = 072AE1DF183C0741000A5988 /* PluginReplacement.h */; };
    134136                072AE1E6183C0741000A5988 /* QuickTimePluginReplacement.mm in Sources */ = {isa = PBXBuildFile; fileRef = 072AE1E0183C0741000A5988 /* QuickTimePluginReplacement.mm */; };
     
    155157                073794FE19F5864E00E5A045 /* RTCNotifiersMock.h in Headers */ = {isa = PBXBuildFile; fileRef = 073794F819F5864E00E5A045 /* RTCNotifiersMock.h */; };
    156158                07394EC81BAB2CCD00BE99CD /* MediaDevicesRequest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07394EC71BAB2CCD00BE99CD /* MediaDevicesRequest.cpp */; };
    157                 07394ECA1BAB2CD700BE99CD /* MediaDevicesRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 07394EC91BAB2CD700BE99CD /* MediaDevicesRequest.h */; };
     159                07394ECA1BAB2CD700BE99CD /* MediaDevicesRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 07394EC91BAB2CD700BE99CD /* MediaDevicesRequest.h */; settings = {ATTRIBUTES = (Private, ); }; };
    158160                073BE34017D17E01002BD431 /* JSNavigatorUserMedia.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 073BE33E17D17E01002BD431 /* JSNavigatorUserMedia.cpp */; };
    159161                073BE34117D17E01002BD431 /* JSNavigatorUserMedia.h in Headers */ = {isa = PBXBuildFile; fileRef = 073BE33F17D17E01002BD431 /* JSNavigatorUserMedia.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    168170                0753860314489E9800B78452 /* CachedTextTrack.h in Headers */ = {isa = PBXBuildFile; fileRef = 0753860114489E9800B78452 /* CachedTextTrack.h */; };
    169171                076306D017E1478D005A7C4E /* MediaStreamTrackSourcesCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = 076306CC17E1478D005A7C4E /* MediaStreamTrackSourcesCallback.h */; };
    170                 076306D217E1478D005A7C4E /* MediaStreamTrackSourcesRequest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 076306CE17E1478D005A7C4E /* MediaStreamTrackSourcesRequest.cpp */; };
    171                 076306D317E1478D005A7C4E /* MediaStreamTrackSourcesRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 076306CF17E1478D005A7C4E /* MediaStreamTrackSourcesRequest.h */; };
    172172                076306D717E149CF005A7C4E /* SourceInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 076306D417E149CF005A7C4E /* SourceInfo.cpp */; };
    173173                076306D817E149D0005A7C4E /* SourceInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 076306D517E149CF005A7C4E /* SourceInfo.h */; };
     
    11491149                2D77AC2D1BF2B9A00072470A /* NSViewSPI.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D77AC2C1BF2B9A00072470A /* NSViewSPI.h */; settings = {ATTRIBUTES = (Private, ); }; };
    11501150                2D7ED0AB1BAE99170043B3E5 /* TimerEventBasedMock.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D7ED0A91BAE99170043B3E5 /* TimerEventBasedMock.h */; };
    1151                 2D7ED0AC1BAE99170043B3E5 /* UserMediaClientMock.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D7ED0AA1BAE99170043B3E5 /* UserMediaClientMock.h */; };
    11521151                2D8287F616E4A0380086BD00 /* HitTestLocation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2D8287F416E4A0380086BD00 /* HitTestLocation.cpp */; };
    11531152                2D8287F716E4A0380086BD00 /* HitTestLocation.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D8287F516E4A0380086BD00 /* HitTestLocation.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    74397438                07277E4917D018CC0015534D /* JSMediaStreamTrackEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSMediaStreamTrackEvent.h; sourceTree = "<group>"; };
    74407439                072847E216EBC5B00043CFA4 /* PlatformTextTrack.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PlatformTextTrack.h; sourceTree = "<group>"; };
     7440                07297FA51C1881C5003F0735 /* UserMediaPermissionCheck.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UserMediaPermissionCheck.cpp; sourceTree = "<group>"; };
     7441                07297FA61C1881C5003F0735 /* UserMediaPermissionCheck.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UserMediaPermissionCheck.h; sourceTree = "<group>"; };
    74417442                072AE1DF183C0741000A5988 /* PluginReplacement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PluginReplacement.h; sourceTree = "<group>"; };
    74427443                072AE1E0183C0741000A5988 /* QuickTimePluginReplacement.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = QuickTimePluginReplacement.mm; sourceTree = "<group>"; };
     
    74787479                076306CC17E1478D005A7C4E /* MediaStreamTrackSourcesCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaStreamTrackSourcesCallback.h; sourceTree = "<group>"; };
    74797480                076306CD17E1478D005A7C4E /* MediaStreamTrackSourcesCallback.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = MediaStreamTrackSourcesCallback.idl; sourceTree = "<group>"; };
    7480                 076306CE17E1478D005A7C4E /* MediaStreamTrackSourcesRequest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaStreamTrackSourcesRequest.cpp; sourceTree = "<group>"; };
    7481                 076306CF17E1478D005A7C4E /* MediaStreamTrackSourcesRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaStreamTrackSourcesRequest.h; sourceTree = "<group>"; };
    74827481                076306D417E149CF005A7C4E /* SourceInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SourceInfo.cpp; sourceTree = "<group>"; };
    74837482                076306D517E149CF005A7C4E /* SourceInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SourceInfo.h; sourceTree = "<group>"; };
     
    85008499                2D77AC2C1BF2B9A00072470A /* NSViewSPI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSViewSPI.h; sourceTree = "<group>"; };
    85018500                2D7ED0A91BAE99170043B3E5 /* TimerEventBasedMock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TimerEventBasedMock.h; sourceTree = "<group>"; };
    8502                 2D7ED0AA1BAE99170043B3E5 /* UserMediaClientMock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UserMediaClientMock.h; sourceTree = "<group>"; };
    85038501                2D8287F416E4A0380086BD00 /* HitTestLocation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HitTestLocation.cpp; sourceTree = "<group>"; };
    85048502                2D8287F516E4A0380086BD00 /* HitTestLocation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HitTestLocation.h; sourceTree = "<group>"; };
     
    1512715125                                076306CC17E1478D005A7C4E /* MediaStreamTrackSourcesCallback.h */,
    1512815126                                076306CD17E1478D005A7C4E /* MediaStreamTrackSourcesCallback.idl */,
    15129                                 076306CE17E1478D005A7C4E /* MediaStreamTrackSourcesRequest.cpp */,
    15130                                 076306CF17E1478D005A7C4E /* MediaStreamTrackSourcesRequest.h */,
    1513115127                                0705853917FE0770005F2BCB /* MediaTrackConstraint.cpp */,
    1513215128                                0705851D17FDC140005F2BCB /* MediaTrackConstraint.h */,
     
    1520515201                                07221B8E17CEC32700848E51 /* UserMediaController.cpp */,
    1520615202                                07221B8F17CEC32700848E51 /* UserMediaController.h */,
     15203                                07297FA51C1881C5003F0735 /* UserMediaPermissionCheck.cpp */,
     15204                                07297FA61C1881C5003F0735 /* UserMediaPermissionCheck.h */,
    1520715205                                07221B9017CEC32700848E51 /* UserMediaRequest.cpp */,
    1520815206                                07221B9117CEC32700848E51 /* UserMediaRequest.h */,
     
    1715217150                                0FE71404142170B800DB33BA /* ScrollbarThemeMock.h */,
    1715317151                                2D7ED0A91BAE99170043B3E5 /* TimerEventBasedMock.h */,
    17154                                 2D7ED0AA1BAE99170043B3E5 /* UserMediaClientMock.h */,
    1715517152                        );
    1715617153                        path = mock;
     
    2619626193                                159741DB1B7D140100201C92 /* JSMediaDeviceInfo.h in Headers */,
    2619726194                                15739BBB1B42012D00D258C1 /* JSMediaDevices.h in Headers */,
     26195                                07297FA81C1881C5003F0735 /* UserMediaPermissionCheck.h in Headers */,
    2619826196                                FD23A12613F5FA5900F67001 /* JSMediaElementAudioSourceNode.h in Headers */,
    2619926197                                E44614190CD6826900FADA75 /* JSMediaError.h in Headers */,
     
    2670526703                                07FFDE69181AED420072D409 /* MediaStreamTrackPrivate.h in Headers */,
    2670626704                                076306D017E1478D005A7C4E /* MediaStreamTrackSourcesCallback.h in Headers */,
    26707                                 076306D317E1478D005A7C4E /* MediaStreamTrackSourcesRequest.h in Headers */,
    2670826705                                076306E317E22A43005A7C4E /* MediaStreamTrackSourcesRequestClient.h in Headers */,
    2670926706                                CD641EC01819B36000EE4C41 /* MediaTimeAVFoundation.h in Headers */,
     
    2789427891                                9920398318B95BC600B39AF9 /* UserInputBridge.h in Headers */,
    2789527892                                078E092E17D14D1C00420AA1 /* UserMediaClient.h in Headers */,
    27896                                 2D7ED0AC1BAE99170043B3E5 /* UserMediaClientMock.h in Headers */,
    2789727893                                078E092F17D14D1C00420AA1 /* UserMediaController.h in Headers */,
    2789827894                                078E093017D14D1C00420AA1 /* UserMediaRequest.h in Headers */,
     
    2968829684                                4ACBC0CA12713D0A0094F9B2 /* JSDOMSettableTokenList.cpp in Sources */,
    2968929685                                C5137CF211A58378004ADB99 /* JSDOMStringList.cpp in Sources */,
     29686                                07297FA71C1881C5003F0735 /* UserMediaPermissionCheck.cpp in Sources */,
    2969029687                                9A1B6F97158869C80011A8C4 /* JSDOMStringListCustom.cpp in Sources */,
    2969129688                                BC64649711D82349006455B0 /* JSDOMStringMap.cpp in Sources */,
     
    3040030397                                078E090317D14CEE00420AA1 /* MediaStreamTrackEvent.cpp in Sources */,
    3040130398                                07FFDE68181AED420072D409 /* MediaStreamTrackPrivate.cpp in Sources */,
    30402                                 076306D217E1478D005A7C4E /* MediaStreamTrackSourcesRequest.cpp in Sources */,
    3040330399                                CD641EBF1819B36000EE4C41 /* MediaTimeAVFoundation.cpp in Sources */,
    3040430400                                CD60C0C6193E87C7003C656B /* MediaTimeQTKit.mm in Sources */,
  • trunk/Source/WebCore/testing/Internals.cpp

    r193286 r193944  
    172172#include "RTCPeerConnection.h"
    173173#include "RTCPeerConnectionHandlerMock.h"
    174 #include "UserMediaClientMock.h"
    175174#endif
    176175
  • trunk/Source/WebKit/mac/ChangeLog

    r193778 r193944  
     12015-12-10  Eric Carlson  <eric.carlson@apple.com>
     2
     3        [MediaStream] Expose media capture devices persistent permissions to WebCore
     4        https://bugs.webkit.org/show_bug.cgi?id=152087
     5
     6        Reviewed by Chris Dumez.
     7
     8        Add methods and helpers for WK1 permission checker interface.
     9        * WebCoreSupport/WebUserMediaClient.h:
     10        * WebCoreSupport/WebUserMediaClient.mm:
     11        (userMediaRequestsMap):
     12        (AddRequestToRequestMap):
     13        (RemoveRequestFromRequestMap):
     14        (userMediaCheckMap):
     15        (AddPermissionCheckToMap):
     16        (RemovePermissionCheckFromMap):
     17        (WebUserMediaClient::WebUserMediaClient):
     18        (WebUserMediaClient::requestUserMediaAccess):
     19        (WebUserMediaClient::cancelUserMediaAccessRequest):
     20        (WebUserMediaClient::checkUserMediaPermission):
     21        (WebUserMediaClient::cancelUserMediaPermissionCheck):
     22        (-[WebUserMediaPolicyListener allow]):
     23        (-[WebUserMediaPolicyListener deny]):
     24        (-[WebUserMediaPolicyCheckerListener initWithUserMediaPermissionCheck:]):
     25        (-[WebUserMediaPolicyCheckerListener cancelUserMediaPermissionCheck]):
     26        (-[WebUserMediaPolicyCheckerListener allow]):
     27        (-[WebUserMediaPolicyCheckerListener deny]):
     28        (-[WebUserMediaPolicyCheckerListener denyOnlyThisRequest]):
     29        (-[WebUserMediaPolicyCheckerListener shouldClearCache]):
     30        (AddRequestToMap): Deleted.
     31        (RemoveRequestFromMap): Deleted.
     32        * WebView/WebUIDelegatePrivate.h:
     33
    1342015-12-08  Beth Dakin  <bdakin@apple.com>
    235
  • trunk/Source/WebKit/mac/WebCoreSupport/WebUserMediaClient.h

    r193764 r193944  
    3434namespace WebCore {
    3535class UserMediaClient;
     36class UserMediaPermissionCheck;
    3637class UserMediaRequest;
    3738}
     
    4546
    4647    // UserMediaClient
    47     virtual void requestUserMediaAccess(Ref<WebCore::UserMediaRequest>&&) override;
    48     virtual void cancelUserMediaAccessRequest(WebCore::UserMediaRequest&) override;
    49     virtual void pageDestroyed() override;
     48    void requestUserMediaAccess(WebCore::UserMediaRequest&) override;
     49    void cancelUserMediaAccessRequest(WebCore::UserMediaRequest&) override;
     50
     51    void checkUserMediaPermission(WebCore::UserMediaPermissionCheck&) override;
     52    void cancelUserMediaPermissionCheck(WebCore::UserMediaPermissionCheck&) override;
     53
     54    void pageDestroyed() override;
    5055
    5156private:
  • trunk/Source/WebKit/mac/WebCoreSupport/WebUserMediaClient.mm

    r193764 r193944  
    3535#import <WebCore/Page.h>
    3636#import <WebCore/ScriptExecutionContext.h>
     37#import <WebCore/UserMediaPermissionCheck.h>
    3738#import <WebCore/UserMediaRequest.h>
    3839#import <wtf/HashMap.h>
     40#import <wtf/NeverDestroyed.h>
    3941#import <wtf/RefPtr.h>
    4042#import <wtf/RetainPtr.h>
     
    5153@end
    5254
     55@interface WebUserMediaPolicyCheckerListener : NSObject <WebAllowDenyPolicyListener> {
     56    RefPtr<UserMediaPermissionCheck> _request;
     57}
     58- (id)initWithUserMediaPermissionCheck:(PassRefPtr<UserMediaPermissionCheck>)request;
     59- (void)cancelUserMediaPermissionCheck;
     60- (void)deny;
     61@end
     62
    5363typedef HashMap<RefPtr<UserMediaRequest>, RetainPtr<WebUserMediaPolicyListener>> UserMediaRequestsMap;
    5464
    5565static UserMediaRequestsMap& userMediaRequestsMap()
    5666{
    57     DEPRECATED_DEFINE_STATIC_LOCAL(UserMediaRequestsMap, requests, ());
     67    static NeverDestroyed<UserMediaRequestsMap> requests;
    5868    return requests;
    5969}
    6070
    61 static void AddRequestToMap(UserMediaRequest* request, RetainPtr<WebUserMediaPolicyListener> listener)
     71static void AddRequestToRequestMap(UserMediaRequest* request, RetainPtr<WebUserMediaPolicyListener> listener)
    6272{
    6373    userMediaRequestsMap().set(request, listener);
    6474}
    6575
    66 static void RemoveRequestFromMap(UserMediaRequest* request)
     76static void RemoveRequestFromRequestMap(UserMediaRequest* request)
    6777{
    6878    userMediaRequestsMap().remove(request);
    6979}
     80
     81typedef HashMap<RefPtr<UserMediaPermissionCheck>, RetainPtr<WebUserMediaPolicyCheckerListener>> UserMediaCheckMap;
     82
     83static UserMediaCheckMap& userMediaCheckMap()
     84{
     85    DEPRECATED_DEFINE_STATIC_LOCAL(UserMediaCheckMap, requests, ());
     86    return requests;
     87}
     88
     89static void AddPermissionCheckToMap(UserMediaPermissionCheck* request, RetainPtr<WebUserMediaPolicyCheckerListener> listener)
     90{
     91    userMediaCheckMap().set(request, listener);
     92}
     93
     94static void RemovePermissionCheckFromMap(UserMediaPermissionCheck* request)
     95{
     96    userMediaCheckMap().remove(request);
     97}
     98
    7099
    71100WebUserMediaClient::WebUserMediaClient(WebView* webView)
     
    89118}
    90119
    91 void WebUserMediaClient::requestUserMediaAccess(Ref<UserMediaRequest>&& prpRequest)
     120void WebUserMediaClient::requestUserMediaAccess(UserMediaRequest& request)
    92121{
    93122    BEGIN_BLOCK_OBJC_EXCEPTIONS;
    94123
    95     UserMediaRequest* request = &prpRequest.get();
    96124    SEL selector = @selector(webView:decidePolicyForUserMediaRequestFromOrigin:listener:);
    97125    if (![[m_webView UIDelegate] respondsToSelector:selector]) {
    98         request->userMediaAccessDenied();
     126        request.userMediaAccessDenied();
    99127        return;
    100128    }
    101129
    102     WebUserMediaPolicyListener *listener = [[WebUserMediaPolicyListener alloc] initWithUserMediaRequest:request];
    103     WebSecurityOrigin *webOrigin = [[WebSecurityOrigin alloc] _initWithWebCoreSecurityOrigin:request->securityOrigin()];
     130    WebUserMediaPolicyListener *listener = [[WebUserMediaPolicyListener alloc] initWithUserMediaRequest:&request];
     131    WebSecurityOrigin *webOrigin = [[WebSecurityOrigin alloc] _initWithWebCoreSecurityOrigin:request.securityOrigin()];
    104132
    105133    CallUIDelegate(m_webView, selector, webOrigin, listener);
    106     AddRequestToMap(request, listener);
     134    AddRequestToRequestMap(&request, listener);
    107135
    108136    [webOrigin release];
     
    123151}
    124152
     153void WebUserMediaClient::checkUserMediaPermission(UserMediaPermissionCheck& request)
     154{
     155    BEGIN_BLOCK_OBJC_EXCEPTIONS;
     156
     157    SEL selector = @selector(webView:checkPolicyForUserMediaRequestFromOrigin:listener:);
     158    if (![[m_webView UIDelegate] respondsToSelector:selector]) {
     159        request.setHasPersistentPermission(false);
     160        return;
     161    }
     162
     163    WebUserMediaPolicyCheckerListener *listener = [[WebUserMediaPolicyCheckerListener alloc] initWithUserMediaPermissionCheck:&request];
     164    WebSecurityOrigin *webOrigin = [[WebSecurityOrigin alloc] _initWithWebCoreSecurityOrigin:request.securityOrigin()];
     165
     166    CallUIDelegate(m_webView, selector, webOrigin, listener);
     167    AddPermissionCheckToMap(&request, listener);
     168
     169    [webOrigin release];
     170    [listener release];
     171
     172    END_BLOCK_OBJC_EXCEPTIONS;
     173}
     174
     175
     176void WebUserMediaClient::cancelUserMediaPermissionCheck(WebCore::UserMediaPermissionCheck& request)
     177{
     178    UserMediaCheckMap& requestsMap = userMediaCheckMap();
     179    UserMediaCheckMap::iterator it = requestsMap.find(&request);
     180    if (it == requestsMap.end())
     181        return;
     182
     183    [it->value cancelUserMediaPermissionCheck];
     184    requestsMap.remove(it);
     185}
    125186
    126187@implementation WebUserMediaPolicyListener
     
    156217    _request->userMediaAccessGranted(_request->allowedAudioDeviceUID(), _request->allowedVideoDeviceUID());
    157218
    158     RemoveRequestFromMap(_request.get());
     219    RemoveRequestFromRequestMap(_request.get());
    159220#endif
    160221}
     
    167228   
    168229    _request->userMediaAccessDenied();
    169     RemoveRequestFromMap(_request.get());
     230    RemoveRequestFromRequestMap(_request.get());
    170231#endif
    171232}
     
    185246
    186247@end
    187 #endif
     248
     249
     250@implementation WebUserMediaPolicyCheckerListener
     251
     252- (id)initWithUserMediaPermissionCheck:(PassRefPtr<UserMediaPermissionCheck>)request
     253{
     254#if ENABLE(MEDIA_STREAM)
     255    if (!(self = [super init]))
     256        return nil;
     257
     258    _request = request;
     259    return self;
     260#endif
     261}
     262
     263- (void)cancelUserMediaPermissionCheck
     264{
     265#if ENABLE(MEDIA_STREAM)
     266    if (!_request)
     267        return;
     268
     269    _request = nullptr;
     270#endif
     271
     272}
     273
     274- (void)allow
     275{
     276#if ENABLE(MEDIA_STREAM)
     277    if (!_request)
     278        return;
     279
     280    _request->setHasPersistentPermission(true);
     281    RemovePermissionCheckFromMap(_request.get());
     282#endif
     283}
     284
     285- (void)deny
     286{
     287#if ENABLE(MEDIA_STREAM)
     288    if (!_request)
     289        return;
     290
     291    _request->setHasPersistentPermission(true);
     292    RemovePermissionCheckFromMap(_request.get());
     293#endif
     294}
     295
     296#if PLATFORM(IOS)
     297- (void)denyOnlyThisRequest
     298{
     299}
     300
     301- (BOOL)shouldClearCache
     302{
     303    // FIXME: https://bugs.webkit.org/show_bug.cgi?id=146245
     304    ASSERT_NOT_REACHED();
     305    return true;
     306}
     307#endif
     308
     309@end
     310
     311#endif // ENABLE(MEDIA_STREAM)
  • trunk/Source/WebKit/mac/WebView/WebUIDelegatePrivate.h

    r192393 r193944  
    259259
    260260- (void)webView:(WebView *)webView decidePolicyForUserMediaRequestFromOrigin:(WebSecurityOrigin *)origin listener:(id<WebAllowDenyPolicyListener>)listener;
     261- (void)webView:(WebView *)webView checkPolicyForUserMediaRequestFromOrigin:(WebSecurityOrigin *)origin listener:(id<WebAllowDenyPolicyListener>)listener;
    261262
    262263- (void)webView:(WebView *)sender elementDidFocusNode:(DOMNode *)node;
  • trunk/Source/WebKit2/CMakeLists.txt

    r193468 r193944  
    348348    UIProcess/StatisticsRequest.cpp
    349349    UIProcess/TextCheckerCompletion.cpp
     350    UIProcess/UserMediaPermissionCheckProxy.cpp
    350351    UIProcess/UserMediaPermissionRequestManagerProxy.cpp
    351352    UIProcess/UserMediaPermissionRequestProxy.cpp
     
    455456    UIProcess/API/C/WKTextChecker.cpp
    456457    UIProcess/API/C/WKUserContentControllerRef.cpp
     458    UIProcess/API/C/WKUserMediaPermissionCheck.cpp
    457459    UIProcess/API/C/WKUserMediaPermissionRequest.cpp
    458460    UIProcess/API/C/WKVibration.cpp
  • trunk/Source/WebKit2/ChangeLog

    r193937 r193944  
     12015-12-10  Eric Carlson  <eric.carlson@apple.com>
     2
     3        [MediaStream] Expose media capture devices persistent permissions to WebCore
     4        https://bugs.webkit.org/show_bug.cgi?id=152087
     5
     6        Reviewed by Chris Dumez.
     7
     8        * CMakeLists.txt: Add UserMediaPermissionCheckProxy.cpp and WKUserMediaPermissionCheck.cpp.
     9
     10        * Shared/API/APIObject.h: Define UserMediaPermissionCheck.
     11
     12        * Shared/API/c/WKBase.h: Add WKUserMediaPermissionCheckRef typedef.
     13
     14        * UIProcess/API/APIUIClient.h:
     15        (API::UIClient::checkUserMediaPermissionForOrigin): New.
     16
     17        * UIProcess/API/C/WKAPICast.h: Add WKUserMediaPermissionCheckRef/UserMediaPermissionCheckProxy mapping.
     18
     19        * UIProcess/API/C/WKPage.cpp:
     20        (WKPageSetPageUIClient): Implement checkUserMediaPermissionForOrigin.
     21
     22        * UIProcess/API/C/WKPageUIClient.h: Add WKCheckUserMediaPermissionCallback typedef and add
     23          checkUserMediaPermissionForOrigin to WKPageUIClientV6.
     24
     25        * UIProcess/API/C/WKUserMediaPermissionCheck.cpp: Added.
     26        (WKUserMediaPermissionCheckGetTypeID):
     27        (WKUserMediaPermissionCheckSetHasPermission):
     28
     29        * UIProcess/API/C/WKUserMediaPermissionCheck.h: Added.
     30
     31        * UIProcess/UserMediaPermissionCheckProxy.cpp: Added.
     32        (WebKit::UserMediaPermissionCheckProxy::UserMediaPermissionCheckProxy):
     33        (WebKit::UserMediaPermissionCheckProxy::setHasPermission):
     34        (WebKit::UserMediaPermissionCheckProxy::invalidate):
     35        * UIProcess/UserMediaPermissionCheckProxy.h: Added.
     36        (WebKit::UserMediaPermissionCheckProxy::create):
     37        * UIProcess/UserMediaPermissionRequestManagerProxy.cpp:
     38        (WebKit::UserMediaPermissionRequestManagerProxy::invalidateRequests):
     39        (WebKit::UserMediaPermissionRequestManagerProxy::createRequest):
     40        (WebKit::UserMediaPermissionRequestManagerProxy::didReceiveUserMediaPermissionDecision):
     41        (WebKit::UserMediaPermissionRequestManagerProxy::createUserMediaPermissionCheck):
     42        (WebKit::UserMediaPermissionRequestManagerProxy::didCompleteUserMediaPermissionCheck):
     43        * UIProcess/UserMediaPermissionRequestManagerProxy.h:
     44        * UIProcess/WebPageProxy.cpp:
     45        (WebKit::WebPageProxy::requestUserMediaPermissionForFrame):
     46        (WebKit::WebPageProxy::checkUserMediaPermissionForFrame):
     47        (WebKit::WebPageProxy::requestNotificationPermission):
     48        * UIProcess/WebPageProxy.h:
     49        * UIProcess/WebPageProxy.messages.in:
     50
     51        * WebKit2.xcodeproj/project.pbxproj: Add UserMediaPermissionCheckProxy.*, and WKUserMediaPermissionCheck.*.
     52
     53        * WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp:
     54        (WebKit::UserMediaPermissionRequestManager::startUserMediaRequest): Renamed from startRequest.
     55        (WebKit::UserMediaPermissionRequestManager::cancelUserMediaRequest): Renamed from cancelRequest.
     56        (WebKit::UserMediaPermissionRequestManager::didReceiveUserMediaPermissionDecision): m_requestToIDMap ->
     57          m_userMediaRequestToIDMap.remove.
     58        (WebKit::UserMediaPermissionRequestManager::startUserMediaPermissionCheck): New, start the request.
     59        (WebKit::UserMediaPermissionRequestManager::cancelUserMediaPermissionCheck): New, cancel
     60          the request.
     61        (WebKit::UserMediaPermissionRequestManager::didCompleteUserMediaPermissionCheck): New,
     62          all the request completion method.
     63        (WebKit::UserMediaPermissionRequestManager::startRequest): Deleted.
     64        (WebKit::UserMediaPermissionRequestManager::cancelRequest): Deleted.
     65        * WebProcess/MediaStream/UserMediaPermissionRequestManager.h:
     66
     67        * WebProcess/WebCoreSupport/WebUserMediaClient.cpp:
     68        (WebKit::WebUserMediaClient::requestUserMediaAccess): startRequest -> startUserMediaRequest.
     69        (WebKit::WebUserMediaClient::cancelUserMediaAccessRequest): cancelRequest -> cancelUserMediaRequest.
     70        (WebKit::WebUserMediaClient::checkUserMediaPermission): New.
     71        (WebKit::WebUserMediaClient::cancelUserMediaPermissionCheck): New.
     72        * WebProcess/WebCoreSupport/WebUserMediaClient.h:
     73
     74        * WebProcess/WebPage/WebPage.cpp:
     75        (WebKit::WebPage::didCompleteUserMediaPermissionCheck): New.
     76        * WebProcess/WebPage/WebPage.h:
     77        * WebProcess/WebPage/WebPage.messages.in: Add DidCompleteUserMediaPermissionCheck.
     78
    1792015-12-10  Joseph Pecoraro  <pecoraro@apple.com>
    280
  • trunk/Source/WebKit2/Shared/API/APIObject.h

    r192911 r193944  
    147147        UserContentExtension,
    148148        UserContentExtensionStore,
     149        UserMediaPermissionCheck,
    149150        UserMediaPermissionRequest,
    150151        Vibration,
  • trunk/Source/WebKit2/Shared/API/c/WKBase.h

    r192931 r193944  
    140140typedef const struct OpaqueWKUserContentExtensionStore* WKUserContentExtensionStoreRef;
    141141typedef const struct OpaqueWKUserContentFilter* WKUserContentFilterRef;
     142typedef const struct OpaqueWKUserMediaPermissionCheck* WKUserMediaPermissionCheckRef;
    142143typedef const struct OpaqueWKUserMediaPermissionRequest* WKUserMediaPermissionRequestRef;
    143144typedef const struct OpaqueWKUserScript* WKUserScriptRef;
  • trunk/Source/WebKit2/UIProcess/API/APIUIClient.h

    r191323 r193944  
    5151class NativeWebWheelEvent;
    5252class NotificationPermissionRequest;
     53class UserMediaPermissionCheckProxy;
    5354class UserMediaPermissionRequestProxy;
    5455class WebColorPickerResultListenerProxy;
     
    132133    virtual bool decidePolicyForGeolocationPermissionRequest(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, SecurityOrigin*, WebKit::GeolocationPermissionRequestProxy*) { return false; }
    133134    virtual bool decidePolicyForUserMediaPermissionRequest(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, SecurityOrigin&, WebKit::UserMediaPermissionRequestProxy&) { return false; }
     135    virtual bool checkUserMediaPermissionForOrigin(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, SecurityOrigin&, WebKit::UserMediaPermissionCheckProxy&) { return false; }
    134136    virtual bool decidePolicyForNotificationPermissionRequest(WebKit::WebPageProxy*, SecurityOrigin*, WebKit::NotificationPermissionRequest*) { return false; }
    135137
  • trunk/Source/WebKit2/UIProcess/API/C/WKAPICast.h

    r192808 r193944  
    7575class GeolocationPermissionRequestProxy;
    7676class NotificationPermissionRequest;
     77class UserMediaPermissionCheckProxy;
    7778class UserMediaPermissionRequestProxy;
    7879class WebBackForwardList;
     
    162163WK_ADD_API_MAPPING(WKUserContentExtensionStoreRef, API::UserContentExtensionStore)
    163164WK_ADD_API_MAPPING(WKUserContentFilterRef, API::UserContentExtension)
     165WK_ADD_API_MAPPING(WKUserMediaPermissionCheckRef, UserMediaPermissionCheckProxy)
    164166WK_ADD_API_MAPPING(WKUserMediaPermissionRequestRef, UserMediaPermissionRequestProxy)
    165167WK_ADD_API_MAPPING(WKUserScriptRef, API::UserScript)
  • trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp

    r193380 r193944  
    20182018        }
    20192019
     2020        virtual bool checkUserMediaPermissionForOrigin(WebPageProxy& page, WebFrameProxy& frame, API::SecurityOrigin& origin, UserMediaPermissionCheckProxy& request) override
     2021        {
     2022            if (!m_client.checkUserMediaPermissionForOrigin)
     2023                return false;
     2024
     2025            m_client.checkUserMediaPermissionForOrigin(toAPI(&page), toAPI(&frame), toAPI(&origin), toAPI(&request), m_client.base.clientInfo);
     2026            return true;
     2027        }
     2028       
    20202029        virtual bool decidePolicyForNotificationPermissionRequest(WebPageProxy* page, API::SecurityOrigin* origin, NotificationPermissionRequest* permissionRequest) override
    20212030        {
  • trunk/Source/WebKit2/UIProcess/API/C/WKPageUIClient.h

    r192911 r193944  
    9898typedef void (*WKPageIsPlayingAudioDidChangeCallback)(WKPageRef page, const void* clientInfo);
    9999typedef void (*WKPageDecidePolicyForUserMediaPermissionRequestCallback)(WKPageRef page, WKFrameRef frame, WKSecurityOriginRef origin, WKUserMediaPermissionRequestRef permissionRequest, const void* clientInfo);
     100typedef void (*WKCheckUserMediaPermissionCallback)(WKPageRef page, WKFrameRef frame, WKSecurityOriginRef origin, WKUserMediaPermissionCheckRef devicesRequest, const void *clientInfo);
    100101typedef void (*WKPageDidClickAutoFillButtonCallback)(WKPageRef page, WKTypeRef userData, const void *clientInfo);
    101102typedef void (*WKPageMediaSessionMetadataDidChangeCallback)(WKPageRef page, WKMediaSessionMetadataRef metadata, const void* clientInfo);
     
    546547    WKPageRunJavaScriptConfirmCallback                                  runJavaScriptConfirm;
    547548    WKPageRunJavaScriptPromptCallback                                   runJavaScriptPrompt;
     549    WKCheckUserMediaPermissionCallback                                  checkUserMediaPermissionForOrigin;
    548550} WKPageUIClientV6;
    549551
  • trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestManagerProxy.cpp

    r190262 r193944  
    3333void UserMediaPermissionRequestManagerProxy::invalidateRequests()
    3434{
    35     for (auto& request : m_pendingRequests.values())
     35    for (auto& request : m_pendingUserMediaRequests.values())
    3636        request->invalidate();
    3737
    38     m_pendingRequests.clear();
     38    m_pendingUserMediaRequests.clear();
    3939}
    4040
    41 PassRefPtr<UserMediaPermissionRequestProxy> UserMediaPermissionRequestManagerProxy::createRequest(uint64_t userMediaID, const Vector<String>& audioDeviceUIDs, const Vector<String>& videoDeviceUIDs)
     41Ref<UserMediaPermissionRequestProxy> UserMediaPermissionRequestManagerProxy::createRequest(uint64_t userMediaID, const Vector<String>& audioDeviceUIDs, const Vector<String>& videoDeviceUIDs)
    4242{
    43     RefPtr<UserMediaPermissionRequestProxy> request = UserMediaPermissionRequestProxy::create(*this, userMediaID, audioDeviceUIDs, videoDeviceUIDs);
    44     m_pendingRequests.add(userMediaID, request.get());
    45     return request.release();
     43    Ref<UserMediaPermissionRequestProxy> request = UserMediaPermissionRequestProxy::create(*this, userMediaID, audioDeviceUIDs, videoDeviceUIDs);
     44    m_pendingUserMediaRequests.add(userMediaID, request.ptr());
     45    return request;
    4646}
    4747
     
    5151        return;
    5252
    53     if (!m_pendingRequests.take(userMediaID))
     53    if (!m_pendingUserMediaRequests.take(userMediaID))
    5454        return;
    5555
     
    6161}
    6262
     63Ref<UserMediaPermissionCheckProxy> UserMediaPermissionRequestManagerProxy::createUserMediaPermissionCheck(uint64_t userMediaID)
     64{
     65    Ref<UserMediaPermissionCheckProxy> request = UserMediaPermissionCheckProxy::create(*this, userMediaID);
     66    m_pendingDeviceRequests.add(userMediaID, request.ptr());
     67    return request;
     68}
     69
     70void UserMediaPermissionRequestManagerProxy::didCompleteUserMediaPermissionCheck(uint64_t userMediaID, bool allowed)
     71{
     72    if (!m_page.isValid())
     73        return;
     74
     75    if (!m_pendingDeviceRequests.take(userMediaID))
     76        return;
     77
     78#if ENABLE(MEDIA_STREAM)
     79    m_page.process().send(Messages::WebPage::DidCompleteUserMediaPermissionCheck(userMediaID, allowed), m_page.pageID());
     80#else
     81    UNUSED_PARAM(allowed);
     82#endif
     83}
     84
    6385} // namespace WebKit
  • trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestManagerProxy.h

    r190262 r193944  
    2020#define UserMediaPermissionRequestManagerProxy_h
    2121
     22#include "UserMediaPermissionCheckProxy.h"
    2223#include "UserMediaPermissionRequestProxy.h"
    2324#include <wtf/HashMap.h>
     
    3334    void invalidateRequests();
    3435
    35     // Create a request to be presented to the user.
    36     PassRefPtr<UserMediaPermissionRequestProxy> createRequest(uint64_t userMediaID, const Vector<String>& audioDeviceUIDs, const Vector<String>& videoDeviceUIDs);
    37 
    38     // Called by UserMediaPermissionRequestProxy when a decision is made by the user.
     36    Ref<UserMediaPermissionRequestProxy> createRequest(uint64_t userMediaID, const Vector<String>& audioDeviceUIDs, const Vector<String>& videoDeviceUIDs);
    3937    void didReceiveUserMediaPermissionDecision(uint64_t, bool allow, const String& audioDeviceUID, const String& videoDeviceUID);
    4038
     39
     40    Ref<UserMediaPermissionCheckProxy> createUserMediaPermissionCheck(uint64_t userMediaID);
     41    void didCompleteUserMediaPermissionCheck(uint64_t, bool allow);
     42
    4143private:
    42     HashMap<uint64_t, RefPtr<UserMediaPermissionRequestProxy>> m_pendingRequests;
     44    HashMap<uint64_t, RefPtr<UserMediaPermissionRequestProxy>> m_pendingUserMediaRequests;
     45    HashMap<uint64_t, RefPtr<UserMediaPermissionCheckProxy>> m_pendingDeviceRequests;
    4346    WebPageProxy& m_page;
    4447};
  • trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestProxy.h

    r191504 r193944  
    2222#include "APIObject.h"
    2323#include <WebCore/RealtimeMediaSource.h>
    24 #include <wtf/PassRefPtr.h>
    2524#include <wtf/Vector.h>
    2625#include <wtf/text/WTFString.h>
     
    3231class UserMediaPermissionRequestProxy : public API::ObjectImpl<API::Object::Type::UserMediaPermissionRequest> {
    3332public:
    34     static PassRefPtr<UserMediaPermissionRequestProxy> create(UserMediaPermissionRequestManagerProxy& manager, uint64_t userMediaID, const Vector<String>& videoDeviceUIDs, const Vector<String>& audioDeviceUIDs)
     33    static Ref<UserMediaPermissionRequestProxy> create(UserMediaPermissionRequestManagerProxy& manager, uint64_t userMediaID, const Vector<String>& videoDeviceUIDs, const Vector<String>& audioDeviceUIDs)
    3534    {
    36         return adoptRef(new UserMediaPermissionRequestProxy(manager, userMediaID, videoDeviceUIDs, audioDeviceUIDs));
     35        return adoptRef(*new UserMediaPermissionRequestProxy(manager, userMediaID, videoDeviceUIDs, audioDeviceUIDs));
    3736    }
    3837
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp

    r193883 r193944  
    52625262}
    52635263
     5264void WebPageProxy::checkUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, String originIdentifier)
     5265{
     5266    WebFrameProxy* frame = m_process->webFrame(frameID);
     5267    MESSAGE_CHECK(frame);
     5268
     5269    RefPtr<API::SecurityOrigin> origin = API::SecurityOrigin::create(SecurityOrigin::createFromDatabaseIdentifier(originIdentifier));
     5270    RefPtr<UserMediaPermissionCheckProxy> request = m_userMediaPermissionRequestManager.createUserMediaPermissionCheck(userMediaID);
     5271
     5272    if (!m_uiClient->checkUserMediaPermissionForOrigin(*this, *frame, *origin.get(), *request.get()))
     5273        request->setHasPersistentPermission(false);
     5274}
     5275
    52645276void WebPageProxy::requestNotificationPermission(uint64_t requestID, const String& originString)
    52655277{
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.h

    r193664 r193944  
    11911191
    11921192    void requestUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, String originIdentifier, const Vector<String>& audioDeviceUIDs, const Vector<String>& videoDeviceUIDs);
     1193    void checkUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, String originIdentifier);
    11931194
    11941195    void runModal();
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in

    r193664 r193944  
    263263    # MediaSteam messages
    264264    RequestUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, String originIdentifier, Vector<String> audioDeviceUIDs, Vector<String> videoDeviceUIDs)
     265    CheckUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, String originIdentifier)
    265266#endif
    266267
  • trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj

    r193468 r193944  
    6565                00B9661918E25AE100CE1F88 /* FindClient.mm in Sources */ = {isa = PBXBuildFile; fileRef = 00B9661718E25AE100CE1F88 /* FindClient.mm */; };
    6666                00B9661A18E25AE100CE1F88 /* FindClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 00B9661818E25AE100CE1F88 /* FindClient.h */; };
     67                07297F9E1C17BBEA003F0735 /* UserMediaPermissionCheckProxy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07297F9C1C17BBEA003F0735 /* UserMediaPermissionCheckProxy.cpp */; settings = {ASSET_TAGS = (); }; };
     68                07297F9F1C17BBEA003F0735 /* UserMediaPermissionCheckProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 07297F9D1C17BBEA003F0735 /* UserMediaPermissionCheckProxy.h */; settings = {ASSET_TAGS = (); }; };
     69                07297FA21C186ADB003F0735 /* WKUserMediaPermissionCheck.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07297FA01C186ADB003F0735 /* WKUserMediaPermissionCheck.cpp */; settings = {ASSET_TAGS = (); }; };
     70                07297FA31C186ADB003F0735 /* WKUserMediaPermissionCheck.h in Headers */ = {isa = PBXBuildFile; fileRef = 07297FA11C186ADB003F0735 /* WKUserMediaPermissionCheck.h */; settings = {ATTRIBUTES = (Private, ); }; };
    6771                076E884E1A13CADF005E90FC /* APIContextMenuClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 076E884D1A13CADF005E90FC /* APIContextMenuClient.h */; };
    6872                0F0C365818C051BA00F607D7 /* RemoteLayerTreeHostIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0F0C365718C051BA00F607D7 /* RemoteLayerTreeHostIOS.mm */; };
     
    21682172                00B9661718E25AE100CE1F88 /* FindClient.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FindClient.mm; sourceTree = "<group>"; };
    21692173                00B9661818E25AE100CE1F88 /* FindClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FindClient.h; sourceTree = "<group>"; };
     2174                07297F9C1C17BBEA003F0735 /* UserMediaPermissionCheckProxy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UserMediaPermissionCheckProxy.cpp; sourceTree = "<group>"; };
     2175                07297F9D1C17BBEA003F0735 /* UserMediaPermissionCheckProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UserMediaPermissionCheckProxy.h; sourceTree = "<group>"; };
     2176                07297FA01C186ADB003F0735 /* WKUserMediaPermissionCheck.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WKUserMediaPermissionCheck.cpp; sourceTree = "<group>"; };
     2177                07297FA11C186ADB003F0735 /* WKUserMediaPermissionCheck.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKUserMediaPermissionCheck.h; sourceTree = "<group>"; };
    21702178                076E884D1A13CADF005E90FC /* APIContextMenuClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APIContextMenuClient.h; sourceTree = "<group>"; };
    21712179                076E884F1A13CBC6005E90FC /* APIInjectedBundlePageContextMenuClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APIInjectedBundlePageContextMenuClient.h; sourceTree = "<group>"; };
     
    61866194                                BC06F43812DBCCFB002D78DE /* GeolocationPermissionRequestProxy.h */,
    61876195                                31607F3819627002009B87DA /* LegacySessionStateCoding.h */,
     6196                                07297F9C1C17BBEA003F0735 /* UserMediaPermissionCheckProxy.cpp */,
     6197                                07297F9D1C17BBEA003F0735 /* UserMediaPermissionCheckProxy.h */,
    61886198                                BC6EDAA5111271C600E7678B /* PageClient.h */,
    61896199                                1AC75379183A9FDA0072CB15 /* PageLoadState.cpp */,
     
    64826492                                7C2413061AACFCB400A58C15 /* WKUserContentExtensionStoreRef.cpp */,
    64836493                                7C2413071AACFCB400A58C15 /* WKUserContentExtensionStoreRef.h */,
     6494                                07297FA01C186ADB003F0735 /* WKUserMediaPermissionCheck.cpp */,
     6495                                07297FA11C186ADB003F0735 /* WKUserMediaPermissionCheck.h */,
    64846496                                4A410F3519AF7AC3002EBAB5 /* WKUserMediaPermissionRequest.cpp */,
    64856497                                4A410F3619AF7AC3002EBAB5 /* WKUserMediaPermissionRequest.h */,
     
    77757787                                2DA944A41884E4F000ED86DB /* GestureTypes.h in Headers */,
    77767788                                2DA049B8180CCD0A00AAFA9E /* GraphicsLayerCARemote.h in Headers */,
     7789                                07297FA31C186ADB003F0735 /* WKUserMediaPermissionCheck.h in Headers */,
    77777790                                C0CE72AD1247E78D00BC0EC4 /* HandleMessage.h in Headers */,
    77787791                                1AC75A1B1B3368270056745B /* HangDetectionDisabler.h in Headers */,
     
    82678280                                51A555F6128C6C47009ABCEC /* WKContextMenuItem.h in Headers */,
    82688281                                51A55601128C6D92009ABCEC /* WKContextMenuItemTypes.h in Headers */,
     8282                                07297F9F1C17BBEA003F0735 /* UserMediaPermissionCheckProxy.h in Headers */,
    82698283                                BCC938E11180DE440085E5FE /* WKContextPrivate.h in Headers */,
    82708284                                9FB5F395169E6A80002C25BF /* WKContextPrivateMac.h in Headers */,
     
    1008510099                                BC06F44F12DBDF3F002D78DE /* WKGeolocationPermissionRequest.cpp in Sources */,
    1008610100                                BC0E619912D6CD120012A72A /* WKGeolocationPosition.cpp in Sources */,
     10101                                07297FA21C186ADB003F0735 /* WKUserMediaPermissionCheck.cpp in Sources */,
    1008710102                                0FCB4E5018BBE044000FCFC9 /* WKGeolocationProviderIOS.mm in Sources */,
    1008810103                                0FCB4E5118BBE044000FCFC9 /* WKGeolocationProviderIOSObjCSecurityOrigin.mm in Sources */,
     
    1009910114                                A54293A5195A43DD002782C7 /* WKInspectorNodeSearchGestureRecognizer.mm in Sources */,
    1010010115                                51A9E10A1315CD18009E7031 /* WKKeyValueStorageManager.cpp in Sources */,
     10116                                07297F9E1C17BBEA003F0735 /* UserMediaPermissionCheckProxy.cpp in Sources */,
    1010110117                                33D3A3B51339600B00709BE4 /* WKMediaCacheManager.cpp in Sources */,
    1010210118                                C98C48A91B6FD5B500145103 /* WKMediaSessionFocusManager.cpp in Sources */,
  • trunk/Source/WebKit2/WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp

    r190262 r193944  
    4646}
    4747
    48 void UserMediaPermissionRequestManager::startRequest(UserMediaRequest& request)
     48void UserMediaPermissionRequestManager::startUserMediaRequest(UserMediaRequest& request)
    4949{
    5050    Document* document = downcast<Document>(request.scriptExecutionContext());
     
    5757
    5858    uint64_t requestID = generateRequestID();
    59     m_idToRequestMap.add(requestID, &request);
    60     m_requestToIDMap.add(&request, requestID);
     59    m_idToUserMediaRequestMap.add(requestID, &request);
     60    m_userMediaRequestToIDMap.add(&request, requestID);
    6161
    6262    WebFrame* webFrame = WebFrame::fromCoreFrame(*frame);
     
    6767}
    6868
    69 void UserMediaPermissionRequestManager::cancelRequest(UserMediaRequest& request)
     69void UserMediaPermissionRequestManager::cancelUserMediaRequest(UserMediaRequest& request)
    7070{
    71     uint64_t requestID = m_requestToIDMap.take(&request);
     71    uint64_t requestID = m_userMediaRequestToIDMap.take(&request);
    7272    if (!requestID)
    7373        return;
    74     m_idToRequestMap.remove(requestID);
     74    m_idToUserMediaRequestMap.remove(requestID);
    7575}
    7676
    7777void UserMediaPermissionRequestManager::didReceiveUserMediaPermissionDecision(uint64_t requestID, bool allowed, const String& audioDeviceUID, const String& videoDeviceUID)
    7878{
    79     RefPtr<UserMediaRequest> request = m_idToRequestMap.take(requestID);
     79    RefPtr<UserMediaRequest> request = m_idToUserMediaRequestMap.take(requestID);
    8080    if (!request)
    8181        return;
    82     m_requestToIDMap.remove(request);
     82    m_userMediaRequestToIDMap.remove(request);
    8383
    8484    if (allowed)
     
    8888}
    8989
     90void UserMediaPermissionRequestManager::startUserMediaPermissionCheck(WebCore::UserMediaPermissionCheck& request)
     91{
     92    Document* document = downcast<Document>(request.scriptExecutionContext());
     93    Frame* frame = document ? document->frame() : nullptr;
     94
     95    if (!frame) {
     96        request.setHasPersistentPermission(false);
     97        return;
     98    }
     99
     100    uint64_t requestID = generateRequestID();
     101    m_idToUserMediaPermissionCheckMap.add(requestID, &request);
     102    m_userMediaPermissionCheckToIDMap.add(&request, requestID);
     103
     104    WebFrame* webFrame = WebFrame::fromCoreFrame(*frame);
     105    ASSERT(webFrame);
     106
     107    SecurityOrigin* origin = request.securityOrigin();
     108    m_page.send(Messages::WebPageProxy::CheckUserMediaPermissionForFrame(requestID, webFrame->frameID(), origin->databaseIdentifier()));
     109}
     110
     111void UserMediaPermissionRequestManager::cancelUserMediaPermissionCheck(WebCore::UserMediaPermissionCheck& request)
     112{
     113    uint64_t requestID = m_userMediaPermissionCheckToIDMap.take(&request);
     114    if (!requestID)
     115        return;
     116    m_idToUserMediaPermissionCheckMap.remove(requestID);
     117}
     118
     119void UserMediaPermissionRequestManager::didCompleteUserMediaPermissionCheck(uint64_t requestID, bool allowed)
     120{
     121    RefPtr<UserMediaPermissionCheck> request = m_idToUserMediaPermissionCheckMap.take(requestID);
     122    if (!request)
     123        return;
     124    m_userMediaPermissionCheckToIDMap.remove(request);
     125   
     126    request->setHasPersistentPermission(allowed);
     127}
     128
    90129} // namespace WebKit
    91130
  • trunk/Source/WebKit2/WebProcess/MediaStream/UserMediaPermissionRequestManager.h

    r190262 r193944  
    2222#if ENABLE(MEDIA_STREAM)
    2323
     24#include <WebCore/UserMediaPermissionCheck.h>
    2425#include <WebCore/UserMediaRequest.h>
    2526#include <wtf/HashMap.h>
     
    3536    explicit UserMediaPermissionRequestManager(WebPage&);
    3637
    37     void startRequest(WebCore::UserMediaRequest&);
    38     void cancelRequest(WebCore::UserMediaRequest&);
     38    void startUserMediaRequest(WebCore::UserMediaRequest&);
     39    void cancelUserMediaRequest(WebCore::UserMediaRequest&);
     40    void didReceiveUserMediaPermissionDecision(uint64_t requestID, bool allowed, const String& audioDeviceUID, const String& videoDeviceUID);
    3941
    40     void didReceiveUserMediaPermissionDecision(uint64_t userMediaID, bool allowed, const String& audioDeviceUID, const String& videoDeviceUID);
     42    void startUserMediaPermissionCheck(WebCore::UserMediaPermissionCheck&);
     43    void cancelUserMediaPermissionCheck(WebCore::UserMediaPermissionCheck&);
     44    void didCompleteUserMediaPermissionCheck(uint64_t requestID, bool allowed);
    4145
    4246private:
    4347    WebPage& m_page;
    4448
    45     HashMap<uint64_t, RefPtr<WebCore::UserMediaRequest>> m_idToRequestMap;
    46     HashMap<RefPtr<WebCore::UserMediaRequest>, uint64_t> m_requestToIDMap;
     49    HashMap<uint64_t, RefPtr<WebCore::UserMediaRequest>> m_idToUserMediaRequestMap;
     50    HashMap<RefPtr<WebCore::UserMediaRequest>, uint64_t> m_userMediaRequestToIDMap;
     51
     52    HashMap<uint64_t, RefPtr<WebCore::UserMediaPermissionCheck>> m_idToUserMediaPermissionCheckMap;
     53    HashMap<RefPtr<WebCore::UserMediaPermissionCheck>, uint64_t> m_userMediaPermissionCheckToIDMap;
    4754};
    4855
  • trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebUserMediaClient.cpp

    r193764 r193944  
    4040}
    4141
    42 void WebUserMediaClient::requestUserMediaAccess(Ref<UserMediaRequest>&& prRequest)
     42void WebUserMediaClient::requestUserMediaAccess(UserMediaRequest& request)
    4343{
    44     UserMediaRequest& request = prRequest.leakRef();
    45     m_page.userMediaPermissionRequestManager().startRequest(request);
     44    m_page.userMediaPermissionRequestManager().startUserMediaRequest(request);
    4645}
    4746
    4847void WebUserMediaClient::cancelUserMediaAccessRequest(UserMediaRequest& request)
    4948{
    50     m_page.userMediaPermissionRequestManager().cancelRequest(request);
     49    m_page.userMediaPermissionRequestManager().cancelUserMediaRequest(request);
     50}
     51
     52void WebUserMediaClient::checkUserMediaPermission(WebCore::UserMediaPermissionCheck& request)
     53{
     54    m_page.userMediaPermissionRequestManager().startUserMediaPermissionCheck(request);
     55}
     56
     57void WebUserMediaClient::cancelUserMediaPermissionCheck(WebCore::UserMediaPermissionCheck& request)
     58{
     59    m_page.userMediaPermissionRequestManager().cancelUserMediaPermissionCheck(request);
    5160}
    5261
  • trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebUserMediaClient.h

    r193764 r193944  
    3434
    3535private:
    36     virtual void pageDestroyed() override;
    37     void requestUserMediaAccess(Ref<WebCore::UserMediaRequest>&&) override;
     36    void pageDestroyed() override;
     37
     38    void requestUserMediaAccess(WebCore::UserMediaRequest&) override;
    3839    void cancelUserMediaAccessRequest(WebCore::UserMediaRequest&) override;
     40
     41    void checkUserMediaPermission(WebCore::UserMediaPermissionCheck&) override;
     42    void cancelUserMediaPermissionCheck(WebCore::UserMediaPermissionCheck&) override;
    3943
    4044    WebPage& m_page;
  • trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp

    r193664 r193944  
    33663366    m_userMediaPermissionRequestManager.didReceiveUserMediaPermissionDecision(userMediaID, allowed, audioDeviceUID, videoDeviceUID);
    33673367}
     3368
     3369void WebPage::didCompleteUserMediaPermissionCheck(uint64_t userMediaID, bool allowed)
     3370{
     3371    m_userMediaPermissionRequestManager.didCompleteUserMediaPermissionCheck(userMediaID, allowed);
     3372}
    33683373#endif
    33693374
  • trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h

    r193664 r193944  
    11061106#if ENABLE(MEDIA_STREAM)
    11071107    WK_EXPORT void didReceiveUserMediaPermissionDecision(uint64_t userMediaID, bool allowed, const String& audioDeviceUID, const String& videoDeviceUID);
     1108    WK_EXPORT void didCompleteUserMediaPermissionCheck(uint64_t userMediaID, bool allowed);
    11081109#endif
    11091110
  • trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in

    r193664 r193944  
    283283    # MediaSteam
    284284    DidReceiveUserMediaPermissionDecision(uint64_t userMediaID, bool allowed, String audioDeviceUID, String videoDeviceUID)
     285    DidCompleteUserMediaPermissionCheck(uint64_t userMediaID, bool allowed)
    285286#endif
    286287
  • trunk/Tools/ChangeLog

    r193924 r193944  
     12015-12-10  Eric Carlson  <eric.carlson@apple.com>
     2
     3        [MediaStream] Expose media capture devices persistent permissions to WebCore
     4        https://bugs.webkit.org/show_bug.cgi?id=152087
     5
     6        Add support for the new user media permission checker page UI client method.
     7
     8        Reviewed by Chris Dumez.
     9
     10        * WebKitTestRunner/TestController.cpp:
     11        (WTR::decidePolicyForUserMediaPermissionRequest):
     12        (WTR::checkUserMediaPermissionForOrigin):
     13        (WTR::TestController::createOtherPage): Add checkUserMediaPermissionForOrigin.
     14        (WTR::TestController::createWebViewWithOptions): Ditto.
     15        (WTR::TestController::resetStateToConsistentValues): Clear m_userMediaOriginPermissions.
     16        (WTR::originUserVisibleName): New, create a string for the origin.
     17        (WTR::TestController::handleCheckOfUserMediaPermissionForOrigin): Set the WKUserMediaPermissionCheckRef
     18          according to the state of the origin permission map.
     19        (WTR::TestController::handleUserMediaPermissionRequest): Remember both the origin and the
     20          request so we can update the origin permission map in decidePolicyForUserMediaPermissionRequestIfPossible.
     21        (WTR::TestController::decidePolicyForUserMediaPermissionRequestIfPossible): Update the
     22          origin permission map.
     23        * WebKitTestRunner/TestController.h:
     24
    1252015-12-10  Alex Christensen  <achristensen@webkit.org>
    226
  • trunk/Tools/WebKitTestRunner/TestController.cpp

    r192911 r193944  
    5252#include <WebKit/WKProtectionSpace.h>
    5353#include <WebKit/WKRetainPtr.h>
     54#include <WebKit/WKSecurityOriginRef.h>
     55#include <WebKit/WKUserMediaPermissionCheck.h>
    5456#include <algorithm>
    5557#include <cstdio>
     
    202204}
    203205
    204 static void decidePolicyForUserMediaPermissionRequest(WKPageRef, WKFrameRef, WKSecurityOriginRef, WKUserMediaPermissionRequestRef permissionRequest, const void* clientInfo)
    205 {
    206     TestController::singleton().handleUserMediaPermissionRequest(permissionRequest);
     206static void decidePolicyForUserMediaPermissionRequest(WKPageRef, WKFrameRef, WKSecurityOriginRef origin, WKUserMediaPermissionRequestRef permissionRequest, const void* clientInfo)
     207{
     208    TestController::singleton().handleUserMediaPermissionRequest(origin, permissionRequest);
     209}
     210
     211static void checkUserMediaPermissionForOrigin(WKPageRef, WKFrameRef, WKSecurityOriginRef origin, WKUserMediaPermissionCheckRef checkRequest, const void*)
     212{
     213    TestController::singleton().handleCheckOfUserMediaPermissionForOrigin(origin, checkRequest);
    207214}
    208215
     
    278285        0, // runJavaScriptAlert
    279286        0, // runJavaScriptConfirm
    280         0  // runJavaScriptPrompt
     287        0, // runJavaScriptPrompt
     288        checkUserMediaPermissionForOrigin,
    281289    };
    282290    WKPageSetPageUIClient(newPage, &otherPageUIClient.base);
     
    541549        0, // runJavaScriptConfirm
    542550        0, // runJavaScriptPrompt
     551        checkUserMediaPermissionForOrigin,
    543552    };
    544553    WKPageSetPageUIClient(m_mainWebView->page(), &pageUIClient.base);
     
    745754    // Reset UserMedia permissions.
    746755    m_userMediaPermissionRequests.clear();
     756    m_userMediaOriginPermissions = nullptr;
    747757    m_isUserMediaPermissionSet = false;
    748758    m_isUserMediaPermissionAllowed = false;
     
    16431653}
    16441654
    1645 void TestController::handleUserMediaPermissionRequest(WKUserMediaPermissionRequestRef userMediaPermissionRequest)
    1646 {
    1647     m_userMediaPermissionRequests.append(userMediaPermissionRequest);
     1655static WKStringRef originUserVisibleName(WKSecurityOriginRef origin)
     1656{
     1657    std::string host = toSTD(adoptWK(WKSecurityOriginCopyHost(origin))).c_str();
     1658    std::string protocol = toSTD(adoptWK(WKSecurityOriginCopyProtocol(origin))).c_str();
     1659    unsigned short port = WKSecurityOriginGetPort(origin);
     1660
     1661    String userVisibleName;
     1662    if (port)
     1663        userVisibleName = String::format("%s://%s:%d", protocol.c_str(), host.c_str(), port);
     1664    else
     1665        userVisibleName = String::format("%s://%s", protocol.c_str(), host.c_str());
     1666
     1667    return WKStringCreateWithUTF8CString(userVisibleName.utf8().data());
     1668}
     1669
     1670void TestController::handleCheckOfUserMediaPermissionForOrigin(WKSecurityOriginRef origin, const WKUserMediaPermissionCheckRef& checkRequest)
     1671{
     1672    bool allowed = false;
     1673
     1674    if (m_userMediaOriginPermissions) {
     1675        WKRetainPtr<WKStringRef> originString = originUserVisibleName(origin);
     1676        WKBooleanRef value = static_cast<WKBooleanRef>(WKDictionaryGetItemForKey(m_userMediaOriginPermissions.get(), originString.get()));
     1677        if (WKGetTypeID(value) == WKBooleanGetTypeID())
     1678            allowed = WKBooleanGetValue(value);
     1679    }
     1680
     1681    WKUserMediaPermissionCheckSetHasPersistentPermission(checkRequest, allowed);
     1682}
     1683
     1684void TestController::handleUserMediaPermissionRequest(WKSecurityOriginRef origin, WKUserMediaPermissionRequestRef request)
     1685{
     1686    m_userMediaPermissionRequests.append(std::make_pair(origin, request));
    16481687    decidePolicyForUserMediaPermissionRequestIfPossible();
    16491688}
     
    16541693        return;
    16551694
    1656     for (auto& request : m_userMediaPermissionRequests) {
    1657         WKRetainPtr<WKArrayRef> audioDeviceUIDs = WKUserMediaPermissionRequestAudioDeviceUIDs(request.get());
    1658         WKRetainPtr<WKArrayRef> videoDeviceUIDs = WKUserMediaPermissionRequestVideoDeviceUIDs(request.get());
     1695    for (auto& pair : m_userMediaPermissionRequests) {
     1696        auto origin = pair.first.get();
     1697        auto request = pair.second.get();
     1698        WKRetainPtr<WKArrayRef> audioDeviceUIDs = WKUserMediaPermissionRequestAudioDeviceUIDs(request);
     1699        WKRetainPtr<WKArrayRef> videoDeviceUIDs = WKUserMediaPermissionRequestVideoDeviceUIDs(request);
     1700
     1701        WKRetainPtr<WKStringRef> originString = adoptWK(originUserVisibleName(origin));
     1702        if (!m_userMediaOriginPermissions)
     1703            m_userMediaOriginPermissions = adoptWK(WKMutableDictionaryCreate());
     1704        WKRetainPtr<WKBooleanRef> allowed = adoptWK(WKBooleanCreate(m_isUserMediaPermissionAllowed));
     1705        WKDictionarySetItem(m_userMediaOriginPermissions.get(), originString.get(), allowed.get());
    16591706
    16601707        if (m_isUserMediaPermissionAllowed && (WKArrayGetSize(videoDeviceUIDs.get()) || WKArrayGetSize(audioDeviceUIDs.get()))) {
     
    16711718                audioDeviceUID = WKStringCreateWithUTF8CString("");
    16721719
    1673             WKUserMediaPermissionRequestAllow(request.get(), audioDeviceUID.get(), videoDeviceUID.get());
     1720            WKUserMediaPermissionRequestAllow(request, audioDeviceUID.get(), videoDeviceUID.get());
    16741721
    16751722        } else
    1676             WKUserMediaPermissionRequestDeny(request.get());
     1723            WKUserMediaPermissionRequestDeny(request);
    16771724    }
    16781725    m_userMediaPermissionRequests.clear();
  • trunk/Tools/WebKitTestRunner/TestController.h

    r190335 r193944  
    3333#include <string>
    3434#include <vector>
     35#include <wtf/HashMap.h>
    3536#include <wtf/Vector.h>
    3637
     
    9697    // MediaStream.
    9798    void setUserMediaPermission(bool);
    98     void handleUserMediaPermissionRequest(WKUserMediaPermissionRequestRef);
     99    void handleUserMediaPermissionRequest(WKSecurityOriginRef, WKUserMediaPermissionRequestRef);
     100    void handleCheckOfUserMediaPermissionForOrigin(WKSecurityOriginRef, const WKUserMediaPermissionCheckRef&);
    99101
    100102    // Policy delegate.
     
    283285    bool m_isGeolocationPermissionAllowed;
    284286
    285     Vector<WKRetainPtr<WKUserMediaPermissionRequestRef>> m_userMediaPermissionRequests;
     287    WKRetainPtr<WKMutableDictionaryRef> m_userMediaOriginPermissions;
     288
     289    typedef Vector<std::pair<WKRetainPtr<WKSecurityOriginRef>, WKRetainPtr<WKUserMediaPermissionRequestRef>>> PermissionRequestList;
     290    PermissionRequestList m_userMediaPermissionRequests;
     291
    286292    bool m_isUserMediaPermissionSet;
    287293    bool m_isUserMediaPermissionAllowed;
Note: See TracChangeset for help on using the changeset viewer.