Title: [242142] trunk/Source/WebKit
Revision
242142
Author
you...@apple.com
Date
2019-02-27 11:53:42 -0800 (Wed, 27 Feb 2019)

Log Message

Remove UserMediaProcessManager processState map
https://bugs.webkit.org/show_bug.cgi?id=195056

Reviewed by Eric Carlson.

Before the patch, the WebProcessProxy->ProcessState map was storing the list of manager proxies and process state.
To improve on this model, this patch does the following:
- Move the process state to WebProcessProxy.
- Remove the map and replace it by a set of all manager proxies.

This simplifies the handling.
On WebProcess side, instead of storing the sandbox extensions in each WebPage, we handle them in WebProcess directly.
This mirrors what is being done in UIProcess and reduces the risk of inconsistencies between the two, the risk being that capture would fail.

* UIProcess/UserMediaPermissionRequestManagerProxy.cpp:
(WebKit::UserMediaPermissionRequestManagerProxy::forEach):
(WebKit::UserMediaPermissionRequestManagerProxy::UserMediaPermissionRequestManagerProxy):
(WebKit::UserMediaPermissionRequestManagerProxy::~UserMediaPermissionRequestManagerProxy):
(WebKit::UserMediaPermissionRequestManagerProxy::captureStateChanged):
* UIProcess/UserMediaPermissionRequestManagerProxy.h:
* UIProcess/UserMediaProcessManager.cpp:
(WebKit::UserMediaProcessManager::muteCaptureMediaStreamsExceptIn):
(WebKit::UserMediaProcessManager::willCreateMediaStream):
(WebKit::UserMediaProcessManager::endedCaptureSession):
(WebKit::UserMediaProcessManager::setCaptureEnabled):
(WebKit::UserMediaProcessManager::captureDevicesChanged):
(WebKit::ProcessState::ProcessState): Deleted.
(WebKit::ProcessState::hasVideoExtension const): Deleted.
(WebKit::ProcessState::grantVideoExtension): Deleted.
(WebKit::ProcessState::revokeVideoExtension): Deleted.
(WebKit::ProcessState::hasAudioExtension const): Deleted.
(WebKit::ProcessState::grantAudioExtension): Deleted.
(WebKit::ProcessState::revokeAudioExtension): Deleted.
(WebKit::stateMap): Deleted.
(WebKit::processState): Deleted.
(WebKit::ProcessState::addRequestManager): Deleted.
(WebKit::ProcessState::removeRequestManager): Deleted.
(WebKit::UserMediaProcessManager::addUserMediaPermissionRequestManagerProxy): Deleted.
(WebKit::UserMediaProcessManager::removeUserMediaPermissionRequestManagerProxy): Deleted.
(WebKit::UserMediaProcessManager::startedCaptureSession): Deleted.
* UIProcess/UserMediaProcessManager.h:
* UIProcess/WebProcessProxy.h:
(WebKit::WebProcessProxy::mediaCaptureSandboxExtensions const):
(WebKit::WebProcessProxy::hasVideoCaptureExtension const):
(WebKit::WebProcessProxy::grantVideoCaptureExtension):
(WebKit::WebProcessProxy::revokeVideoCaptureExtension):
(WebKit::WebProcessProxy::hasAudioCaptureExtension const):
(WebKit::WebProcessProxy::grantAudioCaptureExtension):
(WebKit::WebProcessProxy::revokeAudioCaptureExtension):
* WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp:
(WebKit::UserMediaPermissionRequestManager::~UserMediaPermissionRequestManager): Deleted.
(WebKit::UserMediaPermissionRequestManager::clear): Deleted.
(WebKit::UserMediaPermissionRequestManager::grantUserMediaDeviceSandboxExtensions): Deleted.
(WebKit::UserMediaPermissionRequestManager::revokeUserMediaDeviceSandboxExtensions): Deleted.
* WebProcess/MediaStream/UserMediaPermissionRequestManager.h:
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::close):
(WebKit::WebPage::grantUserMediaDeviceSandboxExtensions): Deleted.
(WebKit::WebPage::revokeUserMediaDeviceSandboxExtensions): Deleted.
* WebProcess/WebPage/WebPage.h:
* WebProcess/WebPage/WebPage.messages.in:
* WebProcess/WebProcess.cpp:
(WebKit::WebProcess::grantUserMediaDeviceSandboxExtensions):
(WebKit::WebProcess::revokeUserMediaDeviceSandboxExtensions):
* WebProcess/WebProcess.h:
* WebProcess/WebProcess.messages.in:

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (242141 => 242142)


