Diff
Modified: trunk/LayoutTests/ChangeLog (217944 => 217945)
--- trunk/LayoutTests/ChangeLog 2017-06-08 20:08:24 UTC (rev 217944)
+++ trunk/LayoutTests/ChangeLog 2017-06-08 20:37:49 UTC (rev 217945)
@@ -1,3 +1,28 @@
+2017-06-08 Youenn Fablet <[email protected]>
+
+ getUserMedia should not be prompted again if user denied access
+ https://bugs.webkit.org/show_bug.cgi?id=173104
+
+ Reviewed by Geoff Garen.
+
+ Splitting grant test due to remembering deny decisions.
+
+ * fast/mediastream/getUserMedia-deny-persistency-expected.txt: Added.
+ * fast/mediastream/getUserMedia-deny-persistency-reload-expected.txt: Added.
+ * fast/mediastream/getUserMedia-deny-persistency-reload.html: Added.
+ * fast/mediastream/getUserMedia-deny-persistency.html: Added.
+ * fast/mediastream/getUserMedia-deny-persistency2-expected.txt: Added.
+ * fast/mediastream/getUserMedia-deny-persistency2.html: Added.
+ * fast/mediastream/getUserMedia-deny-persistency3-expected.txt: Added.
+ * fast/mediastream/getUserMedia-deny-persistency3.html: Added.
+ * fast/mediastream/getUserMedia-grant-persistency-expected.txt:
+ * fast/mediastream/getUserMedia-grant-persistency.html:
+ * fast/mediastream/getUserMedia-grant-persistency2-expected.txt: Added.
+ * fast/mediastream/getUserMedia-grant-persistency2.html: Added.
+ * fast/mediastream/getUserMedia-grant-persistency3-expected.txt: Added.
+ * fast/mediastream/getUserMedia-grant-persistency3.html: Added.
+
+
2017-06-08 Filip Pizlo <[email protected]>
REGRESSION: js/dom/prototype-chain-caching-with-impure-get-own-property-slot-traps-5.html has a flaky failure
Added: trunk/LayoutTests/fast/mediastream/getUserMedia-deny-persistency-expected.txt (0 => 217945)
--- trunk/LayoutTests/fast/mediastream/getUserMedia-deny-persistency-expected.txt (rev 0)
+++ trunk/LayoutTests/fast/mediastream/getUserMedia-deny-persistency-expected.txt 2017-06-08 20:37:49 UTC (rev 217945)
@@ -0,0 +1,3 @@
+
+PASS Testing same page getUserMedia deny persistency with audio denied
+
Added: trunk/LayoutTests/fast/mediastream/getUserMedia-deny-persistency-reload-expected.txt (0 => 217945)
--- trunk/LayoutTests/fast/mediastream/getUserMedia-deny-persistency-reload-expected.txt (rev 0)
+++ trunk/LayoutTests/fast/mediastream/getUserMedia-deny-persistency-reload-expected.txt 2017-06-08 20:37:49 UTC (rev 217945)
@@ -0,0 +1,2 @@
+In case of reload, getUserMedia deny state should be reset
+PASS
Added: trunk/LayoutTests/fast/mediastream/getUserMedia-deny-persistency-reload.html (0 => 217945)
--- trunk/LayoutTests/fast/mediastream/getUserMedia-deny-persistency-reload.html (rev 0)
+++ trunk/LayoutTests/fast/mediastream/getUserMedia-deny-persistency-reload.html 2017-06-08 20:37:49 UTC (rev 217945)
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+if (window.testRunner) {
+ testRunner.dumpAsText();
+ testRunner.waitUntilDone();
+}
+function test() {
+ if (window.localStorage.getItem("gum-after-reload") == null) {
+ window.localStorage.setItem("gum-after-reload", "true")
+ if (window.testRunner)
+ testRunner.setUserMediaPermission(false);
+ navigator.mediaDevices.getUserMedia({audio:true, video:true}).then(() => {
+ result.innerHTML = "FAIL";
+ if (window.testRunner)
+ testRunner.notifyDone();
+ },() => {
+ if (window.testRunner)
+ testRunner.setUserMediaPermission(true);
+ internals.forceReload(true);
+ });
+ } else {
+ window.localStorage.clear();
+ navigator.mediaDevices.getUserMedia({audio:true, video:true}).then(() => {
+ result.innerHTML = "PASS";
+ if (window.testRunner)
+ testRunner.notifyDone();
+ }, () => {
+ result.innerHTML = "FAIL";
+ if (window.testRunner)
+ testRunner.notifyDone();
+ });
+ };
+}
+</script>
+</head>
+<body _onload_="setTimeout(test, 0);">
+ <div>In case of reload, getUserMedia deny state should be reset</div>
+ <div id="result"></div>
+</body>
+</html>
+
+
Added: trunk/LayoutTests/fast/mediastream/getUserMedia-deny-persistency.html (0 => 217945)
--- trunk/LayoutTests/fast/mediastream/getUserMedia-deny-persistency.html (rev 0)
+++ trunk/LayoutTests/fast/mediastream/getUserMedia-deny-persistency.html 2017-06-08 20:37:49 UTC (rev 217945)
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <script src=""
+ <script src=""
+ </head>
+ <body>
+ <script>
+
+promise_test((test) => {
+ if (window.testRunner)
+ testRunner.setUserMediaPermission(false);
+ return navigator.mediaDevices.getUserMedia({audio:false, video:true}).then(assert_unreached, (e) => {
+ assert_equals(e.name, "NotAllowedError");
+ if (window.testRunner)
+ testRunner.setUserMediaPermission(true);
+ return navigator.mediaDevices.getUserMedia({audio:false, video:true}).then(assert_unreached, (e) => {
+ assert_equals(e.name, "NotAllowedError");
+ });
+ }).then(() => {
+ return navigator.mediaDevices.getUserMedia({audio:true, video:false});
+ }).then(() => {
+ return navigator.mediaDevices.getUserMedia({audio:false, video:true}).then(assert_unreached, (e) => {
+ assert_equals(e.name, "NotAllowedError");
+ });
+ }).then(() => {
+ return navigator.mediaDevices.getUserMedia({audio:true, video:true}).then(assert_unreached, (e) => {
+ assert_equals(e.name, "NotAllowedError");
+ });
+ });
+}, "Testing same page getUserMedia deny persistency with audio denied");
+ </script>
+ </body>
+</html>
Added: trunk/LayoutTests/fast/mediastream/getUserMedia-deny-persistency2-expected.txt (0 => 217945)
--- trunk/LayoutTests/fast/mediastream/getUserMedia-deny-persistency2-expected.txt (rev 0)
+++ trunk/LayoutTests/fast/mediastream/getUserMedia-deny-persistency2-expected.txt 2017-06-08 20:37:49 UTC (rev 217945)
@@ -0,0 +1,3 @@
+
+PASS Testing same page getUserMedia deny persistency with video denied
+
Added: trunk/LayoutTests/fast/mediastream/getUserMedia-deny-persistency2.html (0 => 217945)
--- trunk/LayoutTests/fast/mediastream/getUserMedia-deny-persistency2.html (rev 0)
+++ trunk/LayoutTests/fast/mediastream/getUserMedia-deny-persistency2.html 2017-06-08 20:37:49 UTC (rev 217945)
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <script src=""
+ <script src=""
+ </head>
+ <body>
+ <script>
+
+promise_test((test) => {
+ if (window.testRunner)
+ testRunner.setUserMediaPermission(false);
+ return navigator.mediaDevices.getUserMedia({audio:true, video:false}).then(assert_unreached, (e) => {
+ assert_equals(e.name, "NotAllowedError");
+ if (window.testRunner)
+ testRunner.setUserMediaPermission(true);
+ return navigator.mediaDevices.getUserMedia({audio:true, video:false}).then(assert_unreached, (e) => {
+ assert_equals(e.name, "NotAllowedError");
+ });
+ }).then(() => {
+ return navigator.mediaDevices.getUserMedia({audio:false, video:true});
+ }).then(() => {
+ return navigator.mediaDevices.getUserMedia({audio:true, video:false}).then(assert_unreached, (e) => {
+ assert_equals(e.name, "NotAllowedError");
+ });
+ }).then(() => {
+ return navigator.mediaDevices.getUserMedia({audio:true, video:true}).then(assert_unreached, (e) => {
+ assert_equals(e.name, "NotAllowedError");
+ });
+ });
+}, "Testing same page getUserMedia deny persistency with video denied");
+ </script>
+ </body>
+</html>
Added: trunk/LayoutTests/fast/mediastream/getUserMedia-deny-persistency3-expected.txt (0 => 217945)
--- trunk/LayoutTests/fast/mediastream/getUserMedia-deny-persistency3-expected.txt (rev 0)
+++ trunk/LayoutTests/fast/mediastream/getUserMedia-deny-persistency3-expected.txt 2017-06-08 20:37:49 UTC (rev 217945)
@@ -0,0 +1,3 @@
+
+PASS Testing same page getUserMedia deny persistency with audio and video denied
+
Added: trunk/LayoutTests/fast/mediastream/getUserMedia-deny-persistency3.html (0 => 217945)
--- trunk/LayoutTests/fast/mediastream/getUserMedia-deny-persistency3.html (rev 0)
+++ trunk/LayoutTests/fast/mediastream/getUserMedia-deny-persistency3.html 2017-06-08 20:37:49 UTC (rev 217945)
@@ -0,0 +1,28 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <script src=""
+ <script src=""
+ </head>
+ <body>
+ <script>
+
+promise_test((test) => {
+ if (window.testRunner)
+ testRunner.setUserMediaPermission(false);
+ return navigator.mediaDevices.getUserMedia({audio:true, video:true}).then(assert_unreached, (e) => {
+ assert_equals(e.name, "NotAllowedError");
+ if (window.testRunner)
+ testRunner.setUserMediaPermission(true);
+ return navigator.mediaDevices.getUserMedia({audio:true, video:false}).then(assert_unreached, (e) => {
+ assert_equals(e.name, "NotAllowedError");
+ });
+ }).then(() => {
+ return navigator.mediaDevices.getUserMedia({audio:true, video:false}).then(assert_unreached, (e) => {
+ assert_equals(e.name, "NotAllowedError");
+ });
+ });
+}, "Testing same page getUserMedia deny persistency with audio and video denied");
+ </script>
+ </body>
+</html>
Modified: trunk/LayoutTests/fast/mediastream/getUserMedia-grant-persistency-expected.txt (217944 => 217945)
--- trunk/LayoutTests/fast/mediastream/getUserMedia-grant-persistency-expected.txt 2017-06-08 20:08:24 UTC (rev 217944)
+++ trunk/LayoutTests/fast/mediastream/getUserMedia-grant-persistency-expected.txt 2017-06-08 20:37:49 UTC (rev 217945)
@@ -1,5 +1,3 @@
PASS Testing same page getUserMedia grant persistency
-PASS Testing same page getUserMedia grant persistency after in page navigation
-FAIL Testing same page getUserMedia grant persistency with visibility assert_true: Resolving getUserMedia promise should wait for page to be visible expected true got false
Modified: trunk/LayoutTests/fast/mediastream/getUserMedia-grant-persistency.html (217944 => 217945)
--- trunk/LayoutTests/fast/mediastream/getUserMedia-grant-persistency.html 2017-06-08 20:08:24 UTC (rev 217944)
+++ trunk/LayoutTests/fast/mediastream/getUserMedia-grant-persistency.html 2017-06-08 20:37:49 UTC (rev 217945)
@@ -5,9 +5,7 @@
<script src=""
</head>
<body>
- <div id="navigateToSamePage"></div>
<script>
-
promise_test((test) => {
if (window.testRunner)
testRunner.setUserMediaPermission(true);
@@ -16,10 +14,6 @@
testRunner.setUserMediaPermission(false);
return navigator.mediaDevices.getUserMedia({audio:false, video:true});
}).then(() => {
- return navigator.mediaDevices.getUserMedia({audio:true, video:false}).then(assert_unreached, (e) => {
- assert_equals(e.name, "NotAllowedError");
- });
- }).then(() => {
if (window.testRunner)
testRunner.setUserMediaPermission(true);
return navigator.mediaDevices.getUserMedia({audio:true, video:false});
@@ -29,42 +23,6 @@
return navigator.mediaDevices.getUserMedia({audio:true, video:true});
});
}, "Testing same page getUserMedia grant persistency");
-
-promise_test((test) => {
- if (window.testRunner)
- testRunner.setUserMediaPermission(true);
- return navigator.mediaDevices.getUserMedia({audio:false, video:true}).then((stream) => {
- if (window.testRunner)
- testRunner.setUserMediaPermission(false);
- return navigator.mediaDevices.getUserMedia({audio:false, video:true});
- }).then(() => {
- window.location = "#navigateToSamePage";
- }).then(() => {
- return navigator.mediaDevices.getUserMedia({audio:false, video:true});
- });
-}, "Testing same page getUserMedia grant persistency after in page navigation");
-
-promise_test((test) => {
- var isPageVisible = true;
- if (window.testRunner)
- testRunner.setUserMediaPermission(true);
- return navigator.mediaDevices.getUserMedia({audio:false, video:true}).then((stream) => {
- if (window.testRunner)
- testRunner.setUserMediaPermission(false);
- isPageVisible = false;
- if (window.testRunner)
- testRunner.setPageVisibility("hidden");
- setTimeout(() => {
- isPageVisible = true;
- if (window.testRunner)
- testRunner.setPageVisibility();
- }, 1000);
- return navigator.mediaDevices.getUserMedia({audio:false, video:true});
- }).then(() => {
- assert_true(isPageVisible, "Resolving getUserMedia promise should wait for page to be visible");
- });
-}, "Testing same page getUserMedia grant persistency with visibility");
-
</script>
</body>
</html>
Added: trunk/LayoutTests/fast/mediastream/getUserMedia-grant-persistency2-expected.txt (0 => 217945)
--- trunk/LayoutTests/fast/mediastream/getUserMedia-grant-persistency2-expected.txt (rev 0)
+++ trunk/LayoutTests/fast/mediastream/getUserMedia-grant-persistency2-expected.txt 2017-06-08 20:37:49 UTC (rev 217945)
@@ -0,0 +1,3 @@
+
+PASS Testing same page getUserMedia grant persistency after in page navigation
+
Added: trunk/LayoutTests/fast/mediastream/getUserMedia-grant-persistency2.html (0 => 217945)
--- trunk/LayoutTests/fast/mediastream/getUserMedia-grant-persistency2.html (rev 0)
+++ trunk/LayoutTests/fast/mediastream/getUserMedia-grant-persistency2.html 2017-06-08 20:37:49 UTC (rev 217945)
@@ -0,0 +1,26 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <script src=""
+ <script src=""
+ </head>
+ <body>
+ <div id="navigateToSamePage"></div>
+ <script>
+promise_test((test) => {
+ if (window.testRunner)
+ testRunner.setUserMediaPermission(true);
+ return navigator.mediaDevices.getUserMedia({audio:false, video:true}).then((stream) => {
+ if (window.testRunner)
+ testRunner.setUserMediaPermission(false);
+ return navigator.mediaDevices.getUserMedia({audio:false, video:true});
+ }).then(() => {
+ }).then(() => {
+ window.location = "#navigateToSamePage";
+ }).then(() => {
+ return navigator.mediaDevices.getUserMedia({audio:false, video:true});
+ });
+}, "Testing same page getUserMedia grant persistency after in page navigation");
+ </script>
+ </body>
+</html>
Added: trunk/LayoutTests/fast/mediastream/getUserMedia-grant-persistency3-expected.txt (0 => 217945)
--- trunk/LayoutTests/fast/mediastream/getUserMedia-grant-persistency3-expected.txt (rev 0)
+++ trunk/LayoutTests/fast/mediastream/getUserMedia-grant-persistency3-expected.txt 2017-06-08 20:37:49 UTC (rev 217945)
@@ -0,0 +1,3 @@
+
+PASS Testing same page getUserMedia grant persistency with visibility
+
Added: trunk/LayoutTests/fast/mediastream/getUserMedia-grant-persistency3.html (0 => 217945)
--- trunk/LayoutTests/fast/mediastream/getUserMedia-grant-persistency3.html (rev 0)
+++ trunk/LayoutTests/fast/mediastream/getUserMedia-grant-persistency3.html 2017-06-08 20:37:49 UTC (rev 217945)
@@ -0,0 +1,31 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <script src=""
+ <script src=""
+ </head>
+ <body>
+ <script>
+promise_test((test) => {
+ var isPageVisible = true;
+ if (window.testRunner)
+ testRunner.setUserMediaPermission(true);
+ return navigator.mediaDevices.getUserMedia({audio:false, video:true}).then((stream) => {
+ if (window.testRunner)
+ testRunner.setUserMediaPermission(false);
+ isPageVisible = false;
+ if (window.testRunner)
+ testRunner.setPageVisibility("hidden");
+ setTimeout(() => {
+ isPageVisible = true;
+ if (window.testRunner)
+ testRunner.setPageVisibility();
+ }, 1000);
+ return navigator.mediaDevices.getUserMedia({audio:false, video:true});
+ }).then(() => {
+ assert_true(isPageVisible, "Resolving getUserMedia promise should wait for page to be visible");
+ });
+}, "Testing same page getUserMedia grant persistency with visibility");
+ </script>
+ </body>
+</html>
Modified: trunk/Source/WebKit2/ChangeLog (217944 => 217945)
--- trunk/Source/WebKit2/ChangeLog 2017-06-08 20:08:24 UTC (rev 217944)
+++ trunk/Source/WebKit2/ChangeLog 2017-06-08 20:37:49 UTC (rev 217945)
@@ -1,3 +1,22 @@
+2017-06-08 Youenn Fablet <[email protected]>
+
+ getUserMedia should not be prompted again if user denied access
+ https://bugs.webkit.org/show_bug.cgi?id=173104
+
+ Reviewed by Geoff Garen.
+
+ Store denied requests to be able to replay them.
+ If mic is denied, user might be prompted for camera, not for mic and camera.
+ Same principle applies to the case of denied camera.
+ Clearing the stored denied requests when reloading/navigating away.
+
+ * UIProcess/UserMediaPermissionRequestManagerProxy.cpp:
+ (WebKit::UserMediaPermissionRequestManagerProxy::userMediaAccessWasDenied):
+ (WebKit::UserMediaPermissionRequestManagerProxy::resetAccess):
+ (WebKit::UserMediaPermissionRequestManagerProxy::isRequestDenied):
+ (WebKit::UserMediaPermissionRequestManagerProxy::requestUserMediaPermissionForFrame):
+ * UIProcess/UserMediaPermissionRequestManagerProxy.h:
+
2017-06-08 Jer Noble <[email protected]>
Clients of the WK2 C-API don't have their mediaContentTypesRequiringHardwareSupport setting initialized correctly.
Modified: trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestManagerProxy.cpp (217944 => 217945)
--- trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestManagerProxy.cpp 2017-06-08 20:08:24 UTC (rev 217944)
+++ trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestManagerProxy.cpp 2017-06-08 20:37:49 UTC (rev 217945)
@@ -127,6 +127,9 @@
if (!request)
return;
+ if (reason == UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::PermissionDenied)
+ m_deniedRequests.append(DeniedRequest { request->mainFrameID(), request->userMediaDocumentSecurityOrigin(), request->topLevelDocumentSecurityOrigin(), request->requiresAudio(), request->requiresVideo() });
+
denyRequest(userMediaID, reason, emptyString());
}
@@ -170,6 +173,7 @@
return grantedRequest->mainFrameID() == frameID;
});
m_pregrantedRequests.clear();
+ m_deniedRequests.clear();
}
const UserMediaPermissionRequestProxy* UserMediaPermissionRequestManagerProxy::searchForGrantedRequest(uint64_t frameID, const WebCore::SecurityOrigin& userMediaDocumentOrigin, const WebCore::SecurityOrigin& topLevelDocumentOrigin, bool needsAudio, bool needsVideo) const
@@ -201,6 +205,23 @@
return nullptr;
}
+bool UserMediaPermissionRequestManagerProxy::wasRequestDenied(uint64_t mainFrameID, const WebCore::SecurityOrigin& userMediaDocumentOrigin, const WebCore::SecurityOrigin& topLevelDocumentOrigin, bool needsAudio, bool needsVideo)
+{
+ for (const auto& deniedRequest : m_deniedRequests) {
+ if (!deniedRequest.userMediaDocumentOrigin->isSameSchemeHostPort(userMediaDocumentOrigin))
+ continue;
+ if (!deniedRequest.topLevelDocumentOrigin->isSameSchemeHostPort(topLevelDocumentOrigin))
+ continue;
+ if (deniedRequest.mainFrameID != mainFrameID)
+ continue;
+ if (deniedRequest.isAudioDenied && needsAudio)
+ return true;
+ if (deniedRequest.isVideoDenied && needsVideo)
+ return true;
+ }
+ return false;
+}
+
void UserMediaPermissionRequestManagerProxy::grantAccess(uint64_t userMediaID, const String& audioDeviceUID, const String& videoDeviceUID, const String& deviceIdentifierHashSalt)
{
UserMediaProcessManager::singleton().willCreateMediaStream(*this, !audioDeviceUID.isEmpty(), !videoDeviceUID.isEmpty());
@@ -255,6 +276,11 @@
return;
}
+ if (wasRequestDenied(m_page.mainFrame()->frameID(), userMediaDocumentOrigin.get(), topLevelDocumentOrigin.get(), !audioDeviceUIDs.isEmpty(), !videoDeviceUIDs.isEmpty())) {
+ denyRequest(userMediaID, UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::PermissionDenied, emptyString());
+ return;
+ }
+
auto* grantedRequest = searchForGrantedRequest(frameID, userMediaDocumentOrigin.get(), topLevelDocumentOrigin.get(), !audioDeviceUIDs.isEmpty(), !videoDeviceUIDs.isEmpty());
if (grantedRequest) {
if (m_page.isViewVisible())
Modified: trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestManagerProxy.h (217944 => 217945)
--- trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestManagerProxy.h 2017-06-08 20:08:24 UTC (rev 217944)
+++ trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestManagerProxy.h 2017-06-08 20:37:49 UTC (rev 217945)
@@ -70,6 +70,7 @@
void grantAccess(uint64_t userMediaID, const String& audioDeviceUID, const String& videoDeviceUID, const String& deviceIdentifierHashSalt);
const UserMediaPermissionRequestProxy* searchForGrantedRequest(uint64_t frameID, const WebCore::SecurityOrigin& userMediaDocumentOrigin, const WebCore::SecurityOrigin& topLevelDocumentOrigin, bool needsAudio, bool needsVideo) const;
+ bool wasRequestDenied(uint64_t mainFrameID, const WebCore::SecurityOrigin& userMediaDocumentOrigin, const WebCore::SecurityOrigin& topLevelDocumentOrigin, bool needsAudio, bool needsVideo);
#endif
void getUserMediaPermissionInfo(uint64_t userMediaID, uint64_t frameID, UserMediaPermissionCheckProxy::CompletionHandler&&, Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin);
@@ -85,6 +86,15 @@
Vector<Ref<UserMediaPermissionRequestProxy>> m_pregrantedRequests;
Vector<Ref<UserMediaPermissionRequestProxy>> m_grantedRequests;
+
+ struct DeniedRequest {
+ uint64_t mainFrameID;
+ Ref<WebCore::SecurityOrigin> userMediaDocumentOrigin;
+ Ref<WebCore::SecurityOrigin> topLevelDocumentOrigin;
+ bool isAudioDenied { false };
+ bool isVideoDenied { false };
+ };
+ Vector<DeniedRequest> m_deniedRequests;
};
} // namespace WebKit