Changeset 223988 in webkit
- Timestamp:
- Oct 25, 2017 3:15:05 PM (7 years ago)
- Location:
- trunk
- Files:
-
- 1 added
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r223984 r223988 1 2017-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 1 39 2017-10-25 Simon Fraser <simon.fraser@apple.com> 2 40 -
trunk/Source/WebKit/Shared/WebPreferences.yaml
r223903 r223988 823 823 webkitOnly: true 824 824 825 InactiveMediaCaptureSteamRepromptIntervalInMinutes: 826 type: double 827 defaultValue: DEFAULT_INTERACTIVE_MNEDIA_CAPTURE_STREAM_REPROMPT_INTERVAL_IN_MINUTES 828 829 LongRunningMediaCaptureStreamRepromptIntervalInHours: 830 type: double 831 defaultValue: 24 825 832 826 833 # Debug Preferences -
trunk/Source/WebKit/Shared/WebPreferencesDefinitionsBase.h
r223903 r223988 76 76 #define DEFAULT_REQUIRES_USER_GESTURE_FOR_AUDIO_PLAYBACK true 77 77 #define DEFAULT_LEGACY_ENCRYPTED_MEDIA_API_ENABLED false 78 #define DEFAULT_INTERACTIVE_MNEDIA_CAPTURE_STREAM_REPROMPT_INTERVAL_IN_MINUTES 1 78 79 #else 79 80 #define DEFAULT_ALLOWS_PICTURE_IN_PICTURE_MEDIA_PLAYBACK false … … 94 95 #define DEFAULT_REQUIRES_USER_GESTURE_FOR_AUDIO_PLAYBACK false 95 96 #define DEFAULT_LEGACY_ENCRYPTED_MEDIA_API_ENABLED true 97 #define DEFAULT_INTERACTIVE_MNEDIA_CAPTURE_STREAM_REPROMPT_INTERVAL_IN_MINUTES 10 96 98 #endif 97 99 -
trunk/Source/WebKit/UIProcess/API/C/WKPreferences.cpp
r223708 r223988 1651 1651 } 1652 1652 1653 void WKPreferencesSetInactiveMediaCaptureSteamRepromptIntervalInMinutes(WKPreferencesRef preferencesRef, double interval) 1654 { 1655 toImpl(preferencesRef)->setInactiveMediaCaptureSteamRepromptIntervalInMinutes(interval); 1656 } 1657 1658 double WKPreferencesGetInactiveMediaCaptureSteamRepromptIntervalInMinutes(WKPreferencesRef preferencesRef) 1659 { 1660 return toImpl(preferencesRef)->inactiveMediaCaptureSteamRepromptIntervalInMinutes(); 1661 } 1662 1653 1663 void WKPreferencesSetFetchAPIEnabled(WKPreferencesRef preferencesRef, bool flag) 1654 1664 { -
trunk/Source/WebKit/UIProcess/API/C/WKPreferencesRefPrivate.h
r223167 r223988 442 442 WK_EXPORT bool WKPreferencesGetMediaCaptureRequiresSecureConnection(WKPreferencesRef); 443 443 444 // Defaults to 1 minute on iOS, 10 minutes elsewhere 445 WK_EXPORT void WKPreferencesSetInactiveMediaCaptureSteamRepromptIntervalInMinutes(WKPreferencesRef, double); 446 WK_EXPORT double WKPreferencesGetInactiveMediaCaptureSteamRepromptIntervalInMinutes(WKPreferencesRef); 447 444 448 // Defaults to false 445 449 WK_EXPORT void WKPreferencesSetFetchAPIEnabled(WKPreferencesRef, bool flag); -
trunk/Source/WebKit/UIProcess/API/Cocoa/WKPreferences.mm
r223708 r223988 613 613 } 614 614 615 - (double)_inactiveMediaCaptureSteamRepromptIntervalInMinutes 616 { 617 return _preferences->inactiveMediaCaptureSteamRepromptIntervalInMinutes(); 618 } 619 620 - (void)_setInactiveMediaCaptureSteamRepromptIntervalInMinutes:(double)interval 621 { 622 _preferences->setInactiveMediaCaptureSteamRepromptIntervalInMinutes(interval); 623 } 624 615 625 - (BOOL)_enumeratingAllNetworkInterfacesEnabled 616 626 { -
trunk/Source/WebKit/UIProcess/API/Cocoa/WKPreferencesPrivate.h
r222715 r223988 111 111 @property (nonatomic, setter=_setICECandidateFilteringEnabled:) BOOL _iceCandidateFilteringEnabled WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA)); 112 112 @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)); 113 114 114 115 @property (nonatomic, setter=_setJavaScriptCanAccessClipboard:) BOOL _javaScriptCanAccessClipboard WK_API_AVAILABLE(macosx(10.13), ios(11.0)); -
trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp
r222503 r223988 35 35 #include <WebCore/UserMediaRequest.h> 36 36 37 #if ENABLE(MEDIA_STREAM) && USE(AVFOUNDATION)38 #include <WebCore/RealtimeMediaSourceCenterMac.h>39 #endif40 41 37 using namespace WebCore; 42 38 43 39 namespace WebKit { 40 41 static const MediaProducer::MediaStateFlags activeCaptureMask = MediaProducer::HasActiveAudioCaptureDevice | MediaProducer::HasActiveVideoCaptureDevice; 44 42 45 43 UserMediaPermissionRequestManagerProxy::UserMediaPermissionRequestManagerProxy(WebPageProxy& page) 46 44 : m_page(page) 47 45 , m_rejectionTimer(RunLoop::main(), this, &UserMediaPermissionRequestManagerProxy::rejectionTimerFired) 46 , m_watchdogTimer(RunLoop::main(), this, &UserMediaPermissionRequestManagerProxy::watchdogTimerFired) 48 47 { 49 48 #if ENABLE(MEDIA_STREAM) … … 82 81 } 83 82 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)83 Ref<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) 85 84 { 86 85 auto request = UserMediaPermissionRequestProxy::create(*this, userMediaID, mainFrameID, frameID, WTFMove(userMediaDocumentOrigin), WTFMove(topLevelDocumentOrigin), WTFMove(audioDeviceUIDs), WTFMove(videoDeviceUIDs), WTFMove(deviceIDHashSalt)); … … 95 94 case UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::NoConstraints: 96 95 return static_cast<uint64_t>(UserMediaRequest::MediaAccessDenialReason::NoConstraints); 97 break;98 96 case UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::UserMediaDisabled: 99 97 return static_cast<uint64_t>(UserMediaRequest::MediaAccessDenialReason::UserMediaDisabled); 100 break;101 98 case UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::NoCaptureDevices: 102 99 return static_cast<uint64_t>(UserMediaRequest::MediaAccessDenialReason::NoCaptureDevices); 103 break;104 100 case UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::InvalidConstraint: 105 101 return static_cast<uint64_t>(UserMediaRequest::MediaAccessDenialReason::InvalidConstraint); 106 break;107 102 case UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::HardwareError: 108 103 return static_cast<uint64_t>(UserMediaRequest::MediaAccessDenialReason::HardwareError); 109 break;110 104 case UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::PermissionDenied: 111 105 return static_cast<uint64_t>(UserMediaRequest::MediaAccessDenialReason::PermissionDenied); 112 break;113 106 case UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::OtherFailure: 114 107 return static_cast<uint64_t>(UserMediaRequest::MediaAccessDenialReason::OtherFailure); 115 break;116 108 } 117 109 … … 179 171 } 180 172 181 const UserMediaPermissionRequestProxy* UserMediaPermissionRequestManagerProxy::searchForGrantedRequest(uint64_t frameID, const WebCore::SecurityOrigin& userMediaDocumentOrigin, const WebCore::SecurityOrigin& topLevelDocumentOrigin, bool needsAudio, bool needsVideo) const173 const UserMediaPermissionRequestProxy* UserMediaPermissionRequestManagerProxy::searchForGrantedRequest(uint64_t frameID, const SecurityOrigin& userMediaDocumentOrigin, const SecurityOrigin& topLevelDocumentOrigin, bool needsAudio, bool needsVideo) const 182 174 { 183 175 if (m_page.isMediaStreamCaptureMuted()) … … 208 200 } 209 201 210 bool UserMediaPermissionRequestManagerProxy::wasRequestDenied(uint64_t mainFrameID, const WebCore::SecurityOrigin& userMediaDocumentOrigin, const WebCore::SecurityOrigin& topLevelDocumentOrigin, bool needsAudio, bool needsVideo)202 bool UserMediaPermissionRequestManagerProxy::wasRequestDenied(uint64_t mainFrameID, const SecurityOrigin& userMediaDocumentOrigin, const SecurityOrigin& topLevelDocumentOrigin, bool needsAudio, bool needsVideo) 211 203 { 212 204 for (const auto& deniedRequest : m_deniedRequests) { … … 254 246 } 255 247 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)248 void UserMediaPermissionRequestManagerProxy::requestUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, Ref<SecurityOrigin>&& userMediaDocumentOrigin, Ref<SecurityOrigin>&& topLevelDocumentOrigin, const MediaConstraints& audioConstraints, const MediaConstraints& videoConstraints) 257 249 { 258 250 #if ENABLE(MEDIA_STREAM) … … 263 255 } 264 256 265 WebCore::RealtimeMediaSourceCenter::InvalidConstraintsHandler invalidHandler = [this, userMediaID](const String& invalidConstraint) {257 RealtimeMediaSourceCenter::InvalidConstraintsHandler invalidHandler = [this, userMediaID](const String& invalidConstraint) { 266 258 if (!m_page.isValid()) 267 259 return; … … 270 262 }; 271 263 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 { 273 265 if (!m_page.isValid() || !m_page.mainFrame()) 274 266 return; … … 319 311 }; 320 312 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 { 322 314 323 315 auto request = m_pendingDeviceRequests.take(userMediaID); … … 348 340 349 341 #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)342 void UserMediaPermissionRequestManagerProxy::getUserMediaPermissionInfo(uint64_t userMediaID, uint64_t frameID, UserMediaPermissionCheckProxy::CompletionHandler&& handler, Ref<SecurityOrigin>&& userMediaDocumentOrigin, Ref<SecurityOrigin>&& topLevelDocumentOrigin) 351 343 { 352 344 auto userMediaOrigin = API::SecurityOrigin::create(userMediaDocumentOrigin.get()); … … 361 353 #endif 362 354 363 void UserMediaPermissionRequestManagerProxy::enumerateMediaDevicesForFrame(uint64_t userMediaID, uint64_t frameID, Ref< WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<SecurityOrigin>&& topLevelDocumentOrigin)355 void UserMediaPermissionRequestManagerProxy::enumerateMediaDevicesForFrame(uint64_t userMediaID, uint64_t frameID, Ref<SecurityOrigin>&& userMediaDocumentOrigin, Ref<SecurityOrigin>&& topLevelDocumentOrigin) 364 356 { 365 357 #if ENABLE(MEDIA_STREAM) … … 392 384 // this is a noop if the preference hasn't changed since the last time this was called. 393 385 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 390 void UserMediaPermissionRequestManagerProxy::captureStateChanged(MediaProducer::MediaStateFlags oldState, MediaProducer::MediaStateFlags newState) 399 391 { 400 392 if (!m_page.isValid()) … … 402 394 403 395 #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; 408 400 409 401 if ((wasCapturingAudio && !isCapturingAudio) || (wasCapturingVideo && !isCapturingVideo)) … … 411 403 if ((!wasCapturingAudio && isCapturingAudio) || (!wasCapturingVideo && isCapturingVideo)) 412 404 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); 413 422 #endif 414 423 } … … 421 430 } 422 431 432 void UserMediaPermissionRequestManagerProxy::watchdogTimerFired() 433 { 434 m_grantedRequests.clear(); 435 m_pregrantedRequests.clear(); 436 m_currentWatchdogInterval = 0_s; 437 } 438 423 439 } // namespace WebKit -
trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.h
r219588 r223988 76 76 77 77 void syncWithWebCorePrefs() const; 78 void watchdogTimerFired(); 78 79 79 80 HashMap<uint64_t, RefPtr<UserMediaPermissionRequestProxy>> m_pendingUserMediaRequests; … … 96 97 }; 97 98 Vector<DeniedRequest> m_deniedRequests; 99 100 WebCore::MediaProducer::MediaStateFlags m_captureState { WebCore::MediaProducer::IsNotPlaying }; 101 RunLoop::Timer<UserMediaPermissionRequestManagerProxy> m_watchdogTimer; 102 Seconds m_currentWatchdogInterval; 98 103 }; 99 104 -
trunk/Tools/ChangeLog
r223987 r223988 1 2017-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 1 18 2017-10-25 Ross Kirsling <ross.kirsling@sony.com> 2 19 -
trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj
r223625 r223988 31 31 07C046CA1E4262A8007201E7 /* CARingBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07C046C91E42573E007201E7 /* CARingBuffer.cpp */; }; 32 32 07CE1CF31F06A7E000BF89F5 /* GetUserMediaNavigation.mm in Sources */ = {isa = PBXBuildFile; fileRef = 07CE1CF21F06A7E000BF89F5 /* GetUserMediaNavigation.mm */; }; 33 07E499911F9E56DF002F1EF3 /* GetUserMediaReprompt.mm in Sources */ = {isa = PBXBuildFile; fileRef = 07E499901F9E56A1002F1EF3 /* GetUserMediaReprompt.mm */; }; 33 34 0F139E771A423A5B00F590F5 /* WeakObjCPtr.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0F139E751A423A5300F590F5 /* WeakObjCPtr.mm */; }; 34 35 0F139E781A423A6B00F590F5 /* PlatformUtilitiesCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0F139E721A423A2B00F590F5 /* PlatformUtilitiesCocoa.mm */; }; … … 1055 1056 07C046C91E42573E007201E7 /* CARingBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CARingBuffer.cpp; sourceTree = "<group>"; }; 1056 1057 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>"; }; 1057 1059 07EDEFAC1EB9400C00D43292 /* UserMediaDisabled.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UserMediaDisabled.mm; sourceTree = "<group>"; }; 1058 1060 0BCD833414857CE400EA2003 /* HashMap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HashMap.cpp; sourceTree = "<group>"; }; … … 2436 2438 isa = PBXGroup; 2437 2439 children = ( 2440 07E499901F9E56A1002F1EF3 /* GetUserMediaReprompt.mm */, 2438 2441 0F139E741A423A4600F590F5 /* cocoa */, 2439 2442 C0C5D3BB14598B6F00A802A6 /* mac */, … … 3272 3275 7CCE7EBC1A411A7E00447C4C /* DOMNodeFromJSObject.mm in Sources */, 3273 3276 7CCE7EBD1A411A7E00447C4C /* DOMRangeOfString.mm in Sources */, 3277 07E499911F9E56DF002F1EF3 /* GetUserMediaReprompt.mm in Sources */, 3274 3278 7CCE7EEC1A411AE600447C4C /* DOMWindowExtensionBasic.cpp in Sources */, 3275 3279 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> 6 5 7 function userMediaError(error) 8 { 9 console.log(error); 10 } 6 let stream = null; 11 7 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.