--- trunk/Source/WebKit/ChangeLog	2019-02-27 19:47:53 UTC (rev 242141)
+++ trunk/Source/WebKit/ChangeLog	2019-02-27 19:53:42 UTC (rev 242142)
@@ -1,3 +1,72 @@
+2019-02-27  Youenn Fablet  <you...@apple.com>
+
+        Remove UserMediaProcessManager processState map
+        https://bugs.webkit.org/show_bug.cgi?id=195056
+
+        Reviewed by Eric Carlson.
+
+        Before the patch, the WebProcessProxy->ProcessState map was storing the list of manager proxies and process state.
+        To improve on this model, this patch does the following:
+        - Move the process state to WebProcessProxy.
+        - Remove the map and replace it by a set of all manager proxies.
+
+        This simplifies the handling.
+        On WebProcess side, instead of storing the sandbox extensions in each WebPage, we handle them in WebProcess directly.
+        This mirrors what is being done in UIProcess and reduces the risk of inconsistencies between the two, the risk being that capture would fail.
+
+        * UIProcess/UserMediaPermissionRequestManagerProxy.cpp:
+        (WebKit::UserMediaPermissionRequestManagerProxy::forEach):
+        (WebKit::UserMediaPermissionRequestManagerProxy::UserMediaPermissionRequestManagerProxy):
+        (WebKit::UserMediaPermissionRequestManagerProxy::~UserMediaPermissionRequestManagerProxy):
+        (WebKit::UserMediaPermissionRequestManagerProxy::captureStateChanged):
+        * UIProcess/UserMediaPermissionRequestManagerProxy.h:
+        * UIProcess/UserMediaProcessManager.cpp:
+        (WebKit::UserMediaProcessManager::muteCaptureMediaStreamsExceptIn):
+        (WebKit::UserMediaProcessManager::willCreateMediaStream):
+        (WebKit::UserMediaProcessManager::endedCaptureSession):
+        (WebKit::UserMediaProcessManager::setCaptureEnabled):
+        (WebKit::UserMediaProcessManager::captureDevicesChanged):
+        (WebKit::ProcessState::ProcessState): Deleted.
+        (WebKit::ProcessState::hasVideoExtension const): Deleted.
+        (WebKit::ProcessState::grantVideoExtension): Deleted.
+        (WebKit::ProcessState::revokeVideoExtension): Deleted.
+        (WebKit::ProcessState::hasAudioExtension const): Deleted.
+        (WebKit::ProcessState::grantAudioExtension): Deleted.
+        (WebKit::ProcessState::revokeAudioExtension): Deleted.
+        (WebKit::stateMap): Deleted.
+        (WebKit::processState): Deleted.
+        (WebKit::ProcessState::addRequestManager): Deleted.
+        (WebKit::ProcessState::removeRequestManager): Deleted.
+        (WebKit::UserMediaProcessManager::addUserMediaPermissionRequestManagerProxy): Deleted.
+        (WebKit::UserMediaProcessManager::removeUserMediaPermissionRequestManagerProxy): Deleted.
+        (WebKit::UserMediaProcessManager::startedCaptureSession): Deleted.
+        * UIProcess/UserMediaProcessManager.h:
+        * UIProcess/WebProcessProxy.h:
+        (WebKit::WebProcessProxy::mediaCaptureSandboxExtensions const):
+        (WebKit::WebProcessProxy::hasVideoCaptureExtension const):
+        (WebKit::WebProcessProxy::grantVideoCaptureExtension):
+        (WebKit::WebProcessProxy::revokeVideoCaptureExtension):
+        (WebKit::WebProcessProxy::hasAudioCaptureExtension const):
+        (WebKit::WebProcessProxy::grantAudioCaptureExtension):
+        (WebKit::WebProcessProxy::revokeAudioCaptureExtension):
+        * WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp:
+        (WebKit::UserMediaPermissionRequestManager::~UserMediaPermissionRequestManager): Deleted.
+        (WebKit::UserMediaPermissionRequestManager::clear): Deleted.
+        (WebKit::UserMediaPermissionRequestManager::grantUserMediaDeviceSandboxExtensions): Deleted.
+        (WebKit::UserMediaPermissionRequestManager::revokeUserMediaDeviceSandboxExtensions): Deleted.
+        * WebProcess/MediaStream/UserMediaPermissionRequestManager.h:
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::close):
+        (WebKit::WebPage::grantUserMediaDeviceSandboxExtensions): Deleted.
+        (WebKit::WebPage::revokeUserMediaDeviceSandboxExtensions): Deleted.
+        * WebProcess/WebPage/WebPage.h:
+        * WebProcess/WebPage/WebPage.messages.in:
+        * WebProcess/WebProcess.cpp:
+        (WebKit::WebProcess::grantUserMediaDeviceSandboxExtensions):
+        (WebKit::WebProcess::revokeUserMediaDeviceSandboxExtensions):
+        * WebProcess/WebProcess.h:
+        * WebProcess/WebProcess.messages.in:
+
 2019-02-27  Per Arne Vollan  <pvol...@apple.com>
 
         [macOS] Disable permissive call logging in sandbox

Modified: trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp (242141 => 242142)


--- trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp	2019-02-27 19:47:53 UTC (rev 242141)
+++ trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp	2019-02-27 19:53:42 UTC (rev 242142)
@@ -51,6 +51,20 @@
 }
 #endif
 
