Title: [217945] trunk
Revision
217945
Author
[email protected]
Date
2017-06-08 13:37:49 -0700 (Thu, 08 Jun 2017)

Log Message

getUserMedia should not be prompted again if user denied access
https://bugs.webkit.org/show_bug.cgi?id=173104

Patch by Youenn Fablet <[email protected]> on 2017-06-08
Reviewed by Geoff Garen.

Source/WebKit2:

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:

LayoutTests:

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.

Modified Paths

Added Paths

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
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to