Title: [234662] trunk/Source/WebKit
Revision
234662
Author
[email protected]
Date
2018-08-07 11:33:25 -0700 (Tue, 07 Aug 2018)

Log Message

NotReadableError when calling getUserMedia
https://bugs.webkit.org/show_bug.cgi?id=188309
<rdar://problem/42916838>

Reviewed by Brent Fulgham.

* UIProcess/UserMediaProcessManager.cpp:
(WebKit::UserMediaProcessManager::willCreateMediaStream): Deal with audio and video sandbox
extensions being issued at different times. Use new ProcessState methods.
(WebKit::UserMediaProcessManager::endedCaptureSession): Use new ProcessState methods.

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (234661 => 234662)


--- trunk/Source/WebKit/ChangeLog	2018-08-07 18:32:42 UTC (rev 234661)
+++ trunk/Source/WebKit/ChangeLog	2018-08-07 18:33:25 UTC (rev 234662)
@@ -1,3 +1,16 @@
+2018-08-07  Eric Carlson  <[email protected]>
+
+        NotReadableError when calling getUserMedia
+        https://bugs.webkit.org/show_bug.cgi?id=188309
+        <rdar://problem/42916838>
+
+        Reviewed by Brent Fulgham.
+
+        * UIProcess/UserMediaProcessManager.cpp:
+        (WebKit::UserMediaProcessManager::willCreateMediaStream): Deal with audio and video sandbox
+        extensions being issued at different times. Use new ProcessState methods.
+        (WebKit::UserMediaProcessManager::endedCaptureSession): Use new ProcessState methods.
+
 2018-08-07  Wenson Hsieh  <[email protected]>
 
         REGRESSION (r233778): Text selection sometimes cannot be extended in iframes

Modified: trunk/Source/WebKit/UIProcess/UserMediaProcessManager.cpp (234661 => 234662)


--- trunk/Source/WebKit/UIProcess/UserMediaProcessManager.cpp	2018-08-07 18:32:42 UTC (rev 234661)
+++ trunk/Source/WebKit/UIProcess/UserMediaProcessManager.cpp	2018-08-07 18:33:25 UTC (rev 234662)
@@ -44,18 +44,25 @@
     void removeRequestManager(UserMediaPermissionRequestManagerProxy&);
     Vector<UserMediaPermissionRequestManagerProxy*>& managers() { return m_managers; }
 
-    enum SandboxExtensionsGranted {
+    enum SandboxExtensionType : uint32_t {
         None = 0,
         Video = 1 << 0,
         Audio = 1 << 1
     };
+    typedef uint32_t SandboxExtensionsGranted;
 
-    SandboxExtensionsGranted sandboxExtensionsGranted() { return m_pageSandboxExtensionsGranted; }
-    void setSandboxExtensionsGranted(unsigned granted) { m_pageSandboxExtensionsGranted = static_cast<SandboxExtensionsGranted>(granted); }
+    bool hasVideoExtension() const { return m_pageSandboxExtensionsGranted & Video; }
+    void grantVideoExtension()  { m_pageSandboxExtensionsGranted |= Video; }
+    void revokeVideoExtension()  { m_pageSandboxExtensionsGranted &= ~Video; }
 
+    bool hasAudioExtension() const { return m_pageSandboxExtensionsGranted & Audio; }
+    void grantAudioExtension()  { m_pageSandboxExtensionsGranted |= Audio; }
+    void revokeAudioExtension()  { m_pageSandboxExtensionsGranted &= ~Audio; }
+
 private:
+
     Vector<UserMediaPermissionRequestManagerProxy*> m_managers;
-    SandboxExtensionsGranted m_pageSandboxExtensionsGranted { SandboxExtensionsGranted::None };
+    SandboxExtensionsGranted m_pageSandboxExtensionsGranted { SandboxExtensionType::None };
 };
 
 static HashMap<WebProcessProxy*, std::unique_ptr<ProcessState>>& stateMap()