+#if ENABLE(MEDIA_STREAM)
+static HashSet<UserMediaPermissionRequestManagerProxy*>& proxies()
+{
+    static NeverDestroyed<HashSet<UserMediaPermissionRequestManagerProxy*>> set;
+    return set;
+}
+
+void UserMediaPermissionRequestManagerProxy::forEach(const WTF::Function<void(UserMediaPermissionRequestManagerProxy&)>& function)
+{
+    for (auto* proxy : proxies())
+        function(*proxy);
+}
+#endif
+
 UserMediaPermissionRequestManagerProxy::UserMediaPermissionRequestManagerProxy(WebPageProxy& page)
     : m_page(page)
     , m_rejectionTimer(RunLoop::main(), this, &UserMediaPermissionRequestManagerProxy::rejectionTimerFired)
@@ -57,7 +71,7 @@
     , m_watchdogTimer(RunLoop::main(), this, &UserMediaPermissionRequestManagerProxy::watchdogTimerFired)
 {
 #if ENABLE(MEDIA_STREAM)
-    UserMediaProcessManager::singleton().addUserMediaPermissionRequestManagerProxy(*this);
+    proxies().add(this);
 #endif
 }
 
@@ -64,7 +78,8 @@
 UserMediaPermissionRequestManagerProxy::~UserMediaPermissionRequestManagerProxy()
 {
 #if ENABLE(MEDIA_STREAM)
-    UserMediaProcessManager::singleton().removeUserMediaPermissionRequestManagerProxy(*this);
+    UserMediaProcessManager::singleton().endedCaptureSession(*this);
+    proxies().remove(this);
 #endif
     invalidatePendingRequests();
 }
@@ -592,8 +607,6 @@
 
     if ((wasCapturingAudio && !isCapturingAudio) || (wasCapturingVideo && !isCapturingVideo))
         UserMediaProcessManager::singleton().endedCaptureSession(*this);
-    if ((!wasCapturingAudio && isCapturingAudio) || (!wasCapturingVideo && isCapturingVideo))
-        UserMediaProcessManager::singleton().startedCaptureSession(*this);
 
     if (m_captureState == (newState & activeCaptureMask))
         return;

Modified: trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.h (242141 => 242142)


--- trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.h	2019-02-27 19:47:53 UTC (rev 242141)
+++ trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.h	2019-02-27 19:53:42 UTC (rev 242142)
@@ -47,6 +47,10 @@
 
     WebPageProxy& page() const { return m_page; }
 
+#if ENABLE(MEDIA_STREAM)
+    static void forEach(const WTF::Function<void(UserMediaPermissionRequestManagerProxy&)>&);
+#endif
+
     void invalidatePendingRequests();
 
     void requestUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, Ref<WebCore::SecurityOrigin>&&  userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin, WebCore::MediaStreamRequest&&);

Modified: trunk/Source/WebKit/UIProcess/UserMediaProcessManager.cpp (242141 => 242142)


--- trunk/Source/WebKit/UIProcess/UserMediaProcessManager.cpp	2019-02-27 19:47:53 UTC (rev 242141)
+++ trunk/Source/WebKit/UIProcess/UserMediaProcessManager.cpp	2019-02-27 19:53:42 UTC (rev 242142)
@@ -23,8 +23,8 @@
 
 #include "Logging.h"
 #include "MediaDeviceSandboxExtensions.h"
-#include "WebPageMessages.h"
 #include "WebPageProxy.h"
+#include "WebProcessMessages.h"
 #include "WebProcessProxy.h"
 #include <WebCore/RealtimeMediaSourceCenter.h>
 #include <wtf/HashMap.h>
@@ -39,66 +39,6 @@
 
 static const Seconds deviceChangeDebounceTimerInterval { 200_ms };
 
