Changeset 223988 in webkit


Ignore:
Timestamp:
Oct 25, 2017 3:15:05 PM (7 years ago)
Author:
eric.carlson@apple.com
Message:

[MediaStream] Clear cached gUM prompt state
https://bugs.webkit.org/show_bug.cgi?id=178754
<rdar://problem/32742356>

Reviewed by Youenn Fablet.

Source/WebKit:

  • Shared/WebPreferences.yaml: Define new settings.
  • Shared/WebPreferencesDefinitionsBase.h: New default values.
  • UIProcess/API/C/WKPreferences.cpp:

(WKPreferencesSetInactiveMediaCaptureSteamRepromptIntervalInMinutes): New.
(WKPreferencesGetInactiveMediaCaptureSteamRepromptIntervalInMinutes): Ditto.

  • UIProcess/API/C/WKPreferencesRefPrivate.h:
  • UIProcess/API/Cocoa/WKPreferences.mm:

(-[WKPreferences _inactiveMediaCaptureSteamRepromptIntervalInMinutes]): Ditto.
(-[WKPreferences _setInactiveMediaCaptureSteamRepromptIntervalInMinutes:]): Ditto.

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

(WebKit::UserMediaPermissionRequestManagerProxy::UserMediaPermissionRequestManagerProxy): Initialize
the timer.
(WebKit::UserMediaPermissionRequestManagerProxy::createRequest): Remove unneeded namespace.
(WebKit::toWebCore): Remove unneeded breaks.
(WebKit::UserMediaPermissionRequestManagerProxy::searchForGrantedRequest const): Remove unneeded namespace.
(WebKit::UserMediaPermissionRequestManagerProxy::wasRequestDenied): Ditto.
(WebKit::UserMediaPermissionRequestManagerProxy::requestUserMediaPermissionForFrame): Ditto.
(WebKit::UserMediaPermissionRequestManagerProxy::getUserMediaPermissionInfo): Ditto.
(WebKit::UserMediaPermissionRequestManagerProxy::enumerateMediaDevicesForFrame): Ditto.
(WebKit::UserMediaPermissionRequestManagerProxy::syncWithWebCorePrefs const): Ditto.
(WebKit::UserMediaPermissionRequestManagerProxy::captureStateChanged): Set the watchdog timer
to the correct interval based on capture state.
(WebKit::UserMediaPermissionRequestManagerProxy::watchdogTimerFired): Clear cached state.

  • UIProcess/UserMediaPermissionRequestManagerProxy.h:

Tools:

  • TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: Add new test
  • TestWebKitAPI/Tests/WebKit/GetUserMediaReprompt.mm: Added.

(-[GetUserMediaRepromptUIDelegate _webView:requestUserMediaAuthorizationForDevices:url:mainFrameURL:decisionHandler:]):
(-[GetUserMediaRepromptUIDelegate _webView:checkUserMediaPermissionForURL:mainFrameURL:frameIdentifier:decisionHandler:]):
(TestWebKitAPI::TEST):

  • TestWebKitAPI/Tests/WebKit/getUserMedia.html:
