Changeset 248847 in webkit
- Timestamp:
- Aug 19, 2019 12:40:52 AM (5 years ago)
- Location:
- trunk
- Files:
-
- 4 deleted
- 29 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r248830 r248847 1 2019-08-19 Youenn Fablet <youenn@apple.com> 2 3 enumerateDevices should return the same JS objects if called twice 4 https://bugs.webkit.org/show_bug.cgi?id=200767 5 6 Reviewed by Eric Carlson. 7 8 * fast/mediastream/device-change-event-2.html: 9 1 10 2019-08-18 Cathie Chen <cathiechen@igalia.com> 2 11 -
trunk/LayoutTests/fast/mediastream/device-change-event-2.html
r238796 r248847 28 28 29 29 let devices = await navigator.mediaDevices.enumerateDevices(); 30 let devices2 = await navigator.mediaDevices.enumerateDevices(); 30 31 31 32 assert_true(!!devices.length, "check there are some devices"); 33 assert_array_equals(devices, devices2); 32 34 33 35 testRunner.clearMockMediaDevices(); 34 36 await new Promise((resolve, reject) => { 37 navigator.mediaDevices.ondevicechange = resolve; 38 setTimeout(() => { 39 reject("event 1 took too long"); 40 }, 5000); 41 }); 35 42 devices = await navigator.mediaDevices.enumerateDevices(); 36 43 assert_false(!!devices.length, "check there are no more devices"); 37 44 45 testRunner.addMockCameraDevice("id1", "my camera"); 38 46 await new Promise((resolve, reject) => { 39 47 navigator.mediaDevices.ondevicechange = resolve; 40 48 setTimeout(() => { 41 console.log("event 1 took too long"); 42 resolve(); 49 reject("event 2 took too long"); 43 50 }, 5000); 44 testRunner.addMockCameraDevice("id1", "my camera");45 51 }); 52 46 53 devices = await navigator.mediaDevices.enumerateDevices(); 47 54 assert_equals(devices[0].kind, "videoinput"); 48 55 assert_equals(devices[0].label, "my camera"); 49 56 57 testRunner.addMockMicrophoneDevice("id2", "my mic"); 50 58 await new Promise((resolve, reject) => { 51 59 navigator.mediaDevices.ondevicechange = resolve; 52 60 setTimeout(() => { 53 console.log("event 2 took too long"); 54 resolve(); 61 reject("event 3 took too long"); 55 62 }, 5000); 56 testRunner.addMockMicrophoneDevice("id2", "my mic");57 63 }); 58 64 devices = await navigator.mediaDevices.enumerateDevices(); -
trunk/Source/WebCore/ChangeLog
r248846 r248847 1 2019-08-19 Youenn Fablet <youenn@apple.com> 2 3 enumerateDevices should return the same JS objects if called twice 4 https://bugs.webkit.org/show_bug.cgi?id=200767 5 6 Reviewed by Eric Carlson. 7 8 Make MediaDevices store the last list of enumerated MediaDeviceInfo objects. 9 Reuse them for the next enumerateDevices call if needed. 10 In case of a device change event, make sure the next enumerateDevices call will fetch the new list of devices. 11 When constructing the new list of devices, reuse any preexisting device in the old list as specified by 12 https://w3c.github.io/mediacapture-main/#dom-mediadevices-enumeratedevices. 13 14 Update enumerateDevices to use a completion handler. 15 Remove MediaDevicesRequest and MediaDevicesEnumerationRequest. 16 Covered by updated test and existing tests. 17 18 * Modules/mediastream/MediaDeviceInfo.cpp: 19 (WebCore::MediaDeviceInfo::MediaDeviceInfo): 20 (WebCore::MediaDeviceInfo::create): 21 * Modules/mediastream/MediaDeviceInfo.h: 22 * Modules/mediastream/MediaDeviceInfo.idl: 23 * Modules/mediastream/MediaDevices.cpp: 24 (WebCore::MediaDevices::MediaDevices): 25 (WebCore::MediaDevices::stop): 26 (WebCore::MediaDevices::refreshDevices): 27 (WebCore::MediaDevices::enumerateDevices): 28 (WebCore::MediaDevices::scheduledEventTimerFired): 29 (WebCore::MediaDevices::listenForDeviceChanges): 30 (WebCore::MediaDevices::addEventListener): 31 * Modules/mediastream/MediaDevices.h: 32 * Modules/mediastream/MediaDevices.idl: 33 * Modules/mediastream/MediaDevicesEnumerationRequest.cpp: Removed. 34 * Modules/mediastream/MediaDevicesEnumerationRequest.h: Removed. 35 * Modules/mediastream/MediaDevicesRequest.cpp: Removed. 36 * Modules/mediastream/MediaDevicesRequest.h: Removed. 37 * Modules/mediastream/RTCRtpSender.cpp: 38 * Modules/mediastream/UserMediaClient.h: 39 * Modules/mediastream/UserMediaController.cpp: 40 (WebCore::isAllowedToUse): 41 (WebCore::UserMediaController::canCallGetUserMedia const): 42 * Modules/mediastream/UserMediaController.h: 43 (WebCore::UserMediaController::enumerateMediaDevices): 44 * Sources.txt: 45 * WebCore.xcodeproj/project.pbxproj: 46 1 47 2019-08-18 Yusuke Suzuki <ysuzuki@apple.com> 2 48 -
trunk/Source/WebCore/Headers.cmake
r248713 r248847 91 91 Modules/mediastream/DoubleRange.h 92 92 Modules/mediastream/LongRange.h 93 Modules/mediastream/MediaDevicesEnumerationRequest.h94 93 Modules/mediastream/MediaStreamTrack.h 95 94 Modules/mediastream/MediaTrackConstraints.h -
trunk/Source/WebCore/Modules/mediastream/MediaDeviceInfo.cpp
r243887 r248847 1 1 /* 2 * Copyright (C) 2015 Apple Inc. All rights reserved.2 * Copyright (C) 2015-2019 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 35 35 WTF_MAKE_ISO_ALLOCATED_IMPL(MediaDeviceInfo); 36 36 37 inline MediaDeviceInfo::MediaDeviceInfo(ScriptExecutionContext* context, const String& label, const String& deviceId, const String& groupId, Kind kind) 38 : ContextDestructionObserver(context) 39 , m_label(label) 37 Ref<MediaDeviceInfo> MediaDeviceInfo::create(const String& label, const String& deviceId, const String& groupId, Kind kind) 38 { 39 return adoptRef(*new MediaDeviceInfo(label, deviceId, groupId, kind)); 40 } 41 42 MediaDeviceInfo::MediaDeviceInfo(const String& label, const String& deviceId, const String& groupId, Kind kind) 43 : m_label(label) 40 44 , m_deviceId(deviceId) 41 45 , m_groupId(groupId) … … 44 48 } 45 49 46 Ref<MediaDeviceInfo> MediaDeviceInfo::create(ScriptExecutionContext* context, const String& label, const String& deviceId, const String& groupId, Kind kind)47 {48 return adoptRef(*new MediaDeviceInfo(context, label, deviceId, groupId, kind));49 }50 51 50 } // namespace WebCore 52 51 -
trunk/Source/WebCore/Modules/mediastream/MediaDeviceInfo.h
r243887 r248847 1 1 /* 2 * Copyright (C) 2015 Apple Inc. All rights reserved.2 * Copyright (C) 2015-2019 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 34 34 namespace WebCore { 35 35 36 class MediaDeviceInfo final : public RefCounted<MediaDeviceInfo>, public ScriptWrappable , private ContextDestructionObserver{36 class MediaDeviceInfo final : public RefCounted<MediaDeviceInfo>, public ScriptWrappable { 37 37 WTF_MAKE_ISO_ALLOCATED(MediaDeviceInfo); 38 38 public: 39 39 enum class Kind { Audioinput, Audiooutput, Videoinput }; 40 40 41 static Ref<MediaDeviceInfo> create( ScriptExecutionContext*,const String&, const String&, const String&, Kind);41 static Ref<MediaDeviceInfo> create(const String&, const String&, const String&, Kind); 42 42 43 43 const String& label() const { return m_label; } … … 47 47 48 48 private: 49 MediaDeviceInfo( ScriptExecutionContext*,const String&, const String&, const String&, Kind);49 MediaDeviceInfo(const String&, const String&, const String&, Kind); 50 50 51 51 const String m_label; -
trunk/Source/WebCore/Modules/mediastream/MediaDeviceInfo.idl
r218601 r248847 27 27 Conditional=MEDIA_STREAM, 28 28 JSGenerateToJSObject, 29 SkipVTableValidation, 29 30 ] interface MediaDeviceInfo { 30 31 readonly attribute DOMString deviceId; -
trunk/Source/WebCore/Modules/mediastream/MediaDevices.cpp
r246490 r248847 1 1 /* 2 2 * Copyright (C) 2015 Ericsson AB. All rights reserved. 3 * Copyright (C) 2015-201 8Apple Inc. All rights reserved.3 * Copyright (C) 2015-2019 Apple Inc. All rights reserved. 4 4 * 5 5 * Redistribution and use in source and binary forms, with or without … … 38 38 #include "Event.h" 39 39 #include "EventNames.h" 40 #include " MediaDevicesRequest.h"40 #include "JSMediaDeviceInfo.h" 41 41 #include "MediaTrackSupportedConstraints.h" 42 42 #include "RealtimeMediaSourceSettings.h" … … 62 62 static_assert(static_cast<size_t>(MediaDevices::DisplayCaptureSurfaceType::Application) == static_cast<size_t>(RealtimeMediaSourceSettings::DisplaySurfaceType::Application), "MediaDevices::DisplayCaptureSurfaceType::Application is not RealtimeMediaSourceSettings::DisplaySurfaceType::Application as expected"); 63 63 static_assert(static_cast<size_t>(MediaDevices::DisplayCaptureSurfaceType::Browser) == static_cast<size_t>(RealtimeMediaSourceSettings::DisplaySurfaceType::Browser), "MediaDevices::DisplayCaptureSurfaceType::Browser is not RealtimeMediaSourceSettings::DisplaySurfaceType::Browser as expected"); 64 65 if (auto* controller = UserMediaController::from(document.page())) { 66 m_canAccessCamera = controller->canCallGetUserMedia(document, { UserMediaController::CaptureType::Camera }) == UserMediaController::GetUserMediaAccess::CanCall; 67 m_canAccessMicrophone = controller->canCallGetUserMedia(document, { UserMediaController::CaptureType::Microphone }) == UserMediaController::GetUserMediaAccess::CanCall; 68 } 64 69 } 65 70 … … 74 79 controller->removeDeviceChangeObserver(m_deviceChangeToken); 75 80 } 81 m_devices.clear(); 76 82 } 77 83 … … 130 136 } 131 137 132 void MediaDevices::enumerateDevices(EnumerateDevicesPromise&& promise) const 138 void MediaDevices::refreshDevices(const Vector<CaptureDevice>& newDevices) 139 { 140 Vector<Ref<MediaDeviceInfo>> devices; 141 for (auto& newDevice : newDevices) { 142 if (!m_canAccessMicrophone && newDevice.type() == CaptureDevice::DeviceType::Microphone) 143 continue; 144 if (!m_canAccessCamera && newDevice.type() == CaptureDevice::DeviceType::Camera) 145 continue; 146 147 auto index = m_devices.findMatching([&newDevice](auto& oldDevice) { 148 return oldDevice->deviceId() == newDevice.persistentId(); 149 }); 150 if (index != notFound) { 151 devices.append(m_devices[index].copyRef()); 152 continue; 153 } 154 155 auto deviceType = newDevice.type() == CaptureDevice::DeviceType::Microphone ? MediaDeviceInfo::Kind::Audioinput : MediaDeviceInfo::Kind::Videoinput; 156 devices.append(MediaDeviceInfo::create(newDevice.label(), newDevice.persistentId(), newDevice.groupId(), deviceType)); 157 } 158 m_devices = WTFMove(devices); 159 } 160 161 void MediaDevices::enumerateDevices(EnumerateDevicesPromise&& promise) 133 162 { 134 163 auto* document = this->document(); 135 164 if (!document) 136 165 return; 137 MediaDevicesRequest::create(*document, WTFMove(promise))->start(); 166 167 auto* controller = UserMediaController::from(document->page()); 168 if (!controller) { 169 promise.resolve({ }); 170 return; 171 } 172 if (!m_canAccessCamera && !m_canAccessMicrophone) { 173 controller->logGetUserMediaDenial(*document, UserMediaController::GetUserMediaAccess::BlockedByFeaturePolicy, UserMediaController::BlockedCaller::EnumerateDevices); 174 promise.resolve({ }); 175 return; 176 } 177 178 controller->enumerateMediaDevices(*document, [this, weakThis = makeWeakPtr(this), promise = WTFMove(promise)](const auto& newDevices, const auto& deviceIDHashSalt) mutable { 179 if (!weakThis || isContextStopped()) 180 return; 181 182 this->document()->setDeviceIDHashSalt(deviceIDHashSalt); 183 refreshDevices(newDevices); 184 promise.resolve(m_devices); 185 }); 138 186 } 139 187 … … 159 207 void MediaDevices::scheduledEventTimerFired() 160 208 { 161 if (scriptExecutionContext()) 162 dispatchEvent(Event::create(eventNames().devicechangeEvent, Event::CanBubble::No, Event::IsCancelable::No)); 209 if (isContextStopped()) 210 return; 211 212 dispatchEvent(Event::create(eventNames().devicechangeEvent, Event::CanBubble::No, Event::IsCancelable::No)); 163 213 } 164 214 … … 178 228 } 179 229 230 void MediaDevices::listenForDeviceChanges() 231 { 232 if (m_listeningForDeviceChanges || (!m_canAccessCamera && !m_canAccessMicrophone)) 233 return; 234 235 m_listeningForDeviceChanges = true; 236 237 auto* document = this->document(); 238 auto* controller = document ? UserMediaController::from(document->page()) : nullptr; 239 if (!controller) 240 return; 241 242 m_deviceChangeToken = controller->addDeviceChangeObserver([weakThis = makeWeakPtr(*this), this]() { 243 if (!weakThis || m_scheduledEventTimer.isActive()) 244 return; 245 246 m_scheduledEventTimer.startOneShot(Seconds(randomNumber() / 2)); 247 }); 248 } 249 180 250 bool MediaDevices::addEventListener(const AtomString& eventType, Ref<EventListener>&& listener, const AddEventListenerOptions& options) 181 251 { 182 if (!m_listeningForDeviceChanges && eventType == eventNames().devicechangeEvent) { 183 auto* document = this->document(); 184 auto* controller = document ? UserMediaController::from(document->page()) : nullptr; 185 if (document && controller) { 186 m_listeningForDeviceChanges = true; 187 188 m_deviceChangeToken = controller->addDeviceChangeObserver([weakThis = makeWeakPtr(*this), this]() { 189 190 if (!weakThis || m_scheduledEventTimer.isActive()) 191 return; 192 193 auto* document = this->document(); 194 auto* controller = document ? UserMediaController::from(document->page()) : nullptr; 195 if (!controller) 196 return; 197 198 bool canAccessMicrophone = controller->canCallGetUserMedia(*document, { UserMediaController::CaptureType::Microphone }) == UserMediaController::GetUserMediaAccess::CanCall; 199 bool canAccessCamera = controller->canCallGetUserMedia(*document, { UserMediaController::CaptureType::Camera }) == UserMediaController::GetUserMediaAccess::CanCall; 200 if (!canAccessMicrophone && !canAccessCamera) 201 return; 202 203 m_scheduledEventTimer.startOneShot(Seconds(randomNumber() / 2)); 204 }); 205 } 206 } 252 if (eventType == eventNames().devicechangeEvent) 253 listenForDeviceChanges(); 207 254 208 255 return EventTargetWithInlineData::addEventListener(eventType, WTFMove(listener), options); -
trunk/Source/WebCore/Modules/mediastream/MediaDevices.h
r246490 r248847 78 78 void getUserMedia(const StreamConstraints&, Promise&&) const; 79 79 void getDisplayMedia(const StreamConstraints&, Promise&&) const; 80 void enumerateDevices(EnumerateDevicesPromise&&) const;80 void enumerateDevices(EnumerateDevicesPromise&&); 81 81 MediaTrackSupportedConstraints getSupportedConstraints(); 82 82 … … 91 91 void scheduledEventTimerFired(); 92 92 bool addEventListener(const AtomString& eventType, Ref<EventListener>&&, const AddEventListenerOptions&) override; 93 94 void refreshDevices(const Vector<CaptureDevice>&); 95 void listenForDeviceChanges(); 93 96 94 97 friend class JSMediaDevicesOwner; … … 111 114 bool m_listeningForDeviceChanges { false }; 112 115 bool m_disableGetDisplayMediaUserGestureConstraint { false }; 116 117 Vector<Ref<MediaDeviceInfo>> m_devices; 118 bool m_canAccessCamera { false }; 119 bool m_canAccessMicrophone { false }; 113 120 }; 114 121 -
trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp
r248282 r248847 37 37 #include "RTCDTMFSenderBackend.h" 38 38 #include "RTCRtpCapabilities.h" 39 #include "RTCRtpTransceiver.h" 39 40 #include "RuntimeEnabledFeatures.h" 40 41 #include <wtf/IsoMallocInlines.h> -
trunk/Source/WebCore/Modules/mediastream/UserMediaClient.h
r235086 r248847 34 34 #if ENABLE(MEDIA_STREAM) 35 35 36 #include <wtf/CompletionHandler.h> 36 37 #include <wtf/ObjectIdentifier.h> 37 38 38 39 namespace WebCore { 39 40 40 class MediaDevicesEnumerationRequest;41 class CaptureDevice; 41 42 class Page; 42 43 class UserMediaRequest; … … 49 50 virtual void cancelUserMediaAccessRequest(UserMediaRequest&) = 0; 50 51 51 virtual void enumerateMediaDevices(MediaDevicesEnumerationRequest&) = 0; 52 virtual void cancelMediaDevicesEnumerationRequest(MediaDevicesEnumerationRequest&) = 0; 52 virtual void enumerateMediaDevices(Document&, CompletionHandler<void(const Vector<CaptureDevice>&, const String&)>&&) = 0; 53 53 54 54 enum DeviceChangeObserverTokenType { }; -
trunk/Source/WebCore/Modules/mediastream/UserMediaController.cpp
r248846 r248847 86 86 } 87 87 88 static UserMediaController::GetUserMediaAccess isAllowedToUse( Document& document,Document& topDocument, OptionSet<UserMediaController::CaptureType> types)88 static UserMediaController::GetUserMediaAccess isAllowedToUse(const Document& document, const Document& topDocument, OptionSet<UserMediaController::CaptureType> types) 89 89 { 90 90 if (&document == &topDocument) … … 107 107 } 108 108 109 UserMediaController::GetUserMediaAccess UserMediaController::canCallGetUserMedia( Document& document, OptionSet<UserMediaController::CaptureType> types)109 UserMediaController::GetUserMediaAccess UserMediaController::canCallGetUserMedia(const Document& document, OptionSet<UserMediaController::CaptureType> types) const 110 110 { 111 111 ASSERT(!types.isEmpty()); -
trunk/Source/WebCore/Modules/mediastream/UserMediaController.h
r238091 r248847 30 30 #include "Page.h" 31 31 #include "UserMediaClient.h" 32 #include <wtf/CompletionHandler.h> 32 33 33 34 namespace WebCore { … … 46 47 void cancelUserMediaAccessRequest(UserMediaRequest&); 47 48 48 void enumerateMediaDevices(MediaDevicesEnumerationRequest&); 49 void cancelMediaDevicesEnumerationRequest(MediaDevicesEnumerationRequest&); 49 void enumerateMediaDevices(Document&, CompletionHandler<void(const Vector<CaptureDevice>&, const String&)>&&); 50 50 51 51 UserMediaClient::DeviceChangeObserverToken addDeviceChangeObserver(WTF::Function<void()>&&); … … 64 64 Display = 1 << 3 65 65 }; 66 GetUserMediaAccess canCallGetUserMedia( Document&, OptionSet<CaptureType>);66 GetUserMediaAccess canCallGetUserMedia(const Document&, OptionSet<CaptureType>) const; 67 67 68 68 enum class BlockedCaller { … … 90 90 } 91 91 92 inline void UserMediaController::enumerateMediaDevices( MediaDevicesEnumerationRequest& request)92 inline void UserMediaController::enumerateMediaDevices(Document& document, CompletionHandler<void(const Vector<CaptureDevice>&, const String&)>&& completionHandler) 93 93 { 94 m_client->enumerateMediaDevices( request);94 m_client->enumerateMediaDevices(document, WTFMove(completionHandler)); 95 95 } 96 96 97 inline void UserMediaController::cancelMediaDevicesEnumerationRequest(MediaDevicesEnumerationRequest& request)98 {99 m_client->cancelMediaDevicesEnumerationRequest(request);100 }101 97 102 98 inline UserMediaClient::DeviceChangeObserverToken UserMediaController::addDeviceChangeObserver(WTF::Function<void()>&& observer) -
trunk/Source/WebCore/Modules/webgpu/WebGPUDevice.cpp
r248606 r248847 37 37 #include "GPUBufferDescriptor.h" 38 38 #include "GPUCommandBuffer.h" 39 #include "GPUComputePipelineDescriptor.h" 39 40 #include "GPUPipelineStageDescriptor.h" 40 41 #include "GPURenderPipelineDescriptor.h" -
trunk/Source/WebCore/Sources.txt
r248751 r248847 161 161 Modules/mediastream/MediaDeviceInfo.cpp 162 162 Modules/mediastream/MediaDevices.cpp 163 Modules/mediastream/MediaDevicesEnumerationRequest.cpp164 Modules/mediastream/MediaDevicesRequest.cpp165 163 Modules/mediastream/MediaStream.cpp 166 164 Modules/mediastream/MediaStreamTrack.cpp -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r248751 r248847 122 122 073794FA19F5864E00E5A045 /* RTCDataChannelHandlerMock.h in Headers */ = {isa = PBXBuildFile; fileRef = 073794F419F5864E00E5A045 /* RTCDataChannelHandlerMock.h */; }; 123 123 073794FE19F5864E00E5A045 /* RTCNotifiersMock.h in Headers */ = {isa = PBXBuildFile; fileRef = 073794F819F5864E00E5A045 /* RTCNotifiersMock.h */; }; 124 07394ECA1BAB2CD700BE99CD /* MediaDevicesRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 07394EC91BAB2CD700BE99CD /* MediaDevicesRequest.h */; settings = {ATTRIBUTES = (Private, ); }; };125 124 073A15542177A42600EA08F2 /* RemoteVideoSample.h in Headers */ = {isa = PBXBuildFile; fileRef = 073A15532177A39A00EA08F2 /* RemoteVideoSample.h */; settings = {ATTRIBUTES = (Private, ); }; }; 126 125 073B87671E4385AC0071C0EC /* AudioSampleBufferList.h in Headers */ = {isa = PBXBuildFile; fileRef = 073B87631E43859D0071C0EC /* AudioSampleBufferList.h */; }; … … 197 196 07AB996918DA3C010018771E /* RTCConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 07AB996518DA3C010018771E /* RTCConfiguration.h */; }; 198 197 07AB996B18DA3C010018771E /* RTCIceServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 07AB996718DA3C010018771E /* RTCIceServer.h */; }; 199 07ABEF6E1D8A1C7600F21972 /* MediaDevicesEnumerationRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 07ABEF6D1D8A1C7600F21972 /* MediaDevicesEnumerationRequest.h */; settings = {ATTRIBUTES = (Private, ); }; };200 198 07AFF4221EFB144900B545B3 /* CoreAudioCaptureSourceIOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 07AFF4201EFB144700B545B3 /* CoreAudioCaptureSourceIOS.h */; }; 201 199 07AFF4231EFB144900B545B3 /* CoreAudioCaptureSourceIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 07AFF4211EFB144700B545B3 /* CoreAudioCaptureSourceIOS.mm */; }; … … 5352 5350 073794F719F5864E00E5A045 /* RTCNotifiersMock.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RTCNotifiersMock.cpp; sourceTree = "<group>"; }; 5353 5351 073794F819F5864E00E5A045 /* RTCNotifiersMock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCNotifiersMock.h; sourceTree = "<group>"; }; 5354 07394EC71BAB2CCD00BE99CD /* MediaDevicesRequest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaDevicesRequest.cpp; sourceTree = "<group>"; };5355 07394EC91BAB2CD700BE99CD /* MediaDevicesRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaDevicesRequest.h; sourceTree = "<group>"; };5356 5352 073A15512177A39800EA08F2 /* RemoteVideoSample.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = RemoteVideoSample.cpp; sourceTree = "<group>"; }; 5357 5353 073A15532177A39A00EA08F2 /* RemoteVideoSample.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RemoteVideoSample.h; sourceTree = "<group>"; }; … … 5445 5441 07AB996718DA3C010018771E /* RTCIceServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCIceServer.h; sourceTree = "<group>"; }; 5446 5442 07AB996818DA3C010018771E /* RTCIceServer.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = RTCIceServer.idl; sourceTree = "<group>"; }; 5447 07ABEF6B1D8A1C5800F21972 /* MediaDevicesEnumerationRequest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaDevicesEnumerationRequest.cpp; sourceTree = "<group>"; };5448 07ABEF6D1D8A1C7600F21972 /* MediaDevicesEnumerationRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaDevicesEnumerationRequest.h; sourceTree = "<group>"; };5449 5443 07AFF4201EFB144700B545B3 /* CoreAudioCaptureSourceIOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CoreAudioCaptureSourceIOS.h; sourceTree = "<group>"; }; 5450 5444 07AFF4211EFB144700B545B3 /* CoreAudioCaptureSourceIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CoreAudioCaptureSourceIOS.mm; sourceTree = "<group>"; }; … … 15674 15668 5EA725CE1ACABCD900EAD17B /* MediaDevices.h */, 15675 15669 5EA725CF1ACABCD900EAD17B /* MediaDevices.idl */, 15676 07ABEF6B1D8A1C5800F21972 /* MediaDevicesEnumerationRequest.cpp */,15677 07ABEF6D1D8A1C7600F21972 /* MediaDevicesEnumerationRequest.h */,15678 07394EC71BAB2CCD00BE99CD /* MediaDevicesRequest.cpp */,15679 07394EC91BAB2CD700BE99CD /* MediaDevicesRequest.h */,15680 15670 07221B4C17CEC32700848E51 /* MediaStream.cpp */, 15681 15671 07221B4D17CEC32700848E51 /* MediaStream.h */, … … 30675 30665 15145B901B3A1CE000662BF7 /* MediaDeviceInfo.h in Headers */, 30676 30666 5EA725D31ACABD4700EAD17B /* MediaDevices.h in Headers */, 30677 07ABEF6E1D8A1C7600F21972 /* MediaDevicesEnumerationRequest.h in Headers */,30678 07394ECA1BAB2CD700BE99CD /* MediaDevicesRequest.h in Headers */,30679 30667 97205AB81239291000B17380 /* MediaDocument.h in Headers */, 30680 30668 FD6F252D13F5EF0E0065165F /* MediaElementAudioSourceNode.h in Headers */, -
trunk/Source/WebKit/ChangeLog
r248846 r248847 1 2019-08-19 Youenn Fablet <youenn@apple.com> 2 3 enumerateDevices should return the same JS objects if called twice 4 https://bugs.webkit.org/show_bug.cgi?id=200767 5 6 Reviewed by Eric Carlson. 7 8 Update code as enumerate device request is now gone. 9 Make use of async IPC to simplify code since we are now passing a completion handler directly. 10 11 * UIProcess/UserMediaPermissionRequestManagerProxy.cpp: 12 (WebKit::UserMediaPermissionRequestManagerProxy::captureDevicesChanged): 13 (WebKit::UserMediaPermissionRequestManagerProxy::finishGrantingRequest): 14 (WebKit::UserMediaPermissionRequestManagerProxy::enumerateMediaDevicesForFrame): 15 * UIProcess/UserMediaPermissionRequestManagerProxy.h: 16 * UIProcess/WebPageProxy.cpp: 17 (WebKit::WebPageProxy::maybeInitializeSandboxExtensionHandle): 18 * UIProcess/WebPageProxy.h: 19 * UIProcess/WebPageProxy.messages.in: 20 * WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp: 21 (WebKit::UserMediaPermissionRequestManager::enumerateMediaDevices): 22 * WebProcess/MediaStream/UserMediaPermissionRequestManager.h: 23 * WebProcess/WebCoreSupport/WebUserMediaClient.cpp: 24 (WebKit::WebUserMediaClient::enumerateMediaDevices): 25 * WebProcess/WebCoreSupport/WebUserMediaClient.h: 26 * WebProcess/WebPage/WebPage.cpp: 27 * WebProcess/WebPage/WebPage.h: 28 * WebProcess/WebPage/WebPage.messages.in: 29 1 30 2019-08-18 Yusuke Suzuki <ysuzuki@apple.com> 2 31 -
trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp
r248713 r248847 39 39 #include <WebCore/SecurityOriginData.h> 40 40 #include <WebCore/UserMediaRequest.h> 41 #include <wtf/Scope.h> 41 42 42 43 namespace WebKit { … … 122 123 return; 123 124 124 auto handler = [this](PermissionInfo permissionInfo) mutable {125 switch (permissionInfo) {126 case PermissionInfo::Error:127 return;128 case PermissionInfo::Unknown:129 if (m_grantedRequests.isEmpty())130 return;131 break;132 case PermissionInfo::Granted:133 break;134 }135 if (!m_page.hasRunningProcess())136 return;137 138 m_page.process().send(Messages::WebPage::CaptureDevicesChanged(), m_page.pageID());139 };140 141 125 auto origin = WebCore::SecurityOrigin::create(m_page.mainFrame()->url()); 142 getUserMediaPermissionInfo(m_page.mainFrame()->frameID(), origin.get(), WTFMove(origin), WTFMove(handler)); 143 #endif 144 } 126 getUserMediaPermissionInfo(m_page.mainFrame()->frameID(), origin.get(), WTFMove(origin), [this](PermissionInfo permissionInfo) { 127 captureDevicesChanged(permissionInfo); 128 }); 129 #endif 130 } 131 132 #if ENABLE(MEDIA_STREAM) 133 void UserMediaPermissionRequestManagerProxy::captureDevicesChanged(PermissionInfo permissionInfo) 134 { 135 switch (permissionInfo) { 136 case PermissionInfo::Error: 137 return; 138 case PermissionInfo::Unknown: 139 if (m_grantedRequests.isEmpty()) 140 return; 141 break; 142 case PermissionInfo::Granted: 143 break; 144 } 145 if (!m_page.hasRunningProcess()) 146 return; 147 148 m_page.process().send(Messages::WebPage::CaptureDevicesChanged(), m_page.pageID()); 149 } 150 #endif 145 151 146 152 void UserMediaPermissionRequestManagerProxy::clearCachedState() … … 227 233 m_grantedRequests.append(makeRef(request)); 228 234 235 // FIXME: m_hasFilteredDeviceList will trigger ondevicechange events for various documents from different origins. 229 236 if (m_hasFilteredDeviceList) 230 captureDevicesChanged( );237 captureDevicesChanged(PermissionInfo::Granted); 231 238 m_hasFilteredDeviceList = false; 232 239 … … 605 612 #endif 606 613 607 void UserMediaPermissionRequestManagerProxy::enumerateMediaDevicesForFrame(uint64_t userMediaID, FrameIdentifier frameID, Ref<SecurityOrigin>&& userMediaDocumentOrigin, Ref<SecurityOrigin>&& topLevelDocumentOrigin) 608 { 609 #if ENABLE(MEDIA_STREAM) 610 ALWAYS_LOG(LOGIDENTIFIER, userMediaID); 611 612 auto completionHandler = [this, userMediaID, frameID, userMediaDocumentOrigin = userMediaDocumentOrigin.copyRef(), topLevelDocumentOrigin = topLevelDocumentOrigin.copyRef()](PermissionInfo permissionInfo) mutable { 614 void UserMediaPermissionRequestManagerProxy::enumerateMediaDevicesForFrame(FrameIdentifier frameID, Ref<SecurityOrigin>&& userMediaDocumentOrigin, Ref<SecurityOrigin>&& topLevelDocumentOrigin, CompletionHandler<void(const Vector<CaptureDevice>&, const String&)>&& completionHandler) 615 { 616 #if ENABLE(MEDIA_STREAM) 617 ALWAYS_LOG(LOGIDENTIFIER); 618 619 auto callback = [this, frameID, userMediaDocumentOrigin = userMediaDocumentOrigin.copyRef(), topLevelDocumentOrigin = topLevelDocumentOrigin.copyRef(), completionHandler = WTFMove(completionHandler)](PermissionInfo permissionInfo) mutable { 620 auto callCompletionHandler = makeScopeExit([&completionHandler] { 621 completionHandler({ }, { }); 622 }); 613 623 614 624 bool originHasPersistentAccess; … … 632 642 auto& requestOrigin = userMediaDocumentOrigin.get(); 633 643 auto& topOrigin = topLevelDocumentOrigin.get(); 634 m_page.websiteDataStore().deviceIdHashSaltStorage().deviceIdHashSaltForOrigin(requestOrigin, topOrigin, [this, weakThis = makeWeakPtr(*this), requestID, frameID, userMediaID, userMediaDocumentOrigin = WTFMove(userMediaDocumentOrigin), topLevelDocumentOrigin = WTFMove(topLevelDocumentOrigin), originHasPersistentAccess] (String&& deviceIDHashSalt) { 644 645 callCompletionHandler.release(); 646 m_page.websiteDataStore().deviceIdHashSaltStorage().deviceIdHashSaltForOrigin(requestOrigin, topOrigin, [this, weakThis = makeWeakPtr(*this), requestID, frameID, userMediaDocumentOrigin = WTFMove(userMediaDocumentOrigin), topLevelDocumentOrigin = WTFMove(topLevelDocumentOrigin), originHasPersistentAccess, completionHandler = WTFMove(completionHandler)](String&& deviceIDHashSalt) mutable { 647 auto callCompletionHandler = makeScopeExit([&completionHandler] { 648 completionHandler({ }, { }); 649 }); 650 635 651 if (!weakThis || !m_pendingDeviceRequests.remove(requestID)) 636 652 return; … … 643 659 bool revealIdsAndLabels = originHasPersistentAccess || wasGrantedVideoOrAudioAccess(frameID, userMediaDocumentOrigin.get(), topLevelDocumentOrigin.get()); 644 660 645 m_page.process().send(Messages::WebPage::DidCompleteMediaDeviceEnumeration { userMediaID, computeFilteredDeviceList(revealIdsAndLabels, deviceIDHashSalt), deviceIDHashSalt, originHasPersistentAccess }, m_page.pageID()); 661 callCompletionHandler.release(); 662 completionHandler(computeFilteredDeviceList(revealIdsAndLabels, deviceIDHashSalt), deviceIDHashSalt); 646 663 }); 647 664 }; 648 665 649 getUserMediaPermissionInfo(frameID, WTFMove(userMediaDocumentOrigin), WTFMove(topLevelDocumentOrigin), WTFMove(c ompletionHandler));666 getUserMediaPermissionInfo(frameID, WTFMove(userMediaDocumentOrigin), WTFMove(topLevelDocumentOrigin), WTFMove(callback)); 650 667 #else 651 UNUSED_PARAM(userMediaID);652 668 UNUSED_PARAM(frameID); 653 669 UNUSED_PARAM(userMediaDocumentOrigin); 654 670 UNUSED_PARAM(topLevelDocumentOrigin); 671 completionHandler({ }, { }); 655 672 #endif 656 673 } -
trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.h
r248762 r248847 70 70 void denyRequest(UserMediaPermissionRequestProxy&, UserMediaPermissionRequestProxy::UserMediaAccessDenialReason, const String& invalidConstraint = { }); 71 71 72 void enumerateMediaDevicesForFrame( uint64_t userMediaID, WebCore::FrameIdentifier, Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin);72 void enumerateMediaDevicesForFrame(WebCore::FrameIdentifier, Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin, CompletionHandler<void(const Vector<WebCore::CaptureDevice>&, const String&)>&&); 73 73 74 74 void stopCapture(); … … 106 106 using PermissionInfo = UserMediaPermissionCheckProxy::PermissionInfo; 107 107 void getUserMediaPermissionInfo(WebCore::FrameIdentifier, Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin, CompletionHandler<void(PermissionInfo)>&&); 108 void captureDevicesChanged(PermissionInfo); 108 109 109 110 RequestAction getRequestAction(const UserMediaPermissionRequestProxy&); -
trunk/Source/WebKit/UIProcess/WebPageProxy.cpp
r248846 r248847 7463 7463 } 7464 7464 7465 void WebPageProxy::enumerateMediaDevicesForFrame( uint64_t userMediaID, FrameIdentifier frameID, const WebCore::SecurityOriginData& userMediaDocumentOriginData, const WebCore::SecurityOriginData& topLevelDocumentOriginData)7465 void WebPageProxy::enumerateMediaDevicesForFrame(FrameIdentifier frameID, const WebCore::SecurityOriginData& userMediaDocumentOriginData, const WebCore::SecurityOriginData& topLevelDocumentOriginData, CompletionHandler<void(const Vector<CaptureDevice>&, const String&)>&& completionHandler) 7466 7466 { 7467 7467 #if ENABLE(MEDIA_STREAM) … … 7469 7469 MESSAGE_CHECK(m_process, frame); 7470 7470 7471 userMediaPermissionRequestManager().enumerateMediaDevicesForFrame( userMediaID, frameID, userMediaDocumentOriginData.securityOrigin(), topLevelDocumentOriginData.securityOrigin());7471 userMediaPermissionRequestManager().enumerateMediaDevicesForFrame(frameID, userMediaDocumentOriginData.securityOrigin(), topLevelDocumentOriginData.securityOrigin(), WTFMove(completionHandler)); 7472 7472 #else 7473 7473 UNUSED_PARAM(userMediaID); -
trunk/Source/WebKit/UIProcess/WebPageProxy.h
r248762 r248847 1715 1715 #endif 1716 1716 void requestUserMediaPermissionForFrame(uint64_t userMediaID, WebCore::FrameIdentifier, const WebCore::SecurityOriginData& userMediaDocumentOriginIdentifier, const WebCore::SecurityOriginData& topLevelDocumentOriginIdentifier, WebCore::MediaStreamRequest&&); 1717 void enumerateMediaDevicesForFrame( uint64_t userMediaID, WebCore::FrameIdentifier, const WebCore::SecurityOriginData& userMediaDocumentOriginData, const WebCore::SecurityOriginData& topLevelDocumentOriginData);1717 void enumerateMediaDevicesForFrame(WebCore::FrameIdentifier, const WebCore::SecurityOriginData& userMediaDocumentOriginData, const WebCore::SecurityOriginData& topLevelDocumentOriginData, CompletionHandler<void(const Vector<WebCore::CaptureDevice>&, const String&)>&&); 1718 1718 void beginMonitoringCaptureDevices(); 1719 1719 -
trunk/Source/WebKit/UIProcess/WebPageProxy.messages.in
r248713 r248847 283 283 # Geolocation messages 284 284 RequestGeolocationPermissionForFrame(uint64_t geolocationID, WebCore::FrameIdentifier frameID, String originIdentifier) 285 285 286 286 #if ENABLE(MEDIA_STREAM) 287 287 # MediaSteam messages 288 288 RequestUserMediaPermissionForFrame(uint64_t userMediaID, WebCore::FrameIdentifier frameID, struct WebCore::SecurityOriginData userMediaDocumentOriginIdentifier, struct WebCore::SecurityOriginData topLevelDocumentOriginIdentifier, struct WebCore::MediaStreamRequest request) 289 EnumerateMediaDevicesForFrame( uint64_t userMediaID, WebCore::FrameIdentifier frameID, struct WebCore::SecurityOriginData userMediaDocumentOriginIdentifier, struct WebCore::SecurityOriginData topLevelDocumentOriginIdentifier)289 EnumerateMediaDevicesForFrame(WebCore::FrameIdentifier frameID, struct WebCore::SecurityOriginData userMediaDocumentOriginIdentifier, struct WebCore::SecurityOriginData topLevelDocumentOriginIdentifier) -> (Vector<WebCore::CaptureDevice> devices, String mediaDeviceIdentifierHashSalt) Async 290 290 BeginMonitoringCaptureDevices() 291 291 #endif … … 299 299 300 300 # Spelling and grammar messages 301 #if USE(UNIFIED_TEXT_CHECKING) 301 #if USE(UNIFIED_TEXT_CHECKING) 302 302 CheckTextOfParagraph(String text, OptionSet<WebCore::TextCheckingType> checkingTypes, int32_t insertionPoint) -> (Vector<WebCore::TextCheckingResult> results) Synchronous 303 303 #endif -
trunk/Source/WebKit/WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp
r245625 r248847 160 160 } 161 161 162 void UserMediaPermissionRequestManager::enumerateMediaDevices(MediaDevicesEnumerationRequest& request) 163 { 164 auto* document = downcast<Document>(request.scriptExecutionContext()); 165 auto* frame = document ? document->frame() : nullptr; 166 162 void UserMediaPermissionRequestManager::enumerateMediaDevices(Document& document, CompletionHandler<void(const Vector<CaptureDevice>&, const String&)>&& completionHandler) 163 { 164 auto* frame = document.frame(); 167 165 if (!frame) { 168 request.setDeviceInfo(Vector<CaptureDevice>(), emptyString(), false); 169 return; 170 } 171 172 uint64_t requestID = generateRequestID(); 173 m_idToMediaDevicesEnumerationRequestMap.add(requestID, &request); 174 m_mediaDevicesEnumerationRequestToIDMap.add(&request, requestID); 175 176 WebFrame* webFrame = WebFrame::fromCoreFrame(*frame); 177 ASSERT(webFrame); 178 179 SecurityOrigin* topLevelDocumentOrigin = request.topLevelDocumentOrigin(); 180 ASSERT(topLevelDocumentOrigin); 181 m_page.send(Messages::WebPageProxy::EnumerateMediaDevicesForFrame(requestID, webFrame->frameID(), request.userMediaDocumentOrigin()->data(), topLevelDocumentOrigin->data())); 182 } 183 184 void UserMediaPermissionRequestManager::cancelMediaDevicesEnumeration(WebCore::MediaDevicesEnumerationRequest& request) 185 { 186 uint64_t requestID = m_mediaDevicesEnumerationRequestToIDMap.take(&request); 187 if (!requestID) 188 return; 189 request.setDeviceInfo(Vector<CaptureDevice>(), emptyString(), false); 190 m_idToMediaDevicesEnumerationRequestMap.remove(requestID); 191 } 192 193 void UserMediaPermissionRequestManager::didCompleteMediaDeviceEnumeration(uint64_t requestID, const Vector<CaptureDevice>& deviceList, String&& mediaDeviceIdentifierHashSalt, bool hasPersistentAccess) 194 { 195 RefPtr<MediaDevicesEnumerationRequest> request = m_idToMediaDevicesEnumerationRequestMap.take(requestID); 196 if (!request) 197 return; 198 m_mediaDevicesEnumerationRequestToIDMap.remove(request); 199 200 request->setDeviceInfo(deviceList, WTFMove(mediaDeviceIdentifierHashSalt), hasPersistentAccess); 166 completionHandler({ }, emptyString()); 167 return; 168 } 169 170 m_page.sendWithAsyncReply(Messages::WebPageProxy::EnumerateMediaDevicesForFrame { WebFrame::fromCoreFrame(*frame)->frameID(), document.securityOrigin().data(), document.topOrigin().data() }, WTFMove(completionHandler)); 201 171 } 202 172 -
trunk/Source/WebKit/WebProcess/MediaStream/UserMediaPermissionRequestManager.h
r248762 r248847 25 25 #include <WebCore/MediaCanStartListener.h> 26 26 #include <WebCore/MediaConstraints.h> 27 #include <WebCore/MediaDevicesEnumerationRequest.h>28 27 #include <WebCore/UserMediaClient.h> 29 28 #include <WebCore/UserMediaRequest.h> … … 47 46 void userMediaAccessWasDenied(uint64_t, WebCore::UserMediaRequest::MediaAccessDenialReason, String&&); 48 47 49 void enumerateMediaDevices(WebCore::MediaDevicesEnumerationRequest&); 50 void cancelMediaDevicesEnumeration(WebCore::MediaDevicesEnumerationRequest&); 51 void didCompleteMediaDeviceEnumeration(uint64_t, const Vector<WebCore::CaptureDevice>& deviceList, String&& deviceIdentifierHashSalt, bool originHasPersistentAccess); 48 void enumerateMediaDevices(WebCore::Document&, CompletionHandler<void(const Vector<WebCore::CaptureDevice>&, const String&)>&&); 52 49 53 50 WebCore::UserMediaClient::DeviceChangeObserverToken addDeviceChangeObserver(WTF::Function<void()>&&); … … 70 67 HashMap<RefPtr<WebCore::Document>, Vector<RefPtr<WebCore::UserMediaRequest>>> m_blockedUserMediaRequests; 71 68 72 HashMap<uint64_t, RefPtr<WebCore::MediaDevicesEnumerationRequest>> m_idToMediaDevicesEnumerationRequestMap;73 HashMap<RefPtr<WebCore::MediaDevicesEnumerationRequest>, uint64_t> m_mediaDevicesEnumerationRequestToIDMap;74 75 69 HashMap<WebCore::UserMediaClient::DeviceChangeObserverToken, WTF::Function<void()>> m_deviceChangeObserverMap; 76 70 bool m_monitoringDeviceChange { false }; -
trunk/Source/WebKit/WebProcess/WebCoreSupport/WebUserMediaClient.cpp
r241281 r248847 51 51 } 52 52 53 void WebUserMediaClient::enumerateMediaDevices( MediaDevicesEnumerationRequest& request)53 void WebUserMediaClient::enumerateMediaDevices(Document& document, CompletionHandler<void(const Vector<CaptureDevice>&, const String&)>&& completionHandler) 54 54 { 55 m_page.userMediaPermissionRequestManager().enumerateMediaDevices(request); 56 } 57 58 void WebUserMediaClient::cancelMediaDevicesEnumerationRequest(MediaDevicesEnumerationRequest& request) 59 { 60 m_page.userMediaPermissionRequestManager().cancelMediaDevicesEnumeration(request); 55 m_page.userMediaPermissionRequestManager().enumerateMediaDevices(document, WTFMove(completionHandler)); 61 56 } 62 57 -
trunk/Source/WebKit/WebProcess/WebCoreSupport/WebUserMediaClient.h
r248762 r248847 41 41 void cancelUserMediaAccessRequest(WebCore::UserMediaRequest&) override; 42 42 43 void enumerateMediaDevices(WebCore::MediaDevicesEnumerationRequest&) final; 44 void cancelMediaDevicesEnumerationRequest(WebCore::MediaDevicesEnumerationRequest&) final; 43 void enumerateMediaDevices(WebCore::Document&, CompletionHandler<void(const Vector<WebCore::CaptureDevice>&, const String&)>&&) final; 45 44 46 45 DeviceChangeObserverToken addDeviceChangeObserver(WTF::Function<void()>&&) final; -
trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp
r248846 r248847 4201 4201 } 4202 4202 4203 void WebPage::didCompleteMediaDeviceEnumeration(uint64_t userMediaID, const Vector<CaptureDevice>& devices, String&& deviceIdentifierHashSalt, bool originHasPersistentAccess)4204 {4205 m_userMediaPermissionRequestManager->didCompleteMediaDeviceEnumeration(userMediaID, devices, WTFMove(deviceIdentifierHashSalt), originHasPersistentAccess);4206 }4207 4208 4203 void WebPage::captureDevicesChanged() 4209 4204 { -
trunk/Source/WebKit/WebProcess/WebPage/WebPage.h
r248713 r248847 1483 1483 void userMediaAccessWasDenied(uint64_t userMediaID, uint64_t reason, String&& invalidConstraint); 1484 1484 1485 void didCompleteMediaDeviceEnumeration(uint64_t userMediaID, const Vector<WebCore::CaptureDevice>& devices, String&& deviceIdentifierHashSalt, bool originHasPersistentAccess);1486 1485 #endif 1487 1486 -
trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in
r248713 r248847 360 360 UserMediaAccessWasGranted(uint64_t userMediaID, WebCore::CaptureDevice audioDevice, WebCore::CaptureDevice videoDevice, String mediaDeviceIdentifierHashSalt) -> () Async 361 361 UserMediaAccessWasDenied(uint64_t userMediaID, uint64_t reason, String invalidConstraint) 362 DidCompleteMediaDeviceEnumeration(uint64_t userMediaID, Vector<WebCore::CaptureDevice> devices, String mediaDeviceIdentifierHashSalt, bool hasPersistentAccess)363 362 CaptureDevicesChanged() 364 363 #endif
Note: See TracChangeset
for help on using the changeset viewer.