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()
}