Location:
trunk
Files:
1 added
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r223984 r223988  
     12017-10-25  Eric Carlson  <eric.carlson@apple.com>
     2
     3        [MediaStream] Clear cached gUM prompt state
     4        https://bugs.webkit.org/show_bug.cgi?id=178754
     5        <rdar://problem/32742356>
     6
     7        Reviewed by Youenn Fablet.
     8
     9        * Shared/WebPreferences.yaml: Define new settings.
     10
     11        * Shared/WebPreferencesDefinitionsBase.h: New default values.
     12
     13        * UIProcess/API/C/WKPreferences.cpp:
     14        (WKPreferencesSetInactiveMediaCaptureSteamRepromptIntervalInMinutes): New.
     15        (WKPreferencesGetInactiveMediaCaptureSteamRepromptIntervalInMinutes): Ditto.
     16        * UIProcess/API/C/WKPreferencesRefPrivate.h:
     17
     18        * UIProcess/API/Cocoa/WKPreferences.mm:
     19        (-[WKPreferences _inactiveMediaCaptureSteamRepromptIntervalInMinutes]): Ditto.
     20        (-[WKPreferences _setInactiveMediaCaptureSteamRepromptIntervalInMinutes:]): Ditto.
     21        * UIProcess/API/Cocoa/WKPreferencesPrivate.h:
     22
     23        * UIProcess/UserMediaPermissionRequestManagerProxy.cpp:
     24        (WebKit::UserMediaPermissionRequestManagerProxy::UserMediaPermissionRequestManagerProxy): Initialize
     25        the timer.
     26        (WebKit::UserMediaPermissionRequestManagerProxy::createRequest): Remove unneeded namespace.
     27        (WebKit::toWebCore): Remove unneeded breaks.
     28        (WebKit::UserMediaPermissionRequestManagerProxy::searchForGrantedRequest const): Remove unneeded namespace.
     29        (WebKit::UserMediaPermissionRequestManagerProxy::wasRequestDenied): Ditto.
     30        (WebKit::UserMediaPermissionRequestManagerProxy::requestUserMediaPermissionForFrame): Ditto.
     31        (WebKit::UserMediaPermissionRequestManagerProxy::getUserMediaPermissionInfo): Ditto.
     32        (WebKit::UserMediaPermissionRequestManagerProxy::enumerateMediaDevicesForFrame): Ditto.
     33        (WebKit::UserMediaPermissionRequestManagerProxy::syncWithWebCorePrefs const): Ditto.
     34        (WebKit::UserMediaPermissionRequestManagerProxy::captureStateChanged): Set the watchdog timer
     35        to the correct interval based on capture state.
     36        (WebKit::UserMediaPermissionRequestManagerProxy::watchdogTimerFired): Clear cached state.
     37        * UIProcess/UserMediaPermissionRequestManagerProxy.h:
     38
    1392017-10-25  Simon Fraser  <simon.fraser@apple.com>
    240
  • trunk/Source/WebKit/Shared/WebPreferences.yaml

    r223903 r223988  
    823823  webkitOnly: true
    824824
     825InactiveMediaCaptureSteamRepromptIntervalInMinutes:
     826    type: double
     827    defaultValue: DEFAULT_INTERACTIVE_MNEDIA_CAPTURE_STREAM_REPROMPT_INTERVAL_IN_MINUTES
     828
     829LongRunningMediaCaptureStreamRepromptIntervalInHours:
     830    type: double
     831    defaultValue: 24
    825832
    826833# Debug Preferences
  • trunk/Source/WebKit/Shared/WebPreferencesDefinitionsBase.h

    r223903 r223988  
    7676#define DEFAULT_REQUIRES_USER_GESTURE_FOR_AUDIO_PLAYBACK true
    7777#define DEFAULT_LEGACY_ENCRYPTED_MEDIA_API_ENABLED false
     78#define DEFAULT_INTERACTIVE_MNEDIA_CAPTURE_STREAM_REPROMPT_INTERVAL_IN_MINUTES 1
    7879#else
    7980#define DEFAULT_ALLOWS_PICTURE_IN_PICTURE_MEDIA_PLAYBACK false
     
    9495#define DEFAULT_REQUIRES_USER_GESTURE_FOR_AUDIO_PLAYBACK false
    9596#define DEFAULT_LEGACY_ENCRYPTED_MEDIA_API_ENABLED true
     97#define DEFAULT_INTERACTIVE_MNEDIA_CAPTURE_STREAM_REPROMPT_INTERVAL_IN_MINUTES 10
    9698#endif
    9799
  • trunk/Source/WebKit/UIProcess/API/C/WKPreferences.cpp

    r223708 r223988  
    16511651}
    16521652
     1653void WKPreferencesSetInactiveMediaCaptureSteamRepromptIntervalInMinutes(WKPreferencesRef preferencesRef, double interval)
     1654{
     1655    toImpl(preferencesRef)->setInactiveMediaCaptureSteamRepromptIntervalInMinutes(interval);
     1656}
     1657
     1658double WKPreferencesGetInactiveMediaCaptureSteamRepromptIntervalInMinutes(WKPreferencesRef preferencesRef)
     1659{
     1660    return toImpl(preferencesRef)->inactiveMediaCaptureSteamRepromptIntervalInMinutes();
     1661}
     1662
    16531663void WKPreferencesSetFetchAPIEnabled(WKPreferencesRef preferencesRef, bool flag)
    16541664{
  • trunk/Source/WebKit/UIProcess/API/C/WKPreferencesRefPrivate.h

    r223167 r223988  
    442442WK_EXPORT bool WKPreferencesGetMediaCaptureRequiresSecureConnection(WKPreferencesRef);
    443443
     444// Defaults to 1 minute on iOS, 10 minutes elsewhere
     445WK_EXPORT void WKPreferencesSetInactiveMediaCaptureSteamRepromptIntervalInMinutes(WKPreferencesRef, double);
     446WK_EXPORT double WKPreferencesGetInactiveMediaCaptureSteamRepromptIntervalInMinutes(WKPreferencesRef);
     447
    444448// Defaults to false
    445449WK_EXPORT void WKPreferencesSetFetchAPIEnabled(WKPreferencesRef, bool flag);
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKPreferences.mm

    r223708 r223988  
    613613}
    614614
     615- (double)_inactiveMediaCaptureSteamRepromptIntervalInMinutes
     616{
     617    return _preferences->inactiveMediaCaptureSteamRepromptIntervalInMinutes();
     618}
     619
     620- (void)_setInactiveMediaCaptureSteamRepromptIntervalInMinutes:(double)interval
     621{
     622    _preferences->setInactiveMediaCaptureSteamRepromptIntervalInMinutes(interval);
     623}
     624
    615625- (BOOL)_enumeratingAllNetworkInterfacesEnabled
    616626{
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKPreferencesPrivate.h

    r222715 r223988  
    111111@property (nonatomic, setter=_setICECandidateFilteringEnabled:) BOOL _iceCandidateFilteringEnabled WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
    112112@property (nonatomic, setter=_setWebRTCLegacyAPIEnabled:) BOOL _webRTCLegacyAPIEnabled WK_API_AVAILABLE(macosx(10.13), ios(11.0));
     113@property (nonatomic, setter=_setInactiveMediaCaptureSteamRepromptIntervalInMinutes:) double _inactiveMediaCaptureSteamRepromptIntervalInMinutes WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
    113114
    114115@property (nonatomic, setter=_setJavaScriptCanAccessClipboard:) BOOL _javaScriptCanAccessClipboard WK_API_AVAILABLE(macosx(10.13), ios(11.0));
  • trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp

    r222503 r223988  
    3535#include <WebCore/UserMediaRequest.h>
    3636
    37 #if ENABLE(MEDIA_STREAM) && USE(AVFOUNDATION)
    38 #include <WebCore/RealtimeMediaSourceCenterMac.h>
    39 #endif
    40 
    4137using namespace WebCore;
    4238
    4339namespace WebKit {
     40
     41static const MediaProducer::MediaStateFlags activeCaptureMask = MediaProducer::HasActiveAudioCaptureDevice | MediaProducer::HasActiveVideoCaptureDevice;
    4442
    4543UserMediaPermissionRequestManagerProxy::UserMediaPermissionRequestManagerProxy(WebPageProxy& page)
    4644    : m_page(page)
    4745    , m_rejectionTimer(RunLoop::main(), this, &UserMediaPermissionRequestManagerProxy::rejectionTimerFired)
     46    , m_watchdogTimer(RunLoop::main(), this, &UserMediaPermissionRequestManagerProxy::watchdogTimerFired)
    4847{
    4948#if ENABLE(MEDIA_STREAM)
     
    8281}
    8382
    84 Ref<UserMediaPermissionRequestProxy> UserMediaPermissionRequestManagerProxy::createRequest(uint64_t userMediaID, uint64_t mainFrameID, uint64_t frameID, Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin, Vector<String>&& audioDeviceUIDs, Vector<String>&& videoDeviceUIDs, String&& deviceIDHashSalt)
     83Ref<UserMediaPermissionRequestProxy> UserMediaPermissionRequestManagerProxy::createRequest(uint64_t userMediaID, uint64_t mainFrameID, uint64_t frameID, Ref<SecurityOrigin>&& userMediaDocumentOrigin, Ref<SecurityOrigin>&& topLevelDocumentOrigin, Vector<String>&& audioDeviceUIDs, Vector<String>&& videoDeviceUIDs, String&& deviceIDHashSalt)
    8584{
    8685    auto request = UserMediaPermissionRequestProxy::create(*this, userMediaID, mainFrameID, frameID, WTFMove(userMediaDocumentOrigin), WTFMove(topLevelDocumentOrigin), WTFMove(audioDeviceUIDs), WTFMove(videoDeviceUIDs), WTFMove(deviceIDHashSalt));
     
    9594    case UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::NoConstraints:
    9695        return static_cast<uint64_t>(UserMediaRequest::MediaAccessDenialReason::NoConstraints);
    97         break;
    9896    case UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::UserMediaDisabled:
    9997        return static_cast<uint64_t>(UserMediaRequest::MediaAccessDenialReason::UserMediaDisabled);
    100         break;
    10198    case UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::NoCaptureDevices:
    10299        return static_cast<uint64_t>(UserMediaRequest::MediaAccessDenialReason::NoCaptureDevices);
    103         break;
    104100    case UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::InvalidConstraint:
    105101        return static_cast<uint64_t>(UserMediaRequest::MediaAccessDenialReason::InvalidConstraint);
    106         break;
    107102    case UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::HardwareError:
    108103        return static_cast<uint64_t>(UserMediaRequest::MediaAccessDenialReason::HardwareError);
    109         break;
    110104    case UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::PermissionDenied:
    111105        return static_cast<uint64_t>(UserMediaRequest::MediaAccessDenialReason::PermissionDenied);
    112         break;
    113106    case UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::OtherFailure:
    114107        return static_cast<uint64_t>(UserMediaRequest::MediaAccessDenialReason::OtherFailure);
    115         break;
    116108    }
    117109
     
    179171}
    180172
    181 const UserMediaPermissionRequestProxy* UserMediaPermissionRequestManagerProxy::searchForGrantedRequest(uint64_t frameID, const WebCore::SecurityOrigin& userMediaDocumentOrigin, const WebCore::SecurityOrigin& topLevelDocumentOrigin, bool needsAudio, bool needsVideo) const
     173const UserMediaPermissionRequestProxy* UserMediaPermissionRequestManagerProxy::searchForGrantedRequest(uint64_t frameID, const SecurityOrigin& userMediaDocumentOrigin, const SecurityOrigin& topLevelDocumentOrigin, bool needsAudio, bool needsVideo) const
    182174{
    183175    if (m_page.isMediaStreamCaptureMuted())
     
    208200}
    209201
    210 bool UserMediaPermissionRequestManagerProxy::wasRequestDenied(uint64_t mainFrameID, const WebCore::SecurityOrigin& userMediaDocumentOrigin, const WebCore::SecurityOrigin& topLevelDocumentOrigin, bool needsAudio, bool needsVideo)
     202bool UserMediaPermissionRequestManagerProxy::wasRequestDenied(uint64_t mainFrameID, const SecurityOrigin& userMediaDocumentOrigin, const SecurityOrigin& topLevelDocumentOrigin, bool needsAudio, bool needsVideo)
    211203{
    212204    for (const auto& deniedRequest : m_deniedRequests) {
     
    254246}
    255247
    256 void UserMediaPermissionRequestManagerProxy::requestUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin, const WebCore::MediaConstraints& audioConstraints, const WebCore::MediaConstraints& videoConstraints)
     248void UserMediaPermissionRequestManagerProxy::requestUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, Ref<SecurityOrigin>&& userMediaDocumentOrigin, Ref<SecurityOrigin>&& topLevelDocumentOrigin, const MediaConstraints& audioConstraints, const MediaConstraints& videoConstraints)
    257249{
    258250#if ENABLE(MEDIA_STREAM)
     
    263255    }
    264256
    265     WebCore::RealtimeMediaSourceCenter::InvalidConstraintsHandler invalidHandler = [this, userMediaID](const String& invalidConstraint) {
     257    RealtimeMediaSourceCenter::InvalidConstraintsHandler invalidHandler = [this, userMediaID](const String& invalidConstraint) {
    266258        if (!m_page.isValid())
    267259            return;
     
    270262    };
    271263
    272     WebCore::RealtimeMediaSourceCenter::ValidConstraintsHandler validHandler = [this, userMediaID, frameID, userMediaDocumentOrigin = userMediaDocumentOrigin.copyRef(), topLevelDocumentOrigin = topLevelDocumentOrigin.copyRef()](Vector<String>&& audioDeviceUIDs, Vector<String>&& videoDeviceUIDs, String&& deviceIdentifierHashSalt) mutable {
     264    RealtimeMediaSourceCenter::ValidConstraintsHandler validHandler = [this, userMediaID, frameID, userMediaDocumentOrigin = userMediaDocumentOrigin.copyRef(), topLevelDocumentOrigin = topLevelDocumentOrigin.copyRef()](Vector<String>&& audioDeviceUIDs, Vector<String>&& videoDeviceUIDs, String&& deviceIdentifierHashSalt) mutable {
    273265        if (!m_page.isValid() || !m_page.mainFrame())
    274266            return;
     
    319311    };
    320312
    321     auto haveDeviceSaltHandler = [this, validHandler = WTFMove(validHandler), invalidHandler = WTFMove(invalidHandler), audioConstraints = WebCore::MediaConstraints(audioConstraints), videoConstraints = WebCore::MediaConstraints(videoConstraints)](uint64_t userMediaID, String&& deviceIdentifierHashSalt, bool originHasPersistentAccess) mutable {
     313    auto haveDeviceSaltHandler = [this, validHandler = WTFMove(validHandler), invalidHandler = WTFMove(invalidHandler), audioConstraints = MediaConstraints(audioConstraints), videoConstraints = MediaConstraints(videoConstraints)](uint64_t userMediaID, String&& deviceIdentifierHashSalt, bool originHasPersistentAccess) mutable {
    322314
    323315        auto request = m_pendingDeviceRequests.take(userMediaID);
     
    348340
    349341#if ENABLE(MEDIA_STREAM)
    350 void UserMediaPermissionRequestManagerProxy::getUserMediaPermissionInfo(uint64_t userMediaID, uint64_t frameID, UserMediaPermissionCheckProxy::CompletionHandler&& handler, Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin)
     342void UserMediaPermissionRequestManagerProxy::getUserMediaPermissionInfo(uint64_t userMediaID, uint64_t frameID, UserMediaPermissionCheckProxy::CompletionHandler&& handler, Ref<SecurityOrigin>&& userMediaDocumentOrigin, Ref<SecurityOrigin>&& topLevelDocumentOrigin)
    351343{
    352344    auto userMediaOrigin = API::SecurityOrigin::create(userMediaDocumentOrigin.get());
     
    361353#endif
    362354
    363 void UserMediaPermissionRequestManagerProxy::enumerateMediaDevicesForFrame(uint64_t userMediaID, uint64_t frameID, Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<SecurityOrigin>&& topLevelDocumentOrigin)
     355void UserMediaPermissionRequestManagerProxy::enumerateMediaDevicesForFrame(uint64_t userMediaID, uint64_t frameID, Ref<SecurityOrigin>&& userMediaDocumentOrigin, Ref<SecurityOrigin>&& topLevelDocumentOrigin)
    364356{
    365357#if ENABLE(MEDIA_STREAM)
     
    392384    // this is a noop if the preference hasn't changed since the last time this was called.
    393385    bool mockDevicesEnabled = m_page.preferences().mockCaptureDevicesEnabled();
    394     WebCore::MockRealtimeMediaSourceCenter::setMockRealtimeMediaSourceCenterEnabled(mockDevicesEnabled);
    395 #endif
    396 }
    397 
    398 void UserMediaPermissionRequestManagerProxy::captureStateChanged(WebCore::MediaProducer::MediaStateFlags oldState, WebCore::MediaProducer::MediaStateFlags newState)
     386    MockRealtimeMediaSourceCenter::setMockRealtimeMediaSourceCenterEnabled(mockDevicesEnabled);
     387#endif
     388}
     389
     390void UserMediaPermissionRequestManagerProxy::captureStateChanged(MediaProducer::MediaStateFlags oldState, MediaProducer::MediaStateFlags newState)
    399391{
    400392    if (!m_page.isValid())
     
    402394
    403395#if ENABLE(MEDIA_STREAM)
    404     bool wasCapturingAudio = oldState & WebCore::MediaProducer::AudioCaptureMask;
    405     bool wasCapturingVideo = oldState & WebCore::MediaProducer::VideoCaptureMask;
    406     bool isCapturingAudio = newState & WebCore::MediaProducer::AudioCaptureMask;
    407     bool isCapturingVideo = newState & WebCore::MediaProducer::VideoCaptureMask;
     396    bool wasCapturingAudio = oldState & MediaProducer::AudioCaptureMask;
     397    bool wasCapturingVideo = oldState & MediaProducer::VideoCaptureMask;
     398    bool isCapturingAudio = newState & MediaProducer::AudioCaptureMask;
     399    bool isCapturingVideo = newState & MediaProducer::VideoCaptureMask;
    408400
    409401    if ((wasCapturingAudio && !isCapturingAudio) || (wasCapturingVideo && !isCapturingVideo))
     
    411403    if ((!wasCapturingAudio && isCapturingAudio) || (!wasCapturingVideo && isCapturingVideo))
    412404        UserMediaProcessManager::singleton().startedCaptureSession(*this);
     405
     406    if (m_captureState == (newState & activeCaptureMask))
     407        return;
     408
     409    m_captureState = newState & activeCaptureMask;
     410
     411    Seconds interval;
     412    if (m_captureState & activeCaptureMask)
     413        interval = Seconds::fromHours(m_page.preferences().longRunningMediaCaptureStreamRepromptIntervalInHours());
     414    else
     415        interval = Seconds::fromMinutes(m_page.preferences().inactiveMediaCaptureSteamRepromptIntervalInMinutes());
     416
     417    if (interval == m_currentWatchdogInterval)
     418        return;
     419
     420    m_currentWatchdogInterval = interval;
     421    m_watchdogTimer.startOneShot(m_currentWatchdogInterval);
    413422#endif
    414423}
     
    421430}
    422431
     432void UserMediaPermissionRequestManagerProxy::watchdogTimerFired()
     433{
     434    m_grantedRequests.clear();
     435    m_pregrantedRequests.clear();
     436    m_currentWatchdogInterval = 0_s;
     437}
     438
    423439} // namespace WebKit
  • trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.h

    r219588 r223988  
    7676
    7777    void syncWithWebCorePrefs() const;
     78    void watchdogTimerFired();
    7879
    7980    HashMap<uint64_t, RefPtr<UserMediaPermissionRequestProxy>> m_pendingUserMediaRequests;
     
    9697    };
    9798    Vector<DeniedRequest> m_deniedRequests;
     99
     100    WebCore::MediaProducer::MediaStateFlags m_captureState { WebCore::MediaProducer::IsNotPlaying };
     101    RunLoop::Timer<UserMediaPermissionRequestManagerProxy> m_watchdogTimer;
     102    Seconds m_currentWatchdogInterval;
    98103};
    99104
  • trunk/Tools/ChangeLog

    r223987 r223988  
     12017-10-25  Eric Carlson  <eric.carlson@apple.com>
     2
     3        [MediaStream] Clear cached gUM prompt state
     4        https://bugs.webkit.org/show_bug.cgi?id=178754
     5        <rdar://problem/32742356>
     6
     7        Reviewed by Youenn Fablet.
     8
     9        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: Add new test
     10
     11        * TestWebKitAPI/Tests/WebKit/GetUserMediaReprompt.mm: Added.
     12        (-[GetUserMediaRepromptUIDelegate _webView:requestUserMediaAuthorizationForDevices:url:mainFrameURL:decisionHandler:]):
     13        (-[GetUserMediaRepromptUIDelegate _webView:checkUserMediaPermissionForURL:mainFrameURL:frameIdentifier:decisionHandler:]):
     14        (TestWebKitAPI::TEST):
     15
     16        * TestWebKitAPI/Tests/WebKit/getUserMedia.html:
     17
    1182017-10-25  Ross Kirsling  <ross.kirsling@sony.com>
    219
  • trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj

    r223625 r223988  
    3131                07C046CA1E4262A8007201E7 /* CARingBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07C046C91E42573E007201E7 /* CARingBuffer.cpp */; };
    3232                07CE1CF31F06A7E000BF89F5 /* GetUserMediaNavigation.mm in Sources */ = {isa = PBXBuildFile; fileRef = 07CE1CF21F06A7E000BF89F5 /* GetUserMediaNavigation.mm */; };
     33                07E499911F9E56DF002F1EF3 /* GetUserMediaReprompt.mm in Sources */ = {isa = PBXBuildFile; fileRef = 07E499901F9E56A1002F1EF3 /* GetUserMediaReprompt.mm */; };
    3334                0F139E771A423A5B00F590F5 /* WeakObjCPtr.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0F139E751A423A5300F590F5 /* WeakObjCPtr.mm */; };
    3435                0F139E781A423A6B00F590F5 /* PlatformUtilitiesCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0F139E721A423A2B00F590F5 /* PlatformUtilitiesCocoa.mm */; };
     
    10551056                07C046C91E42573E007201E7 /* CARingBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CARingBuffer.cpp; sourceTree = "<group>"; };
    10561057                07CE1CF21F06A7E000BF89F5 /* GetUserMediaNavigation.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = GetUserMediaNavigation.mm; sourceTree = "<group>"; };
     1058                07E499901F9E56A1002F1EF3 /* GetUserMediaReprompt.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = GetUserMediaReprompt.mm; sourceTree = "<group>"; };
    10571059                07EDEFAC1EB9400C00D43292 /* UserMediaDisabled.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UserMediaDisabled.mm; sourceTree = "<group>"; };
    10581060                0BCD833414857CE400EA2003 /* HashMap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HashMap.cpp; sourceTree = "<group>"; };
     
    24362438                        isa = PBXGroup;
    24372439                        children = (
     2440                                07E499901F9E56A1002F1EF3 /* GetUserMediaReprompt.mm */,
    24382441                                0F139E741A423A4600F590F5 /* cocoa */,
    24392442                                C0C5D3BB14598B6F00A802A6 /* mac */,
     
    32723275                                7CCE7EBC1A411A7E00447C4C /* DOMNodeFromJSObject.mm in Sources */,
    32733276                                7CCE7EBD1A411A7E00447C4C /* DOMRangeOfString.mm in Sources */,
     3277                                07E499911F9E56DF002F1EF3 /* GetUserMediaReprompt.mm in Sources */,
    32743278                                7CCE7EEC1A411AE600447C4C /* DOMWindowExtensionBasic.cpp in Sources */,
    32753279                                7CCE7EED1A411AE600447C4C /* DOMWindowExtensionNoCache.cpp in Sources */,
  • trunk/Tools/TestWebKitAPI/Tests/WebKit/getUserMedia.html

    r215413 r223988  
    1 <script>
    2     function gotUserMedia(mediaStream)
    3     {
    4         console.log("Got user media");
    5     }
     1<!DOCTYPE html>
     2<html>
     3    <head>
     4        <script>
    65
    7     function userMediaError(error)
    8     {
    9         console.log(error);
    10     }
     6            let stream = null;
    117
    12     var constraints = { audio: false, video: true};
    13     navigator.mediaDevices.getUserMedia(constraints)
    14         .then(gotUserMedia).
    15         catch(userMediaError);
    16 </script>
     8            function promptForCapture()
     9            {
     10                navigator.mediaDevices.getUserMedia({ audio: false, video: true })
     11                .then((s) => {
     12                      stream = s;
     13                      video.srcObject = stream;
     14                      console.log("Got user media");
     15                })
     16                .catch((error) => console.log(`Failed with error: ${error}`));
     17            }
     18
     19            function stop(kind)
     20            {
     21                let activeTracks = [];
     22                stream.getTracks().forEach(track => {
     23                    if (!kind || track.kind == kind)
     24                        track.stop();
     25                    else
     26                        activeTracks.push(track);
     27                });
     28
     29                if (!activeTracks.length) {
     30                    stream = null;
     31                    video.srcObject = null;
     32                }
     33            }
     34
     35            function haveStream()
     36            {
     37                return stream !== null;
     38            }
     39        </script>
     40    <head>
     41
     42    <body onload="promptForCapture()">
     43        <video id="video" controls></video>
     44        <p>
     45        <button onclick="stop()">Stop</button>
     46        </p>
     47    </body>
     48</html>
Note: See TracChangeset for help on using the changeset viewer.