-class ProcessState {
-public:
-    ProcessState() { }
-    ProcessState(const ProcessState&) = delete;
-
-    void addRequestManager(UserMediaPermissionRequestManagerProxy&);
-    void removeRequestManager(UserMediaPermissionRequestManagerProxy&);
-    Vector<UserMediaPermissionRequestManagerProxy*>& managers() { return m_managers; }
-
-    enum SandboxExtensionType : uint32_t {
-        None = 0,
-        Video = 1 << 0,
-        Audio = 1 << 1
-    };
-    typedef uint32_t SandboxExtensionsGranted;
-
-    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 { SandboxExtensionType::None };
-};
-
-static HashMap<WebProcessProxy*, std::unique_ptr<ProcessState>>& stateMap()
-{
-    static NeverDestroyed<HashMap<WebProcessProxy*, std::unique_ptr<ProcessState>>> map;
-    return map;
-}
-
-static ProcessState& processState(WebProcessProxy& process)
-{
-    auto& state = stateMap().add(&process, nullptr).iterator->value;
-    if (state)
-        return *state;
-
-    state = std::make_unique<ProcessState>();
-    return *state;
-}
-
-void ProcessState::addRequestManager(UserMediaPermissionRequestManagerProxy& proxy)
-{
-    ASSERT(!m_managers.contains(&proxy));
-    m_managers.append(&proxy);
-}
-
-void ProcessState::removeRequestManager(UserMediaPermissionRequestManagerProxy& proxy)
-{
-    ASSERT(m_managers.contains(&proxy));
-    m_managers.removeFirstMatching([&proxy](auto other) {
-        return other == &proxy;
-    });
-}
-
 UserMediaProcessManager& UserMediaProcessManager::singleton()
 {
     static NeverDestroyed<UserMediaProcessManager> manager;
@@ -110,33 +50,13 @@
 {
 }
 
-void UserMediaProcessManager::addUserMediaPermissionRequestManagerProxy(UserMediaPermissionRequestManagerProxy& proxy)
-{
-    processState(proxy.page().process()).addRequestManager(proxy);
-}
-
-void UserMediaProcessManager::removeUserMediaPermissionRequestManagerProxy(UserMediaPermissionRequestManagerProxy& proxy)
-{
-    endedCaptureSession(proxy);
-
-    auto& state = processState(proxy.page().process());
-    state.removeRequestManager(proxy);
-    if (state.managers().isEmpty()) {
-        auto it = stateMap().find(&proxy.page().process());
-        stateMap().remove(it);
-    }
-}
-
 void UserMediaProcessManager::muteCaptureMediaStreamsExceptIn(WebPageProxy& pageStartingCapture)
 {
 #if PLATFORM(COCOA)
-    for (auto& state : stateMap()) {
-        for (auto& manager : state.value->managers()) {
-            if (&manager->page() == &pageStartingCapture)
-                continue;
-            manager->page().setMediaStreamCaptureMuted(true);
-        }
-    }
+    UserMediaPermissionRequestManagerProxy::forEach([&pageStartingCapture](auto& proxy) {
+        if (&proxy.page() != &pageStartingCapture)
+            proxy.page().setMediaStreamCaptureMuted(true);
+    });
 #else
     UNUSED_PARAM(pageStartingCapture);
 #endif
@@ -151,53 +71,48 @@
         return false;
     }
     
-    if (proxy.page().preferences().mockCaptureDevicesEnabled())
-        return true;
-    
 #if ENABLE(SANDBOX_EXTENSIONS) && USE(APPLE_INTERNAL_SDK)
-    auto& processStartingCapture = proxy.page().process();
+    if (!proxy.page().preferences().mockCaptureDevicesEnabled()) {
+        auto& process = proxy.page().process();
+        size_t extensionCount = 0;
 
-    ASSERT(stateMap().contains(&processStartingCapture));
+        if (withAudio && !process.hasAudioCaptureExtension())
+            extensionCount++;
+        else
+            withAudio = false;
 
-    auto& state = processState(processStartingCapture);
-    size_t extensionCount = 0;
+        if (withVideo && !process.hasVideoCaptureExtension())
+            extensionCount++;
+        else
+            withVideo = false;
 
-    if (withAudio && !state.hasAudioExtension())
-        extensionCount++;
-    else
-        withAudio = false;
+        if (extensionCount) {
+            SandboxExtension::HandleArray handles;
+            handles.allocate(extensionCount);
 
-    if (withVideo && !state.hasVideoExtension())
-        extensionCount++;
-    else
-        withVideo = false;
+            Vector<String> ids;
+            ids.reserveCapacity(extensionCount);
 
-    if (extensionCount) {
-        SandboxExtension::HandleArray handles;
-        handles.allocate(extensionCount);
+            if (withAudio && SandboxExtension::createHandleForGenericExtension(audioExtensionPath, handles[--extensionCount]))
+                ids.append(audioExtensionPath);
 
-        Vector<String> ids;
-        ids.reserveCapacity(extensionCount);
+            if (withVideo && SandboxExtension::createHandleForGenericExtension(videoExtensionPath, handles[--extensionCount]))
+                ids.append(videoExtensionPath);
 
-        if (withAudio && SandboxExtension::createHandleForGenericExtension(audioExtensionPath, handles[--extensionCount]))
-            ids.append(audioExtensionPath);
+            if (ids.size() != handles.size()) {
+                WTFLogAlways("Could not create a required sandbox extension, capture will fail!");
+                return false;
+            }
 
-        if (withVideo && SandboxExtension::createHandleForGenericExtension(videoExtensionPath, handles[--extensionCount]))
-            ids.append(videoExtensionPath);
+            for (const auto& id : ids)
+                RELEASE_LOG(WebRTC, "UserMediaProcessManager::willCreateMediaStream - granting extension %s", id.utf8().data());
 
-        if (ids.size() != handles.size()) {
-            WTFLogAlways("Could not create a required sandbox extension, capture will fail!");
-            return false;
+            if (withAudio)
+                process.grantAudioCaptureExtension();
+            if (withVideo)
+                process.grantVideoCaptureExtension();
+            process.send(Messages::WebProcess::GrantUserMediaDeviceSandboxExtensions(MediaDeviceSandboxExtensions(ids, WTFMove(handles))), proxy.page().pageID());
         }
-
-        for (const auto& id : ids)
-            RELEASE_LOG(WebRTC, "UserMediaProcessManager::willCreateMediaStream - granting extension %s", id.utf8().data());
-
-        if (withAudio)
-            state.grantAudioExtension();
-        if (withVideo)
-            state.grantVideoExtension();
-        processStartingCapture.send(Messages::WebPage::GrantUserMediaDeviceSandboxExtensions(MediaDeviceSandboxExtensions(ids, WTFMove(handles))), proxy.page().pageID());
     }
 #else
     UNUSED_PARAM(proxy);
@@ -210,39 +125,33 @@
     return true;
 }
 
-void UserMediaProcessManager::startedCaptureSession(UserMediaPermissionRequestManagerProxy& proxy)
-{
-    ASSERT(stateMap().contains(&proxy.page().process()));
-}
-
 void UserMediaProcessManager::endedCaptureSession(UserMediaPermissionRequestManagerProxy& proxy)
 {
 #if ENABLE(SANDBOX_EXTENSIONS)
-    ASSERT(stateMap().contains(&proxy.page().process()));
-
-    auto& state = processState(proxy.page().process());
     bool hasAudioCapture = false;
     bool hasVideoCapture = false;
-    for (auto& manager : state.managers()) {
-        if (manager == &proxy)
-            continue;
-        if (manager->page().hasActiveAudioStream())
+
+    auto& process = proxy.page().process();
+    UserMediaPermissionRequestManagerProxy::forEach([&hasAudioCapture, &hasVideoCapture, &proxy, &process](auto& managerProxy) {
+        if (&proxy == &managerProxy || &process != &managerProxy.page().process())
+            return;
+        if (managerProxy.page().hasActiveAudioStream())
             hasAudioCapture = true;
-        if (manager->page().hasActiveVideoStream())
+        if (managerProxy.page().hasActiveVideoStream())
             hasVideoCapture = true;
-    }
+    });
 
     if (hasAudioCapture && hasVideoCapture)
         return;
 
     Vector<String> params;
-    if (!hasAudioCapture && state.hasAudioExtension()) {
+    if (!hasAudioCapture && process.hasAudioCaptureExtension()) {
         params.append(audioExtensionPath);
-        state.revokeAudioExtension();
+        process.revokeAudioCaptureExtension();
     }
-    if (!hasVideoCapture && state.hasVideoExtension()) {
+    if (!hasVideoCapture && process.hasVideoCaptureExtension()) {
         params.append(videoExtensionPath);
-        state.revokeVideoExtension();
+        process.revokeVideoCaptureExtension();
     }
 
     if (params.isEmpty())
@@ -251,7 +160,7 @@
     for (const auto& id : params)
         RELEASE_LOG(WebRTC, "UserMediaProcessManager::endedCaptureSession - revoking extension %s", id.utf8().data());
 
-    proxy.page().process().send(Messages::WebPage::RevokeUserMediaDeviceSandboxExtensions(params), proxy.page().pageID());
+    process.send(Messages::WebProcess::RevokeUserMediaDeviceSandboxExtensions(params), proxy.page().pageID());
 #endif
 }
 
@@ -265,23 +174,16 @@
     if (enabled)
         return;
 
-    for (auto& state : stateMap()) {
-        for (auto& manager : state.value->managers())
-            manager->stopCapture();
-    }
+    UserMediaPermissionRequestManagerProxy::forEach([](auto& proxy) {
+        proxy.stopCapture();
+    });
 }
 
 void UserMediaProcessManager::captureDevicesChanged()
 {
-    auto& map = stateMap();
-    for (auto& state : map) {
-        auto* process = state.key;
-        for (auto& manager : state.value->managers()) {
-            if (map.find(process) == map.end())
-                break;
-            manager->captureDevicesChanged();
-        }
-    }
+    UserMediaPermissionRequestManagerProxy::forEach([](auto& proxy) {
+        proxy.captureDevicesChanged();
+    });
 }
 
 void UserMediaProcessManager::beginMonitoringCaptureDevices()

Modified: trunk/Source/WebKit/UIProcess/UserMediaProcessManager.h (242141 => 242142)


--- trunk/Source/WebKit/UIProcess/UserMediaProcessManager.h	2019-02-27 19:47:53 UTC (rev 242141)
+++ trunk/Source/WebKit/UIProcess/UserMediaProcessManager.h	2019-02-27 19:53:42 UTC (rev 242142)
@@ -35,13 +35,9 @@
 
     UserMediaProcessManager();
 
-    void addUserMediaPermissionRequestManagerProxy(UserMediaPermissionRequestManagerProxy&);
-    void removeUserMediaPermissionRequestManagerProxy(UserMediaPermissionRequestManagerProxy&);
-
     bool willCreateMediaStream(UserMediaPermissionRequestManagerProxy&, bool withAudio, bool withVideo);
     void muteCaptureMediaStreamsExceptIn(WebPageProxy&);
 
-    void startedCaptureSession(UserMediaPermissionRequestManagerProxy&);
     void endedCaptureSession(UserMediaPermissionRequestManagerProxy&);
 
     void setCaptureEnabled(bool);

Modified: trunk/Source/WebKit/UIProcess/WebProcessProxy.h (242141 => 242142)


--- trunk/Source/WebKit/UIProcess/WebProcessProxy.h	2019-02-27 19:47:53 UTC (rev 242141)
+++ trunk/Source/WebKit/UIProcess/WebProcessProxy.h	2019-02-27 19:53:42 UTC (rev 242142)
@@ -269,6 +269,24 @@
     void sendProcessDidResume() override;
     void didSetAssertionState(AssertionState) override;
 
+#if PLATFORM(COCOA)
+    enum SandboxExtensionType : uint32_t {
+        None = 0,
+        Video = 1 << 0,
+        Audio = 1 << 1
+    };
+
+    typedef uint32_t MediaCaptureSandboxExtensions;
+
+    bool hasVideoCaptureExtension() const { return m_mediaCaptureSandboxExtensions & Video; }
+    void grantVideoCaptureExtension() { m_mediaCaptureSandboxExtensions |= Video; }
+    void revokeVideoCaptureExtension() { m_mediaCaptureSandboxExtensions &= ~Video; }
+
+    bool hasAudioCaptureExtension() const { return m_mediaCaptureSandboxExtensions & Audio; }
+    void grantAudioCaptureExtension() { m_mediaCaptureSandboxExtensions |= Audio; }
+    void revokeAudioCaptureExtension() { m_mediaCaptureSandboxExtensions &= ~Audio; }
+#endif
+
 protected:
     static uint64_t generatePageID();
     WebProcessProxy(WebProcessPool&, WebsiteDataStore&, IsPrewarmed);
@@ -439,6 +457,10 @@
 #if PLATFORM(WATCHOS)
     ProcessThrottler::BackgroundActivityToken m_backgroundActivityTokenForFullscreenFormControls;
 #endif
+
+#if PLATFORM(COCOA)
+    MediaCaptureSandboxExtensions m_mediaCaptureSandboxExtensions { SandboxExtensionType::None };
+#endif
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp (242141 => 242142)


--- trunk/Source/WebKit/WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp	2019-02-27 19:47:53 UTC (rev 242141)
+++ trunk/Source/WebKit/WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp	2019-02-27 19:53:42 UTC (rev 242142)
@@ -51,17 +51,6 @@
 {
 }
 
-UserMediaPermissionRequestManager::~UserMediaPermissionRequestManager()
-{
-    clear();
-}
-
-void UserMediaPermissionRequestManager::clear()
-{
-    for (auto& sandboxExtension : m_userMediaDeviceSandboxExtensions)
-        sandboxExtension.value->revoke();
-}
-
 void UserMediaPermissionRequestManager::startUserMediaRequest(UserMediaRequest& request)
 {
     Document* document = request.document();
@@ -209,27 +198,6 @@
     request->setDeviceInfo(deviceList, WTFMove(mediaDeviceIdentifierHashSalt), hasPersistentAccess);
 }
 
-void UserMediaPermissionRequestManager::grantUserMediaDeviceSandboxExtensions(MediaDeviceSandboxExtensions&& extensions)
-{
-    for (size_t i = 0; i < extensions.size(); i++) {
-        const auto& extension = extensions[i];
-        extension.second->consume();
-        RELEASE_LOG(WebRTC, "UserMediaPermissionRequestManager::grantUserMediaDeviceSandboxExtensions - granted extension %s", extension.first.utf8().data());
-        m_userMediaDeviceSandboxExtensions.add(extension.first, extension.second.copyRef());
-    }
-}
-
-void UserMediaPermissionRequestManager::revokeUserMediaDeviceSandboxExtensions(const Vector<String>& extensionIDs)
-{
-    for (const auto& extensionID : extensionIDs) {
-        auto extension = m_userMediaDeviceSandboxExtensions.take(extensionID);
-        if (extension) {
-            extension->revoke();
-            RELEASE_LOG(WebRTC, "UserMediaPermissionRequestManager::revokeUserMediaDeviceSandboxExtensions - revoked extension %s", extensionID.utf8().data());
-        }
-    }
-}
-
 UserMediaClient::DeviceChangeObserverToken UserMediaPermissionRequestManager::addDeviceChangeObserver(WTF::Function<void()>&& observer)
 {
     auto identifier = WebCore::UserMediaClient::DeviceChangeObserverToken::generate();

Modified: trunk/Source/WebKit/WebProcess/MediaStream/UserMediaPermissionRequestManager.h (242141 => 242142)


--- trunk/Source/WebKit/WebProcess/MediaStream/UserMediaPermissionRequestManager.h	2019-02-27 19:47:53 UTC (rev 242141)
+++ trunk/Source/WebKit/WebProcess/MediaStream/UserMediaPermissionRequestManager.h	2019-02-27 19:53:42 UTC (rev 242142)
@@ -21,7 +21,6 @@
 
 #if ENABLE(MEDIA_STREAM)
 
-#include "MediaDeviceSandboxExtensions.h"
 #include "SandboxExtension.h"
 #include <WebCore/MediaCanStartListener.h>
 #include <WebCore/MediaConstraints.h>
@@ -39,7 +38,7 @@
 class UserMediaPermissionRequestManager : public CanMakeWeakPtr<UserMediaPermissionRequestManager>, private WebCore::MediaCanStartListener {
 public:
     explicit UserMediaPermissionRequestManager(WebPage&);
-    ~UserMediaPermissionRequestManager();
+    ~UserMediaPermissionRequestManager() = default;
 
     void startUserMediaRequest(WebCore::UserMediaRequest&);
     void cancelUserMediaRequest(WebCore::UserMediaRequest&);
@@ -50,14 +49,10 @@
     void cancelMediaDevicesEnumeration(WebCore::MediaDevicesEnumerationRequest&);
     void didCompleteMediaDeviceEnumeration(uint64_t, const Vector<WebCore::CaptureDevice>& deviceList, String&& deviceIdentifierHashSalt, bool originHasPersistentAccess);
 
-    void grantUserMediaDeviceSandboxExtensions(MediaDeviceSandboxExtensions&&);
-    void revokeUserMediaDeviceSandboxExtensions(const Vector<String>&);
-
     WebCore::UserMediaClient::DeviceChangeObserverToken addDeviceChangeObserver(WTF::Function<void()>&&);
     void removeDeviceChangeObserver(WebCore::UserMediaClient::DeviceChangeObserverToken);
 
     void captureDevicesChanged();
-    void clear();
 
 private:
     void sendUserMediaRequest(WebCore::UserMediaRequest&);
@@ -76,8 +71,6 @@
     HashMap<uint64_t, RefPtr<WebCore::MediaDevicesEnumerationRequest>> m_idToMediaDevicesEnumerationRequestMap;
     HashMap<RefPtr<WebCore::MediaDevicesEnumerationRequest>, uint64_t> m_mediaDevicesEnumerationRequestToIDMap;
 
-    HashMap<String, RefPtr<SandboxExtension>> m_userMediaDeviceSandboxExtensions;
-
     HashMap<WebCore::UserMediaClient::DeviceChangeObserverToken, WTF::Function<void()>> m_deviceChangeObserverMap;
     bool m_monitoringDeviceChange { false };
 };

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp (242141 => 242142)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2019-02-27 19:47:53 UTC (rev 242141)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2019-02-27 19:53:42 UTC (rev 242142)
@@ -1255,10 +1255,6 @@
 
     m_page->inspectorController().disconnectAllFrontends();
 
-#if ENABLE(MEDIA_STREAM)
-    m_userMediaPermissionRequestManager->clear();
-#endif
-
 #if ENABLE(FULLSCREEN_API)
     m_fullScreenManager = nullptr;
 #endif
@@ -4082,18 +4078,7 @@
     m_userMediaPermissionRequestManager->captureDevicesChanged();
 }
 
-#if ENABLE(SANDBOX_EXTENSIONS)
-void WebPage::grantUserMediaDeviceSandboxExtensions(MediaDeviceSandboxExtensions&& extensions)
-{
-    m_userMediaPermissionRequestManager->grantUserMediaDeviceSandboxExtensions(WTFMove(extensions));
-}
-
-void WebPage::revokeUserMediaDeviceSandboxExtensions(const Vector<String>& extensionIDs)
-{
-    m_userMediaPermissionRequestManager->revokeUserMediaDeviceSandboxExtensions(extensionIDs);
-}
 #endif
-#endif
 
 #if !PLATFORM(IOS_FAMILY)
 void WebPage::advanceToNextMisspelling(bool startBeforeSelection)

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.h (242141 => 242142)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2019-02-27 19:47:53 UTC (rev 242141)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2019-02-27 19:53:42 UTC (rev 242142)
@@ -1396,11 +1396,6 @@
     void didCompleteMediaDeviceEnumeration(uint64_t userMediaID, const Vector<WebCore::CaptureDevice>& devices, String&& deviceIdentifierHashSalt, bool originHasPersistentAccess);
 #endif
 
-#if ENABLE(MEDIA_STREAM) && ENABLE(SANDBOX_EXTENSIONS)
-    void grantUserMediaDeviceSandboxExtensions(MediaDeviceSandboxExtensions&&);
-    void revokeUserMediaDeviceSandboxExtensions(const Vector<String>&);
-#endif
-
 #if ENABLE(WEB_RTC)
     void disableICECandidateFiltering();
     void enableICECandidateFiltering();

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in (242141 => 242142)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in	2019-02-27 19:47:53 UTC (rev 242141)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in	2019-02-27 19:53:42 UTC (rev 242142)
@@ -346,11 +346,7 @@
     UserMediaAccessWasDenied(uint64_t userMediaID, uint64_t reason, String invalidConstraint)
     DidCompleteMediaDeviceEnumeration(uint64_t userMediaID, Vector<WebCore::CaptureDevice> devices, String mediaDeviceIdentifierHashSalt, bool hasPersistentAccess)
     CaptureDevicesChanged()
-#if ENABLE(SANDBOX_EXTENSIONS)
-    GrantUserMediaDeviceSandboxExtensions(WebKit::MediaDeviceSandboxExtensions sandboxExtensions)
-    RevokeUserMediaDeviceSandboxExtensions(Vector<String> sandboxExtensionIDs)
 #endif
-#endif
 
 #if ENABLE(WEB_RTC)
     DisableICECandidateFiltering()

Modified: trunk/Source/WebKit/WebProcess/WebProcess.cpp (242141 => 242142)


--- trunk/Source/WebKit/WebProcess/WebProcess.cpp	2019-02-27 19:47:53 UTC (rev 242141)
+++ trunk/Source/WebKit/WebProcess/WebProcess.cpp	2019-02-27 19:53:42 UTC (rev 242142)
@@ -1812,7 +1812,31 @@
 {
     MockRealtimeMediaSourceCenter::resetDevices();
 }
+
+#if ENABLE(SANDBOX_EXTENSIONS)
+void WebProcess::grantUserMediaDeviceSandboxExtensions(MediaDeviceSandboxExtensions&& extensions)
+{
+    for (size_t i = 0; i < extensions.size(); i++) {
+        const auto& extension = extensions[i];
+        extension.second->consume();
+        RELEASE_LOG(WebRTC, "UserMediaPermissionRequestManager::grantUserMediaDeviceSandboxExtensions - granted extension %s", extension.first.utf8().data());
+        m_mediaCaptureSandboxExtensions.add(extension.first, extension.second.copyRef());
+    }
+}
+
+void WebProcess::revokeUserMediaDeviceSandboxExtensions(const Vector<String>& extensionIDs)
+{
+    for (const auto& extensionID : extensionIDs) {
+        auto extension = m_mediaCaptureSandboxExtensions.take(extensionID);
+        ASSERT(extension);
+        if (extension) {
+            extension->revoke();
+            RELEASE_LOG(WebRTC, "UserMediaPermissionRequestManager::revokeUserMediaDeviceSandboxExtensions - revoked extension %s", extensionID.utf8().data());
+        }
+    }
+}
 #endif
+#endif
 
 #if ENABLE(VIDEO)
 void WebProcess::suspendAllMediaBuffering()

Modified: trunk/Source/WebKit/WebProcess/WebProcess.h (242141 => 242142)


--- trunk/Source/WebKit/WebProcess/WebProcess.h	2019-02-27 19:47:53 UTC (rev 242141)
+++ trunk/Source/WebKit/WebProcess/WebProcess.h	2019-02-27 19:53:42 UTC (rev 242142)
@@ -27,6 +27,9 @@
 
 #include "AuxiliaryProcess.h"
 #include "CacheModel.h"
+#if ENABLE(MEDIA_STREAM)
+#include "MediaDeviceSandboxExtensions.h"
+#endif
 #include "PluginProcessConnectionManager.h"
 #include "ResourceCachesToClear.h"
 #include "SandboxExtension.h"
@@ -374,8 +377,13 @@
     void clearMockMediaDevices();
     void removeMockMediaDevice(const String& persistentId);
     void resetMockMediaDevices();
+#if ENABLE(SANDBOX_EXTENSIONS)
+    void grantUserMediaDeviceSandboxExtensions(MediaDeviceSandboxExtensions&&);
+    void revokeUserMediaDeviceSandboxExtensions(const Vector<String>&);
 #endif
 
+#endif
+
     void platformInitializeProcess(const AuxiliaryProcessInitializationParameters&);
 
     // IPC::Connection::Client
@@ -486,6 +494,10 @@
 #endif
     bool m_hasSuspendedPageProxy { false };
     bool m_isSuspending { false };
+
+#if ENABLE(MEDIA_STREAM) && ENABLE(SANDBOX_EXTENSIONS)
+    HashMap<String, RefPtr<SandboxExtension>> m_mediaCaptureSandboxExtensions;
+#endif
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/WebProcess/WebProcess.messages.in (242141 => 242142)


--- trunk/Source/WebKit/WebProcess/WebProcess.messages.in	2019-02-27 19:47:53 UTC (rev 242141)
+++ trunk/Source/WebKit/WebProcess/WebProcess.messages.in	2019-02-27 19:53:42 UTC (rev 242142)
@@ -145,7 +145,12 @@
     ClearMockMediaDevices();
     RemoveMockMediaDevice(String persistentId);
     ResetMockMediaDevices();
+
+#if ENABLE(SANDBOX_EXTENSIONS)
+    GrantUserMediaDeviceSandboxExtensions(WebKit::MediaDeviceSandboxExtensions sandboxExtensions)
+    RevokeUserMediaDeviceSandboxExtensions(Vector<String> sandboxExtensionIDs)
 #endif
+#endif
 
     ClearCurrentModifierStateForTesting()
 }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to