Changeset 209008 in webkit
- Timestamp:
- Nov 28, 2016 12:45:12 PM (7 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 17 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r208998 r209008 1 2016-11-28 Eric Carlson <eric.carlson@apple.com> 2 3 [MediaStream] Don't request user permission for a device if it has already been granted in the current browsing context 4 https://bugs.webkit.org/show_bug.cgi?id=164760 5 6 Reviewed by Youenn Fablet. 7 8 * fast/mediastream/MediaDevices-getUserMedia-expected.txt: 9 * fast/mediastream/MediaDevices-getUserMedia.html: 10 1 11 2016-11-28 Antti Koivisto <antti@apple.com> 2 12 -
trunk/LayoutTests/fast/mediastream/MediaDevices-enumerateDevices.html
r197114 r209008 59 59 if (window.testRunner) { 60 60 testRunner.setUserMediaPermission(true); 61 testRunner.setUserMediaPer missionForOrigin(false, document.location.href, "");61 testRunner.setUserMediaPersistentPermissionForOrigin(false, document.location.href, ""); 62 62 } 63 63 … … 78 78 { 79 79 if (window.testRunner) 80 testRunner.setUserMediaPer missionForOrigin(true, document.location.href, "");80 testRunner.setUserMediaPersistentPermissionForOrigin(true, document.location.href, ""); 81 81 82 82 debug(`<br>*** Calling mediaDevices.enumerateDevices with persistent access, and without a media stream track<br>`); -
trunk/LayoutTests/http/tests/media/media-stream/enumerate-devices-source-id-persistent.html
r197114 r209008 12 12 if (window.testRunner) { 13 13 testRunner.setUserMediaPermission(true); 14 testRunner.setUserMediaPer missionForOrigin(true, "http://localhost:8000", location.href);14 testRunner.setUserMediaPersistentPermissionForOrigin(true, "http://localhost:8000", location.href); 15 15 } 16 16 -
trunk/Source/WebKit2/ChangeLog
r208992 r209008 1 2016-11-28 Eric Carlson <eric.carlson@apple.com> 2 3 [MediaStream] Don't request user permission for a device if it has already been granted in the current browsing context 4 https://bugs.webkit.org/show_bug.cgi?id=164760 5 <rdar://problem/29261266> 6 7 Reviewed by Youenn Fablet. 8 9 * UIProcess/UserMediaPermissionRequestManagerProxy.cpp: 10 (WebKit::FrameAuthorizationState::FrameAuthorizationState): 11 (WebKit::FrameAuthorizationState::hasPermissionToUseCaptureDevice): 12 (WebKit::FrameAuthorizationState::setHasPermissionToUseCaptureDevice): 13 (WebKit::FrameAuthorizationState::reset): 14 (WebKit::FrameAuthorizationState::securityOriginsAreEqual): 15 (WebKit::UserMediaPermissionRequestManagerProxy::stateForRequest): 16 (WebKit::UserMediaPermissionRequestManagerProxy::invalidateRequests): 17 (WebKit::UserMediaPermissionRequestManagerProxy::createRequest): 18 (WebKit::UserMediaPermissionRequestManagerProxy::userMediaAccessWasDenied): 19 (WebKit::UserMediaPermissionRequestManagerProxy::userMediaAccessWasGranted): 20 (WebKit::UserMediaPermissionRequestManagerProxy::requestUserMediaPermissionForFrame): 21 * UIProcess/UserMediaPermissionRequestManagerProxy.h: 22 (WebKit::FrameAuthorizationState::~FrameAuthorizationState): 23 (WebKit::FrameAuthorizationState::frameID): 24 * UIProcess/UserMediaPermissionRequestProxy.cpp: 25 (WebKit::UserMediaPermissionRequestProxy::UserMediaPermissionRequestProxy): 26 * UIProcess/UserMediaPermissionRequestProxy.h: 27 (WebKit::UserMediaPermissionRequestProxy::create): 28 (WebKit::UserMediaPermissionRequestProxy::frameID): 29 (WebKit::UserMediaPermissionRequestProxy::userMediaDocumentSecurityOrigin): 30 (WebKit::UserMediaPermissionRequestProxy::topLevelDocumentSecurityOrigin): 31 * UIProcess/WebPageProxy.cpp: 32 (WebKit::WebPageProxy::didCommitLoadForFrame): 33 * WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp: 34 (WebKit::UserMediaPermissionRequestManager::removeMediaRequestFromMaps): 35 1 36 2016-11-27 Dean Jackson <dino@apple.com> 2 37 -
trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestManagerProxy.cpp
r208985 r209008 35 35 namespace WebKit { 36 36 37 FrameAuthorizationState::FrameAuthorizationState(UserMediaPermissionRequestProxy& request) 38 : m_userMediaDocumentSecurityOrigin(request.userMediaDocumentSecurityOrigin()) 39 , m_topLevelDocumentSecurityOrigin(request.topLevelDocumentSecurityOrigin()) 40 { 41 } 42 43 bool FrameAuthorizationState::hasPermissionToUseCaptureDevice(const String& deviceUID) 44 { 45 return m_authorizedDeviceUIDs.find(deviceUID) != notFound; 46 } 47 48 void FrameAuthorizationState::setHasPermissionToUseCaptureDevice(const String& deviceUID, bool hasPermission) 49 { 50 if (deviceUID.isEmpty()) 51 return; 52 53 size_t index = m_authorizedDeviceUIDs.find(deviceUID); 54 if (hasPermission == (index != notFound)) 55 return; 56 57 if (hasPermission) 58 m_authorizedDeviceUIDs.append(deviceUID); 59 else 60 m_authorizedDeviceUIDs.remove(index); 61 } 62 63 void FrameAuthorizationState::ensureSecurityOriginsAreEqual(UserMediaPermissionRequestProxy& request) 64 { 65 do { 66 if (!m_userMediaDocumentSecurityOrigin || !m_userMediaDocumentSecurityOrigin->equal(request.userMediaDocumentSecurityOrigin())) 67 break; 68 69 if (!m_topLevelDocumentSecurityOrigin || !m_topLevelDocumentSecurityOrigin->equal(request.topLevelDocumentSecurityOrigin())) 70 break; 71 72 return; 73 } while (0); 74 75 m_userMediaDocumentSecurityOrigin = request.userMediaDocumentSecurityOrigin(); 76 m_topLevelDocumentSecurityOrigin = request.topLevelDocumentSecurityOrigin(); 77 m_authorizedDeviceUIDs.clear(); 78 } 79 80 FrameAuthorizationState& UserMediaPermissionRequestManagerProxy::stateForRequest(UserMediaPermissionRequestProxy& request) 81 { 82 auto& state = m_frameStates.add(request.frameID(), nullptr).iterator->value; 83 if (state) { 84 state->ensureSecurityOriginsAreEqual(request); 85 return *state; 86 } 87 88 state = std::make_unique<FrameAuthorizationState>(request); 89 return *state; 90 } 91 37 92 UserMediaPermissionRequestManagerProxy::UserMediaPermissionRequestManagerProxy(WebPageProxy& page) 38 93 : m_page(page) … … 50 105 m_pendingDeviceRequests.clear(); 51 106 52 m_pageSandboxExtensionsGranted.clear(); 53 } 54 55 Ref<UserMediaPermissionRequestProxy> UserMediaPermissionRequestManagerProxy::createRequest(uint64_t userMediaID, const Vector<String>& audioDeviceUIDs, const Vector<String>& videoDeviceUIDs) 56 { 57 Ref<UserMediaPermissionRequestProxy> request = UserMediaPermissionRequestProxy::create(*this, userMediaID, audioDeviceUIDs, videoDeviceUIDs); 58 m_pendingUserMediaRequests.add(userMediaID, request.ptr()); 59 return request; 60 } 61 62 Ref<UserMediaPermissionRequestProxy> UserMediaPermissionRequestManagerProxy::createRequest(uint64_t userMediaID) 63 { 64 Ref<UserMediaPermissionRequestProxy> request = UserMediaPermissionRequestProxy::create(*this, userMediaID, Vector<String>(), Vector<String>()); 107 m_frameStates.clear(); 108 } 109 110 Ref<UserMediaPermissionRequestProxy> UserMediaPermissionRequestManagerProxy::createRequest(uint64_t userMediaID, uint64_t frameID, const String& userMediaDocumentOriginIdentifier, const String& topLevelDocumentOriginIdentifier, const Vector<String>& audioDeviceUIDs, const Vector<String>& videoDeviceUIDs) 111 { 112 auto request = UserMediaPermissionRequestProxy::create(*this, userMediaID, frameID, userMediaDocumentOriginIdentifier, topLevelDocumentOriginIdentifier, audioDeviceUIDs, videoDeviceUIDs); 65 113 m_pendingUserMediaRequests.add(userMediaID, request.ptr()); 66 114 return request; … … 104 152 return; 105 153 106 if (!m_pendingUserMediaRequests.take(userMediaID)) 107 return; 108 109 denyRequest(userMediaID, reason, ""); 154 auto request = m_pendingUserMediaRequests.take(userMediaID); 155 if (!request) 156 return; 157 158 auto fameState = stateForRequest(*request); 159 for (const auto& deviceUID : request->videoDeviceUIDs()) 160 fameState.setHasPermissionToUseCaptureDevice(deviceUID, false); 161 for (const auto& deviceUID : request->audioDeviceUIDs()) 162 fameState.setHasPermissionToUseCaptureDevice(deviceUID, false); 163 164 denyRequest(userMediaID, reason, emptyString()); 110 165 } 111 166 … … 129 184 return; 130 185 131 if (!m_pendingUserMediaRequests.take(userMediaID)) 132 return; 133 134 #if ENABLE(MEDIA_STREAM) 186 #if ENABLE(MEDIA_STREAM) 187 auto request = m_pendingUserMediaRequests.take(userMediaID); 188 if (!request) 189 return; 190 191 auto& fameState = stateForRequest(*request); 192 fameState.setHasPermissionToUseCaptureDevice(audioDeviceUID, true); 193 fameState.setHasPermissionToUseCaptureDevice(videoDeviceUID, true); 194 135 195 size_t extensionCount = 0; 136 196 unsigned requiredExtensions = SandboxExtensionsGranted::None; … … 144 204 } 145 205 146 unsigned currentExtensions = m_pageSandboxExtensionsGranted .get(m_page.pageID());206 unsigned currentExtensions = m_pageSandboxExtensionsGranted; 147 207 if (!(requiredExtensions & currentExtensions)) { 148 208 ASSERT(extensionCount); 149 m_pageSandboxExtensionsGranted .set(m_page.pageID(), requiredExtensions | currentExtensions);209 m_pageSandboxExtensionsGranted = requiredExtensions | currentExtensions; 150 210 SandboxExtension::HandleArray handles; 151 211 handles.allocate(extensionCount); … … 159 219 m_page.process().send(Messages::WebPage::UserMediaAccessWasGranted(userMediaID, audioDeviceUID, videoDeviceUID), m_page.pageID()); 160 220 #else 221 UNUSED_PARAM(userMediaID); 161 222 UNUSED_PARAM(audioDeviceUID); 162 223 UNUSED_PARAM(videoDeviceUID); … … 179 240 180 241 if (videoDeviceUIDs.isEmpty() && audioDeviceUIDs.isEmpty()) { 181 denyRequest(userMediaID, UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::NoConstraints, "");242 denyRequest(userMediaID, UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::NoConstraints, emptyString()); 182 243 return; 183 244 } … … 185 246 auto userMediaOrigin = API::SecurityOrigin::create(SecurityOriginData::fromDatabaseIdentifier(userMediaDocumentOriginIdentifier)->securityOrigin()); 186 247 auto topLevelOrigin = API::SecurityOrigin::create(SecurityOriginData::fromDatabaseIdentifier(topLevelDocumentOriginIdentifier)->securityOrigin()); 187 auto request = createRequest(userMediaID, audioDeviceUIDs, videoDeviceUIDs); 188 189 if (!m_page.uiClient().decidePolicyForUserMediaPermissionRequest(m_page, *m_page.process().webFrame(frameID), *userMediaOrigin.get(), *topLevelOrigin.get(), request.get())) { 190 m_pendingUserMediaRequests.take(userMediaID); 191 request->deny(UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::UserMediaDisabled); 248 auto request = createRequest(userMediaID, frameID, userMediaDocumentOriginIdentifier, topLevelDocumentOriginIdentifier, audioDeviceUIDs, videoDeviceUIDs); 249 250 String authorizedAudioDevice; 251 String authorizedVideoDevice; 252 auto& fameState = stateForRequest(request); 253 for (auto deviceUID : audioDeviceUIDs) { 254 if (fameState.hasPermissionToUseCaptureDevice(deviceUID)) { 255 authorizedAudioDevice = deviceUID; 256 break; 257 } 192 258 } 259 for (auto deviceUID : videoDeviceUIDs) { 260 if (fameState.hasPermissionToUseCaptureDevice(deviceUID)) { 261 authorizedVideoDevice = deviceUID; 262 break; 263 } 264 } 265 266 if (audioDeviceUIDs.isEmpty() == authorizedAudioDevice.isEmpty() && videoDeviceUIDs.isEmpty() == authorizedVideoDevice.isEmpty()) { 267 userMediaAccessWasGranted(userMediaID, authorizedAudioDevice, authorizedVideoDevice); 268 return; 269 } 270 271 if (!m_page.uiClient().decidePolicyForUserMediaPermissionRequest(m_page, *m_page.process().webFrame(frameID), *userMediaOrigin.get(), *topLevelOrigin.get(), request.get())) 272 userMediaAccessWasDenied(userMediaID, UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::UserMediaDisabled); 273 193 274 }; 194 275 -
trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestManagerProxy.h
r207704 r209008 23 23 #include "UserMediaPermissionCheckProxy.h" 24 24 #include "UserMediaPermissionRequestProxy.h" 25 #include <WebCore/SecurityOrigin.h> 25 26 #include <WebCore/UserMediaRequest.h> 26 27 #include <wtf/HashMap.h> … … 35 36 class WebPageProxy; 36 37 38 class FrameAuthorizationState { 39 public: 40 explicit FrameAuthorizationState(UserMediaPermissionRequestProxy&); 41 42 bool hasPermissionToUseCaptureDevice(const String& deviceUID); 43 void setHasPermissionToUseCaptureDevice(const String&, bool); 44 45 void ensureSecurityOriginsAreEqual(UserMediaPermissionRequestProxy&); 46 47 private: 48 RefPtr<WebCore::SecurityOrigin> m_userMediaDocumentSecurityOrigin; 49 RefPtr<WebCore::SecurityOrigin> m_topLevelDocumentSecurityOrigin; 50 Vector<String> m_authorizedDeviceUIDs; 51 }; 52 37 53 class UserMediaPermissionRequestManagerProxy { 38 54 public: … … 45 61 void userMediaAccessWasGranted(uint64_t, const String& audioDeviceUID, const String& videoDeviceUID); 46 62 void userMediaAccessWasDenied(uint64_t, UserMediaPermissionRequestProxy::UserMediaAccessDenialReason); 63 FrameAuthorizationState& stateForRequest(UserMediaPermissionRequestProxy&); 47 64 48 65 void enumerateMediaDevicesForFrame(uint64_t userMediaID, uint64_t frameID, String userMediaDocumentOriginIdentifier, String topLevelDocumentOriginIdentifier); … … 51 68 52 69 private: 53 Ref<UserMediaPermissionRequestProxy> createRequest(uint64_t, const Vector<String>& audioDeviceUIDs, const Vector<String>& videoDeviceUIDs); 54 Ref<UserMediaPermissionRequestProxy> createRequest(uint64_t userMediaID); 70 Ref<UserMediaPermissionRequestProxy> createRequest(uint64_t userMediaID, uint64_t frameID, const String&userMediaDocumentOriginIdentifier, const String& topLevelDocumentOriginIdentifier, const Vector<String>& audioDeviceUIDs, const Vector<String>& videoDeviceUIDs); 55 71 void denyRequest(uint64_t userMediaID, UserMediaPermissionRequestProxy::UserMediaAccessDenialReason, const String& invalidConstraint); 56 72 Ref<UserMediaPermissionCheckProxy> createUserMediaPermissionCheck(uint64_t userMediaID); … … 65 81 Audio = 1 << 1 66 82 }; 67 HashMap<uint64_t, unsigned> m_pageSandboxExtensionsGranted; 83 unsigned m_pageSandboxExtensionsGranted; 84 85 HashMap<uint64_t, std::unique_ptr<FrameAuthorizationState>> m_frameStates; 68 86 69 87 WebPageProxy& m_page; -
trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestProxy.cpp
r207463 r209008 23 23 #include "UserMediaPermissionRequestManagerProxy.h" 24 24 #include <WebCore/RealtimeMediaSourceCenter.h> 25 #include <WebCore/SecurityOrigin.h> 26 #include <WebCore/SecurityOriginData.h> 25 27 #include <wtf/text/StringHash.h> 28 29 using namespace WebCore; 26 30 27 31 namespace WebKit { 28 32 29 UserMediaPermissionRequestProxy::UserMediaPermissionRequestProxy(UserMediaPermissionRequestManagerProxy& manager, uint64_t userMediaID, const Vector<String>& audioDeviceUIDs, const Vector<String>& videoDeviceUIDs)33 UserMediaPermissionRequestProxy::UserMediaPermissionRequestProxy(UserMediaPermissionRequestManagerProxy& manager, uint64_t userMediaID, uint64_t frameID, const String& userMediaDocumentOriginIdentifier, const String& topLevelDocumentOriginIdentifier, const Vector<String>& audioDeviceUIDs, const Vector<String>& videoDeviceUIDs) 30 34 : m_manager(&manager) 31 35 , m_userMediaID(userMediaID) 36 , m_frameID(frameID) 37 , m_userMediaDocumentSecurityOrigin((SecurityOriginData::fromDatabaseIdentifier(userMediaDocumentOriginIdentifier)->securityOrigin())) 38 , m_topLevelDocumentSecurityOrigin(SecurityOriginData::fromDatabaseIdentifier(topLevelDocumentOriginIdentifier)->securityOrigin()) 32 39 , m_videoDeviceUIDs(videoDeviceUIDs) 33 40 , m_audioDeviceUIDs(audioDeviceUIDs) -
trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestProxy.h
r207463 r209008 26 26 #include <wtf/text/WTFString.h> 27 27 28 namespace WebCore { 29 class SecurityOrigin; 30 } 31 28 32 namespace WebKit { 29 33 … … 32 36 class UserMediaPermissionRequestProxy : public API::ObjectImpl<API::Object::Type::UserMediaPermissionRequest> { 33 37 public: 34 static Ref<UserMediaPermissionRequestProxy> create(UserMediaPermissionRequestManagerProxy& manager, uint64_t userMediaID, const Vector<String>& videoDeviceUIDs, const Vector<String>& audioDeviceUIDs)38 static Ref<UserMediaPermissionRequestProxy> create(UserMediaPermissionRequestManagerProxy& manager, uint64_t userMediaID, uint64_t frameID, const String& userMediaDocumentOriginIdentifier, const String& topLevelDocumentOriginIdentifier, const Vector<String>& videoDeviceUIDs, const Vector<String>& audioDeviceUIDs) 35 39 { 36 return adoptRef(*new UserMediaPermissionRequestProxy(manager, userMediaID, videoDeviceUIDs, audioDeviceUIDs));40 return adoptRef(*new UserMediaPermissionRequestProxy(manager, userMediaID, frameID, userMediaDocumentOriginIdentifier, topLevelDocumentOriginIdentifier, videoDeviceUIDs, audioDeviceUIDs)); 37 41 } 38 42 … … 50 54 const Vector<String>& audioDeviceUIDs() const { return m_audioDeviceUIDs; } 51 55 56 uint64_t frameID() const { return m_frameID; } 57 WebCore::SecurityOrigin* userMediaDocumentSecurityOrigin() { return &m_userMediaDocumentSecurityOrigin.get(); } 58 WebCore::SecurityOrigin* topLevelDocumentSecurityOrigin() { return &m_topLevelDocumentSecurityOrigin.get(); } 59 52 60 private: 53 UserMediaPermissionRequestProxy(UserMediaPermissionRequestManagerProxy&, uint64_t userMediaID, const Vector<String>& videoDeviceUIDs, const Vector<String>& audioDeviceUIDs);61 UserMediaPermissionRequestProxy(UserMediaPermissionRequestManagerProxy&, uint64_t userMediaID, uint64_t frameID, const String& userMediaDocumentOriginIdentifier, const String& topLevelDocumentOriginIdentifier, const Vector<String>& videoDeviceUIDs, const Vector<String>& audioDeviceUIDs); 54 62 55 63 UserMediaPermissionRequestManagerProxy* m_manager; 56 64 uint64_t m_userMediaID; 65 uint64_t m_frameID; 66 Ref<WebCore::SecurityOrigin> m_userMediaDocumentSecurityOrigin; 67 Ref<WebCore::SecurityOrigin> m_topLevelDocumentSecurityOrigin; 57 68 Vector<String> m_videoDeviceUIDs; 58 69 Vector<String> m_audioDeviceUIDs; -
trunk/Tools/ChangeLog
r208999 r209008 1 2016-11-28 Eric Carlson <eric.carlson@apple.com> 2 3 [MediaStream] Don't request user permission for a device if it has already been granted in the current browsing context 4 https://bugs.webkit.org/show_bug.cgi?id=164760 5 <rdar://problem/29261266> 6 7 Reviewed by Youenn Fablet. 8 9 Allow scripts to determine the number of times the user has been prompted for capture device access. 10 11 * WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl: 12 * WebKitTestRunner/InjectedBundle/InjectedBundle.cpp: 13 (WTR::InjectedBundle::setUserMediaPersistentPermissionForOrigin): 14 (WTR::InjectedBundle::userMediaPermissionRequestCountForOrigin): 15 (WTR::InjectedBundle::resetUserMediaPermissionRequestCountForOrigin): 16 (WTR::InjectedBundle::setUserMediaPermissionForOrigin): Deleted. 17 * WebKitTestRunner/InjectedBundle/InjectedBundle.h: 18 * WebKitTestRunner/InjectedBundle/TestRunner.cpp: 19 (WTR::TestRunner::setUserMediaPersistentPermissionForOrigin): 20 (WTR::TestRunner::userMediaPermissionRequestCountForOrigin): 21 (WTR::TestRunner::resetUserMediaPermissionRequestCountForOrigin): 22 (WTR::TestRunner::setUserMediaPermissionForOrigin): Deleted. 23 * WebKitTestRunner/InjectedBundle/TestRunner.h: 24 * WebKitTestRunner/TestController.cpp: 25 (WTR::TestController::resetStateToConsistentValues): 26 (WTR::OriginSettings::incrementRequestCount): 27 (WTR::OriginSettings::resetRequestCount): 28 (WTR::OriginSettings::requestCount): 29 (WTR::TestController::saltForOrigin): 30 (WTR::TestController::setUserMediaPersistentPermissionForOrigin): 31 (WTR::TestController::handleCheckOfUserMediaPermissionForOrigin): 32 (WTR::TestController::settingsForOrigin): 33 (WTR::TestController::userMediaPermissionRequestCountForOrigin): 34 (WTR::TestController::resetUserMediaPermissionRequestCountForOrigin): 35 (WTR::TestController::decidePolicyForUserMediaPermissionRequestIfPossible): 36 (WTR::TestController::setUserMediaPermissionForOrigin): Deleted. 37 * WebKitTestRunner/TestController.h: 38 * WebKitTestRunner/TestInvocation.cpp: 39 (WTR::TestInvocation::didReceiveMessageFromInjectedBundle): 40 (WTR::TestInvocation::didReceiveSynchronousMessageFromInjectedBundle): 41 1 42 2016-11-18 Jer Noble <jer.noble@apple.com> 2 43 -
trunk/Tools/WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl
r208522 r209008 186 186 // MediaStream 187 187 void setUserMediaPermission(boolean value); 188 void setUserMediaPermissionForOrigin(boolean permission, DOMString origin, DOMString parentOrigin); 188 void setUserMediaPersistentPermissionForOrigin(boolean permission, DOMString origin, DOMString parentOrigin); 189 unsigned long userMediaPermissionRequestCountForOrigin(DOMString origin, DOMString parentOrigin); 190 void resetUserMediaPermissionRequestCountForOrigin(DOMString origin, DOMString parentOrigin); 189 191 190 192 // Audio testing. -
trunk/Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.cpp
r208939 r209008 583 583 } 584 584 585 void InjectedBundle::setUserMediaPer missionForOrigin(bool permission, WKStringRef origin, WKStringRef parentOrigin)586 { 587 auto messageName = adoptWK(WKStringCreateWithUTF8CString("SetUserMediaPer missionForOrigin"));585 void InjectedBundle::setUserMediaPersistentPermissionForOrigin(bool permission, WKStringRef origin, WKStringRef parentOrigin) 586 { 587 auto messageName = adoptWK(WKStringCreateWithUTF8CString("SetUserMediaPersistentPermissionForOrigin")); 588 588 WKRetainPtr<WKMutableDictionaryRef> messageBody(AdoptWK, WKMutableDictionaryCreate()); 589 589 … … 591 591 WKRetainPtr<WKBooleanRef> permissionWK(AdoptWK, WKBooleanCreate(permission)); 592 592 WKDictionarySetItem(messageBody.get(), permissionKeyWK.get(), permissionWK.get()); 593 594 WKRetainPtr<WKStringRef> originKeyWK(AdoptWK, WKStringCreateWithUTF8CString("origin")); 595 WKDictionarySetItem(messageBody.get(), originKeyWK.get(), origin); 596 597 WKRetainPtr<WKStringRef> parentOriginKeyWK(AdoptWK, WKStringCreateWithUTF8CString("parentOrigin")); 598 WKDictionarySetItem(messageBody.get(), parentOriginKeyWK.get(), parentOrigin); 599 600 WKBundlePagePostMessage(page()->page(), messageName.get(), messageBody.get()); 601 } 602 603 unsigned InjectedBundle::userMediaPermissionRequestCountForOrigin(WKStringRef origin, WKStringRef parentOrigin) const 604 { 605 WKRetainPtr<WKStringRef> messageName(AdoptWK, WKStringCreateWithUTF8CString("UserMediaPermissionRequestCountForOrigin")); 606 WKRetainPtr<WKMutableDictionaryRef> messageBody(AdoptWK, WKMutableDictionaryCreate()); 607 608 WKRetainPtr<WKStringRef> originKeyWK(AdoptWK, WKStringCreateWithUTF8CString("origin")); 609 WKDictionarySetItem(messageBody.get(), originKeyWK.get(), origin); 610 611 WKRetainPtr<WKStringRef> parentOriginKeyWK(AdoptWK, WKStringCreateWithUTF8CString("parentOrigin")); 612 WKDictionarySetItem(messageBody.get(), parentOriginKeyWK.get(), parentOrigin); 613 614 WKTypeRef resultToPass = 0; 615 WKBundlePagePostSynchronousMessageForTesting(page()->page(), messageName.get(), messageBody.get(), &resultToPass); 616 WKRetainPtr<WKUInt64Ref> count(AdoptWK, static_cast<WKUInt64Ref>(resultToPass)); 617 618 return static_cast<unsigned>(WKUInt64GetValue(count.get())); 619 } 620 621 void InjectedBundle::resetUserMediaPermissionRequestCountForOrigin(WKStringRef origin, WKStringRef parentOrigin) 622 { 623 WKRetainPtr<WKStringRef> messageName(AdoptWK, WKStringCreateWithUTF8CString("ResetUserMediaPermissionRequestCountForOrigin")); 624 WKRetainPtr<WKMutableDictionaryRef> messageBody(AdoptWK, WKMutableDictionaryCreate()); 593 625 594 626 WKRetainPtr<WKStringRef> originKeyWK(AdoptWK, WKStringCreateWithUTF8CString("origin")); -
trunk/Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.h
r208338 r209008 102 102 // MediaStream. 103 103 void setUserMediaPermission(bool); 104 void setUserMediaPermissionForOrigin(bool permission, WKStringRef origin, WKStringRef parentOrigin); 104 void setUserMediaPersistentPermissionForOrigin(bool permission, WKStringRef origin, WKStringRef parentOrigin); 105 unsigned userMediaPermissionRequestCountForOrigin(WKStringRef origin, WKStringRef parentOrigin) const; 106 void resetUserMediaPermissionRequestCountForOrigin(WKStringRef origin, WKStringRef parentOrigin); 105 107 106 108 // Policy delegate. -
trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp
r208939 r209008 890 890 } 891 891 892 void TestRunner::setUserMediaPer missionForOrigin(bool permission, JSStringRef origin, JSStringRef parentOrigin)892 void TestRunner::setUserMediaPersistentPermissionForOrigin(bool permission, JSStringRef origin, JSStringRef parentOrigin) 893 893 { 894 894 WKRetainPtr<WKStringRef> originWK = toWK(origin); 895 895 WKRetainPtr<WKStringRef> parentOriginWK = toWK(parentOrigin); 896 InjectedBundle::singleton().setUserMediaPermissionForOrigin(permission, originWK.get(), parentOriginWK.get()); 896 InjectedBundle::singleton().setUserMediaPersistentPermissionForOrigin(permission, originWK.get(), parentOriginWK.get()); 897 } 898 899 unsigned TestRunner::userMediaPermissionRequestCountForOrigin(JSStringRef origin, JSStringRef parentOrigin) const 900 { 901 WKRetainPtr<WKStringRef> originWK = toWK(origin); 902 WKRetainPtr<WKStringRef> parentOriginWK = toWK(parentOrigin); 903 return InjectedBundle::singleton().userMediaPermissionRequestCountForOrigin(originWK.get(), parentOriginWK.get()); 904 } 905 906 void TestRunner::resetUserMediaPermissionRequestCountForOrigin(JSStringRef origin, JSStringRef parentOrigin) 907 { 908 WKRetainPtr<WKStringRef> originWK = toWK(origin); 909 WKRetainPtr<WKStringRef> parentOriginWK = toWK(parentOrigin); 910 InjectedBundle::singleton().resetUserMediaPermissionRequestCountForOrigin(originWK.get(), parentOriginWK.get()); 897 911 } 898 912 -
trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.h
r208939 r209008 287 287 // MediaStream 288 288 void setUserMediaPermission(bool); 289 void setUserMediaPermissionForOrigin(bool permission, JSStringRef origin, JSStringRef parentOrigin); 289 void setUserMediaPersistentPermissionForOrigin(bool permission, JSStringRef origin, JSStringRef parentOrigin); 290 unsigned userMediaPermissionRequestCountForOrigin(JSStringRef origin, JSStringRef parentOrigin) const; 291 void resetUserMediaPermissionRequestCountForOrigin(JSStringRef origin, JSStringRef parentOrigin); 290 292 291 293 void setPageVisibility(JSStringRef state); … … 401 403 WKRetainPtr<WKArrayRef> m_allowedHosts; 402 404 405 size_t m_userMediaPermissionRequestCount { 0 }; 406 403 407 PlatformTimerRef m_waitToDumpWatchdogTimer; 404 408 }; -
trunk/Tools/WebKitTestRunner/TestController.cpp
r208983 r209008 766 766 // Reset UserMedia permissions. 767 767 m_userMediaPermissionRequests.clear(); 768 m_ca hcedUserMediaPermissions.clear();768 m_cachedUserMediaPermissions.clear(); 769 769 m_isUserMediaPermissionSet = false; 770 770 m_isUserMediaPermissionAllowed = false; … … 1886 1886 HashMap<uint64_t, String>& ephemeralSalts() { return m_ephemeralSalts; } 1887 1887 1888 void incrementRequestCount() { ++m_requestCount; } 1889 void resetRequestCount() { m_requestCount = 0; } 1890 unsigned requestCount() const { return m_requestCount; } 1891 1888 1892 private: 1889 1893 HashMap<uint64_t, String> m_ephemeralSalts; 1890 1894 String m_persistentSalt; 1895 unsigned m_requestCount { 0 }; 1891 1896 bool m_persistentPermission { false }; 1892 1897 }; … … 1894 1899 String TestController::saltForOrigin(WKFrameRef frame, String originHash) 1895 1900 { 1896 RefPtr<OriginSettings> settings = m_cahcedUserMediaPermissions.get(originHash); 1897 if (!settings) { 1898 settings = adoptRef(*new OriginSettings()); 1899 m_cahcedUserMediaPermissions.add(originHash, settings); 1900 } 1901 1902 auto& ephemeralSalts = settings->ephemeralSalts(); 1901 auto& settings = settingsForOrigin(originHash); 1902 auto& ephemeralSalts = settings.ephemeralSalts(); 1903 1903 auto frameInfo = adoptWK(WKFrameCreateFrameInfo(frame)); 1904 1904 auto frameHandle = WKFrameInfoGetFrameHandleRef(frameInfo.get()); … … 1906 1906 String frameSalt = ephemeralSalts.get(frameIdentifier); 1907 1907 1908 if (settings ->persistentPermission()) {1908 if (settings.persistentPermission()) { 1909 1909 if (frameSalt.length()) 1910 1910 return frameSalt; 1911 1911 1912 if (!settings ->persistentSalt().length())1913 settings ->setPersistentSalt(createCanonicalUUIDString());1914 1915 return settings ->persistentSalt();1912 if (!settings.persistentSalt().length()) 1913 settings.setPersistentSalt(createCanonicalUUIDString()); 1914 1915 return settings.persistentSalt(); 1916 1916 } 1917 1917 … … 1924 1924 } 1925 1925 1926 void TestController::setUserMediaPer missionForOrigin(bool permission, WKStringRef userMediaDocumentOriginString, WKStringRef topLevelDocumentOriginString)1926 void TestController::setUserMediaPersistentPermissionForOrigin(bool permission, WKStringRef userMediaDocumentOriginString, WKStringRef topLevelDocumentOriginString) 1927 1927 { 1928 1928 auto originHash = userMediaOriginHash(userMediaDocumentOriginString, topLevelDocumentOriginString); 1929 RefPtr<OriginSettings> settings = m_cahcedUserMediaPermissions.get(originHash); 1930 if (!settings) { 1931 settings = adoptRef(*new OriginSettings()); 1932 m_cahcedUserMediaPermissions.add(originHash, settings); 1933 } 1934 1935 settings->setPersistentPermission(permission); 1929 auto& settings = settingsForOrigin(originHash); 1930 settings.setPersistentPermission(permission); 1936 1931 } 1937 1932 … … 1941 1936 auto salt = saltForOrigin(frame, originHash); 1942 1937 1943 WKUserMediaPermissionCheckSetUserMediaAccessInfo(checkRequest, WKStringCreateWithUTF8CString(salt.utf8().data()), m_cahcedUserMediaPermissions.get(originHash)->persistentPermission());1938 WKUserMediaPermissionCheckSetUserMediaAccessInfo(checkRequest, WKStringCreateWithUTF8CString(salt.utf8().data()), settingsForOrigin(originHash).persistentPermission()); 1944 1939 } 1945 1940 … … 1951 1946 } 1952 1947 1948 OriginSettings& TestController::settingsForOrigin(const String& originHash) 1949 { 1950 RefPtr<OriginSettings> settings = m_cachedUserMediaPermissions.get(originHash); 1951 if (!settings) { 1952 settings = adoptRef(*new OriginSettings()); 1953 m_cachedUserMediaPermissions.add(originHash, settings); 1954 } 1955 1956 return *settings; 1957 } 1958 1959 unsigned TestController::userMediaPermissionRequestCountForOrigin(WKStringRef userMediaDocumentOriginString, WKStringRef topLevelDocumentOriginString) 1960 { 1961 auto originHash = userMediaOriginHash(userMediaDocumentOriginString, topLevelDocumentOriginString); 1962 return settingsForOrigin(originHash).requestCount(); 1963 } 1964 1965 void TestController::resetUserMediaPermissionRequestCountForOrigin(WKStringRef userMediaDocumentOriginString, WKStringRef topLevelDocumentOriginString) 1966 { 1967 auto originHash = userMediaOriginHash(userMediaDocumentOriginString, topLevelDocumentOriginString); 1968 settingsForOrigin(originHash).resetRequestCount(); 1969 } 1970 1953 1971 void TestController::decidePolicyForUserMediaPermissionRequestIfPossible() 1954 1972 { … … 1960 1978 auto request = pair.second.get(); 1961 1979 1962 bool persistentPermission = false; 1963 RefPtr<OriginSettings> settings = m_cahcedUserMediaPermissions.get(originHash); 1964 if (settings) 1965 persistentPermission = settings->persistentPermission(); 1966 1967 if (!m_isUserMediaPermissionAllowed && !persistentPermission) { 1980 auto& settings = settingsForOrigin(originHash); 1981 settings.incrementRequestCount(); 1982 1983 if (!m_isUserMediaPermissionAllowed && !settings.persistentPermission()) { 1968 1984 WKUserMediaPermissionRequestDeny(request, kWKPermissionDenied); 1969 1985 continue; -
trunk/Tools/WebKitTestRunner/TestController.h
r208522 r209008 102 102 WKStringRef getUserMediaSaltForOrigin(WKFrameRef, WKStringRef originKey); 103 103 void setUserMediaPermission(bool); 104 void setUserMediaPer missionForOrigin(bool, WKStringRef userMediaDocumentOriginString, WKStringRef topLevelDocumentOriginString);104 void setUserMediaPersistentPermissionForOrigin(bool, WKStringRef userMediaDocumentOriginString, WKStringRef topLevelDocumentOriginString); 105 105 void handleUserMediaPermissionRequest(WKFrameRef, WKSecurityOriginRef, WKSecurityOriginRef, WKUserMediaPermissionRequestRef); 106 106 void handleCheckOfUserMediaPermissionForOrigin(WKFrameRef, WKSecurityOriginRef, WKSecurityOriginRef, const WKUserMediaPermissionCheckRef&); 107 OriginSettings& settingsForOrigin(const String&); 108 unsigned userMediaPermissionRequestCountForOrigin(WKStringRef userMediaDocumentOriginString, WKStringRef topLevelDocumentOriginString); 109 void resetUserMediaPermissionRequestCountForOrigin(WKStringRef userMediaDocumentOriginString, WKStringRef topLevelDocumentOriginString); 107 110 108 111 // Policy delegate. … … 317 320 bool m_isGeolocationPermissionAllowed { false }; 318 321 319 HashMap<String, RefPtr<OriginSettings>> m_ca hcedUserMediaPermissions;322 HashMap<String, RefPtr<OriginSettings>> m_cachedUserMediaPermissions; 320 323 321 324 typedef Vector<std::pair<String, WKRetainPtr<WKUserMediaPermissionRequestRef>>> PermissionRequestList; -
trunk/Tools/WebKitTestRunner/TestInvocation.cpp
r208522 r209008 497 497 } 498 498 499 if (WKStringIsEqualToUTF8CString(messageName, "SetUserMediaPer missionForOrigin")) {499 if (WKStringIsEqualToUTF8CString(messageName, "SetUserMediaPersistentPermissionForOrigin")) { 500 500 ASSERT(WKGetTypeID(messageBody) == WKDictionaryGetTypeID()); 501 501 WKDictionaryRef messageBodyDictionary = static_cast<WKDictionaryRef>(messageBody); … … 511 511 WKStringRef parentOriginWK = static_cast<WKStringRef>(WKDictionaryGetItemForKey(messageBodyDictionary, parentOriginKey.get())); 512 512 513 TestController::singleton().setUserMediaPermissionForOrigin(permission, originWK, parentOriginWK); 513 TestController::singleton().setUserMediaPersistentPermissionForOrigin(permission, originWK, parentOriginWK); 514 return; 515 } 516 517 if (WKStringIsEqualToUTF8CString(messageName, "ResetUserMediaPermissionRequestCountForOrigin")) { 518 ASSERT(WKGetTypeID(messageBody) == WKDictionaryGetTypeID()); 519 WKDictionaryRef messageBodyDictionary = static_cast<WKDictionaryRef>(messageBody); 520 521 WKRetainPtr<WKStringRef> originKey(AdoptWK, WKStringCreateWithUTF8CString("origin")); 522 WKStringRef originWK = static_cast<WKStringRef>(WKDictionaryGetItemForKey(messageBodyDictionary, originKey.get())); 523 524 WKRetainPtr<WKStringRef> parentOriginKey(AdoptWK, WKStringCreateWithUTF8CString("parentOrigin")); 525 WKStringRef parentOriginWK = static_cast<WKStringRef>(WKDictionaryGetItemForKey(messageBodyDictionary, parentOriginKey.get())); 526 527 TestController::singleton().resetUserMediaPermissionRequestCountForOrigin(originWK, parentOriginWK); 514 528 return; 515 529 } … … 847 861 #endif // PLATFORM(MAC) 848 862 863 if (WKStringIsEqualToUTF8CString(messageName, "UserMediaPermissionRequestCountForOrigin")) { 864 ASSERT(WKGetTypeID(messageBody) == WKDictionaryGetTypeID()); 865 WKDictionaryRef messageBodyDictionary = static_cast<WKDictionaryRef>(messageBody); 866 867 WKRetainPtr<WKStringRef> originKey(AdoptWK, WKStringCreateWithUTF8CString("origin")); 868 WKStringRef originWK = static_cast<WKStringRef>(WKDictionaryGetItemForKey(messageBodyDictionary, originKey.get())); 869 870 WKRetainPtr<WKStringRef> parentOriginKey(AdoptWK, WKStringCreateWithUTF8CString("parentOrigin")); 871 WKStringRef parentOriginWK = static_cast<WKStringRef>(WKDictionaryGetItemForKey(messageBodyDictionary, parentOriginKey.get())); 872 873 unsigned count = TestController::singleton().userMediaPermissionRequestCountForOrigin(originWK, parentOriginWK); 874 WKRetainPtr<WKUInt64Ref> result(AdoptWK, WKUInt64Create(count)); 875 return result; 876 } 877 878 849 879 ASSERT_NOT_REACHED(); 850 880 return nullptr;
Note: See TracChangeset
for help on using the changeset viewer.