@@ -128,6 +135,8 @@
 
 bool UserMediaProcessManager::willCreateMediaStream(UserMediaPermissionRequestManagerProxy& proxy, bool withAudio, bool withVideo)
 {
+    ASSERT(withAudio || withVideo);
+
     if (m_denyNextRequest) {
         m_denyNextRequest = false;
         return false;
@@ -143,20 +152,18 @@
 
     auto& state = processState(processStartingCapture);
     size_t extensionCount = 0;
-    unsigned requiredExtensions = ProcessState::SandboxExtensionsGranted::None;
 
-    if (withAudio) {
-        requiredExtensions |= ProcessState::SandboxExtensionsGranted::Audio;
+    if (withAudio && !state.hasAudioExtension())
         extensionCount++;
-    }
-    if (withVideo) {
-        requiredExtensions |= ProcessState::SandboxExtensionsGranted::Video;
+    else
+        withAudio = false;
+
+    if (withVideo && !state.hasVideoExtension())
         extensionCount++;
-    }
+    else
+        withVideo = false;
 
-    unsigned currentExtensions = state.sandboxExtensionsGranted();
-
-    if (!(requiredExtensions & currentExtensions)) {
+    if (extensionCount) {
         SandboxExtension::HandleArray handles;
         handles.allocate(extensionCount);
 
@@ -163,19 +170,11 @@
         Vector<String> ids;
         ids.reserveCapacity(extensionCount);
 
-        if (withAudio && requiredExtensions & ProcessState::SandboxExtensionsGranted::Audio) {
-            if (SandboxExtension::createHandleForGenericExtension(audioExtensionPath, handles[--extensionCount])) {
-                ids.append(audioExtensionPath);
-                currentExtensions |= ProcessState::SandboxExtensionsGranted::Audio;
-            }
-        }
+        if (withAudio && SandboxExtension::createHandleForGenericExtension(audioExtensionPath, handles[--extensionCount]))
+            ids.append(audioExtensionPath);
 
-        if (withVideo && requiredExtensions & ProcessState::SandboxExtensionsGranted::Video) {
-            if (SandboxExtension::createHandleForGenericExtension(videoExtensionPath, handles[--extensionCount])) {
-                ids.append(videoExtensionPath);
-                currentExtensions |= ProcessState::SandboxExtensionsGranted::Video;
-            }
-        }
+        if (withVideo && SandboxExtension::createHandleForGenericExtension(videoExtensionPath, handles[--extensionCount]))
+            ids.append(videoExtensionPath);
 
         if (ids.size() != handles.size()) {
             WTFLogAlways("Could not create a required sandbox extension, capture will fail!");
@@ -182,7 +181,10 @@
             return false;
         }
 
-        state.setSandboxExtensionsGranted(currentExtensions);
+        if (withAudio)
+            state.grantAudioExtension();
+        if (withVideo)
+            state.grantVideoExtension();
         processStartingCapture.send(Messages::WebPage::GrantUserMediaDeviceSandboxExtensions(MediaDeviceSandboxExtensions(ids, WTFMove(handles))), proxy.page().pageID());
     }
 #else
@@ -220,20 +222,18 @@
         return;
 
     Vector<String> params;
-    unsigned currentExtensions = state.sandboxExtensionsGranted();
-    if (!hasAudioCapture && currentExtensions & ProcessState::SandboxExtensionsGranted::Audio) {
+    if (!hasAudioCapture && state.hasAudioExtension()) {
         params.append(audioExtensionPath);
-        currentExtensions &= ~ProcessState::SandboxExtensionsGranted::Audio;
+        state.revokeAudioExtension();
     }
-    if (!hasVideoCapture && currentExtensions & ProcessState::SandboxExtensionsGranted::Video) {
+    if (!hasVideoCapture && state.hasVideoExtension()) {
         params.append(videoExtensionPath);
-        currentExtensions &= ~ProcessState::SandboxExtensionsGranted::Video;
+        state.revokeVideoExtension();
     }
 
     if (params.isEmpty())
         return;
 
-    state.setSandboxExtensionsGranted(currentExtensions);
     proxy.page().process().send(Messages::WebPage::RevokeUserMediaDeviceSandboxExtensions(params), proxy.page().pageID());
 #endif
 }
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to