WebKit Bugzilla
Attachment 346900 Details for
Bug 185761
: [GTK][WPE] Add mediaDevices.enumerateDevices support
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
WIP
WIP.patch (text/plain), 45.91 KB, created by
Alejandro G. Castro
on 2018-08-10 01:24:20 PDT
(
hide
)
Description:
WIP
Filename:
MIME Type:
Creator:
Alejandro G. Castro
Created:
2018-08-10 01:24:20 PDT
Size:
45.91 KB
patch
obsolete
>diff --git a/LayoutTests/platform/gtk/TestExpectations b/LayoutTests/platform/gtk/TestExpectations >index 3548b665d1f..5365d1e0375 100644 >--- a/LayoutTests/platform/gtk/TestExpectations >+++ b/LayoutTests/platform/gtk/TestExpectations >@@ -635,7 +635,6 @@ webkit.org/b/79203 imported/w3c/web-platform-tests/mediacapture-streams/MediaStr > webkit.org/b/151344 fast/mediastream/MediaStream-add-ended-tracks.html [ Timeout ] > # Crash is bug #176801 > webkit.org/b/160996 fast/mediastream/MediaStream-video-element-video-tracks-disabled.html [ ImageOnlyFailure Crash ] >-webkit.org/b/172269 fast/mediastream/media-devices-enumerate-devices.html [ Failure ] > webkit.org/b/173257 fast/mediastream/getUserMedia-grant-persistency3.html [ Pass Failure ] > webkit.org/b/176801 fast/mediastream/argument-types.html [ Crash Pass ] > >diff --git a/Source/WebCore/Modules/mediastream/MediaDevicesRequest.cpp b/Source/WebCore/Modules/mediastream/MediaDevicesRequest.cpp >index e2c5bf70a26..bc69a454514 100644 >--- a/Source/WebCore/Modules/mediastream/MediaDevicesRequest.cpp >+++ b/Source/WebCore/Modules/mediastream/MediaDevicesRequest.cpp >@@ -81,9 +81,7 @@ void MediaDevicesRequest::contextDestroyed() > > void MediaDevicesRequest::filterDeviceList(Vector<Ref<MediaDeviceInfo>>& devices) > { >-#if !PLATFORM(COCOA) >- UNUSED_PARAM(devices); >-#else >+#if PLATFORM(COCOA) || PLATFORM(GTK) || PLATFORM(WPE) > > #if PLATFORM(IOS) > static const int defaultCameraCount = 2; >@@ -91,6 +89,10 @@ void MediaDevicesRequest::filterDeviceList(Vector<Ref<MediaDeviceInfo>>& devices > #if PLATFORM(MAC) > static const int defaultCameraCount = 1; > #endif >+#if PLATFORM(GTK) || PLATFORM(WPE) >+ static const int defaultCameraCount = 1; >+#endif >+ > static const int defaultMicrophoneCount = 1; > > int cameraCount = 0; >@@ -103,7 +105,8 @@ void MediaDevicesRequest::filterDeviceList(Vector<Ref<MediaDeviceInfo>>& devices > > return false; > }); >- >+#else >+ UNUSED_PARAM(devices); > #endif > } > >diff --git a/Source/WebKit/CMakeLists.txt b/Source/WebKit/CMakeLists.txt >index 6ab24e2c482..679a4f48364 100644 >--- a/Source/WebKit/CMakeLists.txt >+++ b/Source/WebKit/CMakeLists.txt >@@ -305,6 +305,7 @@ set(WebKit_SOURCES > UIProcess/GeolocationPermissionRequestManagerProxy.cpp > UIProcess/GeolocationPermissionRequestProxy.cpp > UIProcess/PageLoadState.cpp >+ UIProcess/PermissionManager.cpp > UIProcess/ProcessAssertion.cpp > UIProcess/ProcessThrottler.cpp > UIProcess/RemoteWebInspectorProxy.cpp >diff --git a/Source/WebKit/Shared/WebsiteData/WebsiteDataType.h b/Source/WebKit/Shared/WebsiteData/WebsiteDataType.h >index 9d50361e81a..6c79607aefa 100644 >--- a/Source/WebKit/Shared/WebsiteData/WebsiteDataType.h >+++ b/Source/WebKit/Shared/WebsiteData/WebsiteDataType.h >@@ -49,6 +49,7 @@ enum class WebsiteDataType { > ServiceWorkerRegistrations = 1 << 14, > #endif > DOMCache = 1 << 15, >+ Permissions = 1 << 16, > }; > > }; >diff --git a/Source/WebKit/UIProcess/API/glib/WebKitUIClient.cpp b/Source/WebKit/UIProcess/API/glib/WebKitUIClient.cpp >index f5dab1e9a75..3c2c80a6bb2 100644 >--- a/Source/WebKit/UIProcess/API/glib/WebKitUIClient.cpp >+++ b/Source/WebKit/UIProcess/API/glib/WebKitUIClient.cpp >@@ -21,6 +21,7 @@ > #include "WebKitUIClient.h" > > #include "APIUIClient.h" >+#include "PermissionManager.h" > #include "WebKitFileChooserRequestPrivate.h" > #include "WebKitGeolocationPermissionRequestPrivate.h" > #include "WebKitNavigationActionPrivate.h" >@@ -31,6 +32,7 @@ > #include "WebKitWindowPropertiesPrivate.h" > #include "WebPageProxy.h" > #include "WebProcessProxy.h" >+#include "WebsiteDataStore.h" > #include <wtf/glib/GRefPtr.h> > > #if PLATFORM(GTK) >@@ -191,6 +193,14 @@ private: > return true; > } > >+ bool checkUserMediaPermissionForOrigin(WebPageProxy& page, WebFrameProxy&, API::SecurityOrigin& userMediaDocumentOrigin, API::SecurityOrigin& topLevelDocumentOrigin, UserMediaPermissionCheckProxy& permissionRequest) override >+ { >+ /* FIXME: Get rid of this call moving all the ports to a core solution. */ >+ auto salt = page.websiteDataStore().permissionManager()->getDeviceIdentifierHashSaltForOrigin(permissionRequest); >+ permissionRequest.setUserMediaAccessInfo(WTFMove(salt), false); >+ return true; >+ } >+ > void decidePolicyForNotificationPermissionRequest(WebPageProxy&, API::SecurityOrigin&, Function<void(bool)>&& completionHandler) final > { > GRefPtr<WebKitNotificationPermissionRequest> notificationPermissionRequest = adoptGRef(webkitNotificationPermissionRequestCreate(NotificationPermissionRequest::create(WTFMove(completionHandler)).ptr())); >diff --git a/Source/WebKit/UIProcess/API/glib/WebKitWebsiteData.cpp b/Source/WebKit/UIProcess/API/glib/WebKitWebsiteData.cpp >index bd7d412705c..9ed02cfa72b 100644 >--- a/Source/WebKit/UIProcess/API/glib/WebKitWebsiteData.cpp >+++ b/Source/WebKit/UIProcess/API/glib/WebKitWebsiteData.cpp >@@ -104,6 +104,8 @@ static WebKitWebsiteDataTypes toWebKitWebsiteDataTypes(OptionSet<WebsiteDataType > #endif > if (types.contains(WebsiteDataType::Cookies)) > returnValue |= WEBKIT_WEBSITE_DATA_COOKIES; >+ if (types.contains(WebsiteDataType::Permissions)) >+ returnValue |= WEBKIT_WEBSITE_DATA_PERMISSIONS; > return static_cast<WebKitWebsiteDataTypes>(returnValue); > } > >diff --git a/Source/WebKit/UIProcess/API/glib/WebKitWebsiteDataManager.cpp b/Source/WebKit/UIProcess/API/glib/WebKitWebsiteDataManager.cpp >index 3020ecbb24e..7881e8a6d74 100644 >--- a/Source/WebKit/UIProcess/API/glib/WebKitWebsiteDataManager.cpp >+++ b/Source/WebKit/UIProcess/API/glib/WebKitWebsiteDataManager.cpp >@@ -649,6 +649,8 @@ static OptionSet<WebsiteDataType> toWebsiteDataTypes(WebKitWebsiteDataTypes type > #endif > if (types & WEBKIT_WEBSITE_DATA_COOKIES) > returnValue |= WebsiteDataType::Cookies; >+ if (types & WEBKIT_WEBSITE_DATA_PERMISSIONS) >+ returnValue |= WebsiteDataType::Permissions; > return returnValue; > } > >diff --git a/Source/WebKit/UIProcess/API/gtk/WebKitWebsiteData.h b/Source/WebKit/UIProcess/API/gtk/WebKitWebsiteData.h >index 065047fe17c..5e32e766e2f 100644 >--- a/Source/WebKit/UIProcess/API/gtk/WebKitWebsiteData.h >+++ b/Source/WebKit/UIProcess/API/gtk/WebKitWebsiteData.h >@@ -44,6 +44,7 @@ typedef struct _WebKitWebsiteData WebKitWebsiteData; > * @WEBKIT_WEBSITE_DATA_INDEXEDDB_DATABASES: IndexedDB databases. > * @WEBKIT_WEBSITE_DATA_PLUGIN_DATA: Plugins data. > * @WEBKIT_WEBSITE_DATA_COOKIES: Cookies. >+ * @WEBKIT_WEBSITE_DATA_PERMISSIONS: Permissions. > * @WEBKIT_WEBSITE_DATA_ALL: All types. > * > * Enum values with flags representing types of Website data. >@@ -60,7 +61,8 @@ typedef enum { > WEBKIT_WEBSITE_DATA_INDEXEDDB_DATABASES = 1 << 6, > WEBKIT_WEBSITE_DATA_PLUGIN_DATA = 1 << 7, > WEBKIT_WEBSITE_DATA_COOKIES = 1 << 8, >- WEBKIT_WEBSITE_DATA_ALL = (1 << 9) - 1 >+ WEBKIT_WEBSITE_DATA_PERMISSIONS = 1 << 9, >+ WEBKIT_WEBSITE_DATA_ALL = (1 << 10) - 1 > } WebKitWebsiteDataTypes; > > WEBKIT_API GType >diff --git a/Source/WebKit/UIProcess/API/wpe/WebKitWebsiteData.h b/Source/WebKit/UIProcess/API/wpe/WebKitWebsiteData.h >index 3a462aaff9b..e89e6a0ec40 100644 >--- a/Source/WebKit/UIProcess/API/wpe/WebKitWebsiteData.h >+++ b/Source/WebKit/UIProcess/API/wpe/WebKitWebsiteData.h >@@ -44,6 +44,7 @@ typedef struct _WebKitWebsiteData WebKitWebsiteData; > * @WEBKIT_WEBSITE_DATA_INDEXEDDB_DATABASES: IndexedDB databases. > * @WEBKIT_WEBSITE_DATA_PLUGIN_DATA: Plugins data. > * @WEBKIT_WEBSITE_DATA_COOKIES: Cookies. >+ * @WEBKIT_WEBSITE_DATA_PERMISSIONS: Permissions. > * @WEBKIT_WEBSITE_DATA_ALL: All types. > * > * Enum values with flags representing types of Website data. >@@ -60,7 +61,8 @@ typedef enum { > WEBKIT_WEBSITE_DATA_INDEXEDDB_DATABASES = 1 << 6, > WEBKIT_WEBSITE_DATA_PLUGIN_DATA = 1 << 7, > WEBKIT_WEBSITE_DATA_COOKIES = 1 << 8, >- WEBKIT_WEBSITE_DATA_ALL = (1 << 9) - 1 >+ WEBKIT_WEBSITE_DATA_PERMISSIONS = 1 << 9, >+ WEBKIT_WEBSITE_DATA_ALL = (1 << 10) - 1 > } WebKitWebsiteDataTypes; > > WEBKIT_API GType >diff --git a/Source/WebKit/UIProcess/PermissionManager.cpp b/Source/WebKit/UIProcess/PermissionManager.cpp >new file mode 100644 >index 00000000000..7d168ebb4a4 >--- /dev/null >+++ b/Source/WebKit/UIProcess/PermissionManager.cpp >@@ -0,0 +1,168 @@ >+/* >+ * Copyright (C) 2018 Igalia S.L. All rights reserved. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions >+ * are met: >+ * 1. Redistributions of source code must retain the above copyright >+ * notice, this list of conditions and the following disclaimer. >+ * 2. Redistributions in binary form must reproduce the above copyright >+ * notice, this list of conditions and the following disclaimer in the >+ * documentation and/or other materials provided with the distribution. >+ * >+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' >+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, >+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS >+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR >+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF >+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS >+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN >+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) >+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF >+ * THE POSSIBILITY OF SUCH DAMAGE. >+ */ >+ >+#include "config.h" >+#include "PermissionManager.h" >+ >+#include <wtf/CryptographicallyRandomNumber.h> >+#include <wtf/HexNumber.h> >+#include <wtf/RunLoop.h> >+#include <wtf/text/StringBuilder.h> >+#include <wtf/text/WTFString.h> >+ >+namespace WebKit { >+ >+static const int hashSaltSize = 50; >+static const int randomDataSize = hashSaltSize / 16; >+ >+Ref<PermissionManager> PermissionManager::create() >+{ >+ return adoptRef(*new PermissionManager()); >+} >+ >+PermissionManager::PermissionManager() >+{ >+} >+ >+PermissionManager::~PermissionManager() >+{ >+} >+ >+String PermissionManager::getDeviceIdentifierHashSaltForOrigin(UserMediaPermissionCheckProxy& request) >+{ >+ return getDeviceIdentifierHashSaltForOrigin(request.userMediaDocumentSecurityOrigin(), request.topLevelDocumentSecurityOrigin()); >+} >+ >+String PermissionManager::getDeviceIdentifierHashSaltForOrigin(WebCore::SecurityOrigin& userMediaDocumentSecurityOrigin, WebCore::SecurityOrigin& topLevelDocumentSecurityOrigin) >+{ >+ auto permissionsForOrigin = m_permissionsListForOrigin.get(topLevelDocumentSecurityOrigin.toRawString()); >+ if (permissionsForOrigin) { >+ permissionsForOrigin->userMediaDocumentSecurityOrigins.add(userMediaDocumentSecurityOrigin.data()); >+ permissionsForOrigin->lastTimeUsed = WallTime::now(); >+ return permissionsForOrigin->deviceIdentifierHashSaltForOrigin; >+ } >+ >+ uint64_t randomData[randomDataSize]; >+ cryptographicallyRandomValues(reinterpret_cast<unsigned char*>(randomData), sizeof(randomData)); >+ >+ StringBuilder builder; >+ builder.reserveCapacity(hashSaltSize); >+ for (int i = 0; i < randomDataSize; i++) >+ appendUnsigned64AsHex(randomData[0], builder); >+ >+ String deviceIdentifierHashSaltForOrigin = builder.toString(); >+ >+ auto newPermissionsForOrigin = std::make_unique<PermissionsForOrigin>(topLevelDocumentSecurityOrigin, deviceIdentifierHashSaltForOrigin); >+ newPermissionsForOrigin->userMediaDocumentSecurityOrigins.add(userMediaDocumentSecurityOrigin.data()); >+ newPermissionsForOrigin->lastTimeUsed = WallTime::now(); >+ >+ m_permissionsListForOrigin.add(topLevelDocumentSecurityOrigin.toRawString(), WTFMove(newPermissionsForOrigin)); >+ >+ return deviceIdentifierHashSaltForOrigin; >+} >+ >+void PermissionManager::setDeviceIdentifierHashSaltForOrigin(WebCore::SecurityOrigin& userMediaDocumentSecurityOrigin, WebCore::SecurityOrigin& topLevelDocumentSecurityOrigin, String&& deviceIdentifierHashSaltForOrigin) >+{ >+ auto permissionsForOrigin = m_permissionsListForOrigin.get(topLevelDocumentSecurityOrigin.toRawString()); >+ if (permissionsForOrigin) { >+ permissionsForOrigin->deviceIdentifierHashSaltForOrigin = deviceIdentifierHashSaltForOrigin; >+ permissionsForOrigin->lastTimeUsed = WallTime::now(); >+ return; >+ } >+ >+ auto newPermissionsForOrigin = std::make_unique<PermissionsForOrigin>(topLevelDocumentSecurityOrigin, deviceIdentifierHashSaltForOrigin); >+ newPermissionsForOrigin->userMediaDocumentSecurityOrigins.add(userMediaDocumentSecurityOrigin.data()); >+ newPermissionsForOrigin->deviceIdentifierHashSaltForOrigin = deviceIdentifierHashSaltForOrigin; >+ newPermissionsForOrigin->lastTimeUsed = WallTime::now(); >+ m_permissionsListForOrigin.add(topLevelDocumentSecurityOrigin.toRawString(), WTFMove(newPermissionsForOrigin)); >+} >+ >+void PermissionManager::getPermissionRequestOrigins(Function<void(HashSet<WebCore::SecurityOriginData>&&)>&& completionHandler) >+{ >+ HashSet<WebCore::SecurityOriginData> origins; >+ >+ for (auto& permissionForOrigin : m_permissionsListForOrigin) >+ origins.add(permissionForOrigin.value->topLevelDocumentSecurityOrigin->data()); >+ >+ RunLoop::main().dispatch([origins = WTFMove(origins), completionHandler = WTFMove(completionHandler)]() mutable { >+ completionHandler(WTFMove(origins)); >+ }); >+} >+ >+void PermissionManager::deletePermissionRequestForOrigins(const Vector<WebCore::SecurityOriginData>& origins, Function<void()>&& completionHandler) >+{ >+ m_permissionsListForOrigin.removeIf([origins](auto& keyAndValue) { >+ return origins.contains(keyAndValue.value->topLevelDocumentSecurityOrigin->data()); >+ }); >+ >+ RunLoop::main().dispatch(WTFMove(completionHandler)); >+} >+ >+void PermissionManager::deletePermissionRequestOriginsModifiedSince(WallTime time, Function<void()>&& completionHandler) >+{ >+ m_permissionsListForOrigin.removeIf([time](auto& keyAndValue) { >+ return keyAndValue.value->lastTimeUsed > time; >+ }); >+ >+ RunLoop::main().dispatch(WTFMove(completionHandler)); >+} >+ >+void PermissionManager::setMediaPermissionForExistingOrigin(Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin, PermissionName name, PermissionState state) >+{ >+ auto permissionsForOrigin = m_permissionsListForOrigin.get(topLevelDocumentOrigin->toRawString()); >+ >+ ASSERT(permissionsForOrigin); >+ >+ permissionsForOrigin->userMediaDocumentSecurityOrigins.add(userMediaDocumentOrigin->data()); >+ permissionsForOrigin->permissions.add(name, std::make_unique<PermissionDescriptor>(name, state)); >+ >+ if (auto deviceInfoPermissionDescriptor = permissionsForOrigin->permissions.get(PermissionName::DeviceInfo)) { >+ deviceInfoPermissionDescriptor->state = state; >+ return; >+ } >+ >+ permissionsForOrigin->permissions.add(PermissionName::DeviceInfo, std::make_unique<PermissionDescriptor>(PermissionName::DeviceInfo, state)); >+ permissionsForOrigin->lastTimeUsed = WallTime::now(); >+} >+ >+PermissionManager::PermissionState PermissionManager::getMediaPermissionForOrigin(WebCore::SecurityOrigin& userMediaDocumentOrigin, WebCore::SecurityOrigin& topLevelDocumentOrigin, PermissionName name) >+{ >+ auto permissionsForOrigin = m_permissionsListForOrigin.get(topLevelDocumentOrigin.toRawString()); >+ if (!permissionsForOrigin) >+ return PermissionState::Prompt; >+ >+ if (!permissionsForOrigin->userMediaDocumentSecurityOrigins.contains(userMediaDocumentOrigin.data())) >+ return PermissionState::Prompt; >+ >+ auto permissionDescriptionForName = permissionsForOrigin->permissions.get(name); >+ if (!permissionDescriptionForName) >+ return PermissionState::Prompt; >+ >+ permissionsForOrigin->lastTimeUsed = WallTime::now(); >+ >+ return permissionDescriptionForName->state; >+} >+ >+} // namespace WebKit >diff --git a/Source/WebKit/UIProcess/PermissionManager.h b/Source/WebKit/UIProcess/PermissionManager.h >new file mode 100644 >index 00000000000..512fd880353 >--- /dev/null >+++ b/Source/WebKit/UIProcess/PermissionManager.h >@@ -0,0 +1,106 @@ >+/* >+ * Copyright (C) 2018 Igalia S.L. All rights reserved. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions >+ * are met: >+ * 1. Redistributions of source code must retain the above copyright >+ * notice, this list of conditions and the following disclaimer. >+ * 2. Redistributions in binary form must reproduce the above copyright >+ * notice, this list of conditions and the following disclaimer in the >+ * documentation and/or other materials provided with the distribution. >+ * >+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' >+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, >+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS >+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR >+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF >+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS >+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN >+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) >+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF >+ * THE POSSIBILITY OF SUCH DAMAGE. >+ */ >+ >+#pragma once >+ >+#include "UserMediaPermissionCheckProxy.h" >+#include <WebCore/SecurityOrigin.h> >+#include <WebCore/SecurityOriginData.h> >+#include <WebCore/SecurityOriginHash.h> >+#include <wtf/HashMap.h> >+#include <wtf/HashSet.h> >+#include <wtf/Ref.h> >+#include <wtf/RefCounted.h> >+#include <wtf/text/StringHash.h> >+#include <wtf/text/WTFString.h> >+ >+namespace WebKit { >+ >+class PermissionManager : public RefCounted<PermissionManager> { >+public: >+ static Ref<PermissionManager> create(); >+ ~PermissionManager(); >+ >+ enum class PermissionName { >+ None, >+ Camera, >+ Microphone, >+ DeviceInfo >+ }; >+ >+ enum class PermissionState { >+ Granted, >+ Denied, >+ Prompt >+ }; >+ >+ struct PermissionDescriptor { >+ PermissionDescriptor() >+ : name(PermissionName::None) >+ , state(PermissionState::Prompt) >+ , allowedInNotSecureContexts(false) >+ { }; >+ >+ PermissionDescriptor(PermissionName name, PermissionState state) >+ : name(name) >+ , state(state) >+ { }; >+ >+ PermissionName name; >+ PermissionState state; >+ bool allowedInNotSecureContexts; >+ }; >+ >+ struct PermissionsForOrigin { >+ PermissionsForOrigin(WebCore::SecurityOrigin& securityOrigin, String& deviceIdentifierHashSaltForOrigin) >+ : topLevelDocumentSecurityOrigin(securityOrigin) >+ , deviceIdentifierHashSaltForOrigin(deviceIdentifierHashSaltForOrigin) >+ { }; >+ >+ ~PermissionsForOrigin() = default; >+ Ref<WebCore::SecurityOrigin> topLevelDocumentSecurityOrigin; >+ HashSet<WebCore::SecurityOriginData> userMediaDocumentSecurityOrigins; >+ HashMap<PermissionName, std::unique_ptr<PermissionDescriptor>, WTF::IntHash<PermissionName>, WTF::StrongEnumHashTraits<PermissionName>> permissions; >+ String deviceIdentifierHashSaltForOrigin; >+ WallTime lastTimeUsed; >+ }; >+ >+ String getDeviceIdentifierHashSaltForOrigin(UserMediaPermissionCheckProxy&); >+ String getDeviceIdentifierHashSaltForOrigin(WebCore::SecurityOrigin& userMediaDocumentSecurityOrigin, WebCore::SecurityOrigin& topLevelDocumentSecurityOrigin); >+ void setDeviceIdentifierHashSaltForOrigin(WebCore::SecurityOrigin& userMediaDocumentSecurityOrigin, WebCore::SecurityOrigin& topLevelDocumentSecurityOrigin, String&& deviceIdentifierHashSaltForOrigin); >+ void setMediaPermissionForExistingOrigin(Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin, PermissionName, PermissionState); >+ PermissionState getMediaPermissionForOrigin(WebCore::SecurityOrigin& userMediaDocumentOrigin, WebCore::SecurityOrigin& topLevelDocumentOrigin, PermissionName); >+ >+ void getPermissionRequestOrigins(Function<void(HashSet<WebCore::SecurityOriginData>&&)>&& completionHandler); >+ void deletePermissionRequestForOrigins(const Vector<WebCore::SecurityOriginData>&, Function<void()>&& completionHandler); >+ void deletePermissionRequestOriginsModifiedSince(WallTime, Function<void()>&& completionHandler); >+ >+private: >+ explicit PermissionManager(); >+ >+ HashMap<String, std::unique_ptr<PermissionsForOrigin>> m_permissionsListForOrigin; >+}; >+ >+} // namespace WebKit >diff --git a/Source/WebKit/UIProcess/UserMediaPermissionCheckProxy.h b/Source/WebKit/UIProcess/UserMediaPermissionCheckProxy.h >index f37be7ab21f..fbcc4cfee3a 100644 >--- a/Source/WebKit/UIProcess/UserMediaPermissionCheckProxy.h >+++ b/Source/WebKit/UIProcess/UserMediaPermissionCheckProxy.h >@@ -36,8 +36,6 @@ class SecurityOrigin; > > namespace WebKit { > >-class UserMediaPermissionRequestManagerProxy; >- > class UserMediaPermissionCheckProxy : public API::ObjectImpl<API::Object::Type::UserMediaPermissionCheck> { > public: > >diff --git a/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp b/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp >index 3c07295f105..c15a7b21d06 100644 >--- a/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp >+++ b/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp >@@ -22,12 +22,14 @@ > > #include "APISecurityOrigin.h" > #include "APIUIClient.h" >+#include "PermissionManager.h" > #include "UserMediaProcessManager.h" > #include "WebAutomationSession.h" > #include "WebPageMessages.h" > #include "WebPageProxy.h" > #include "WebProcessPool.h" > #include "WebProcessProxy.h" >+#include "WebsiteDataStore.h" > #include <WebCore/MediaConstraints.h> > #include <WebCore/MockRealtimeMediaSourceCenter.h> > #include <WebCore/RealtimeMediaSource.h> >@@ -123,8 +125,18 @@ void UserMediaPermissionRequestManagerProxy::userMediaAccessWasDenied(uint64_t u > if (!request) > return; > >- if (reason == UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::PermissionDenied) >- m_deniedRequests.append(DeniedRequest { request->mainFrameID(), request->userMediaDocumentSecurityOrigin(), request->topLevelDocumentSecurityOrigin(), request->requiresAudioCapture(), request->requiresVideoCapture() }); >+ if (reason == UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::PermissionDenied) { >+ if (request->requiresVideoCapture()) { >+ m_page.websiteDataStore().permissionManager()->setMediaPermissionForExistingOrigin(request->userMediaDocumentSecurityOrigin().isolatedCopy(), request->topLevelDocumentSecurityOrigin().isolatedCopy(), >+ PermissionManager::PermissionName::Camera, PermissionManager::PermissionState::Denied); >+ } >+ >+ if (request->requiresAudioCapture()) { >+ m_page.websiteDataStore().permissionManager()->setMediaPermissionForExistingOrigin(request->userMediaDocumentSecurityOrigin().isolatedCopy(), request->topLevelDocumentSecurityOrigin().isolatedCopy(), >+ PermissionManager::PermissionName::Microphone, PermissionManager::PermissionState::Denied); >+ } >+ >+ } > > denyRequest(userMediaID, reason, emptyString()); > } >@@ -153,8 +165,17 @@ void UserMediaPermissionRequestManagerProxy::userMediaAccessWasGranted(uint64_t > if (!request) > return; > >- if (grantAccess(userMediaID, WTFMove(audioDevice), WTFMove(videoDevice), request->deviceIdentifierHashSalt())) >- m_grantedRequests.append(request.releaseNonNull()); >+ if (grantAccess(userMediaID, WTFMove(audioDevice), WTFMove(videoDevice), request->deviceIdentifierHashSalt())) { >+ if (request->requiresVideoCapture()) { >+ m_page.websiteDataStore().permissionManager()->setMediaPermissionForExistingOrigin(request->userMediaDocumentSecurityOrigin().isolatedCopy(), request->topLevelDocumentSecurityOrigin().isolatedCopy(), >+ PermissionManager::PermissionName::Camera, PermissionManager::PermissionState::Granted); >+ } >+ >+ if (request->requiresAudioCapture()) { >+ m_page.websiteDataStore().permissionManager()->setMediaPermissionForExistingOrigin(request->userMediaDocumentSecurityOrigin().isolatedCopy(), request->topLevelDocumentSecurityOrigin().isolatedCopy(), >+ PermissionManager::PermissionName::Microphone, PermissionManager::PermissionState::Granted); >+ } >+ } > > #else > UNUSED_PARAM(userMediaID); >@@ -166,59 +187,7 @@ void UserMediaPermissionRequestManagerProxy::userMediaAccessWasGranted(uint64_t > #if ENABLE(MEDIA_STREAM) > void UserMediaPermissionRequestManagerProxy::resetAccess(uint64_t frameID) > { >- m_grantedRequests.removeAllMatching([frameID](const auto& grantedRequest) { >- return grantedRequest->mainFrameID() == frameID; >- }); > m_pregrantedRequests.clear(); >- m_deniedRequests.clear(); >-} >- >-const UserMediaPermissionRequestProxy* UserMediaPermissionRequestManagerProxy::searchForGrantedRequest(uint64_t frameID, const SecurityOrigin& userMediaDocumentOrigin, const SecurityOrigin& topLevelDocumentOrigin, bool needsAudio, bool needsVideo) const >-{ >- if (m_page.isMediaStreamCaptureMuted()) >- return nullptr; >- >- bool checkForAudio = needsAudio; >- bool checkForVideo = needsVideo; >- for (const auto& grantedRequest : m_grantedRequests) { >- if (grantedRequest->requiresDisplayCapture()) >- continue; >- if (!grantedRequest->userMediaDocumentSecurityOrigin().isSameSchemeHostPort(userMediaDocumentOrigin)) >- continue; >- if (!grantedRequest->topLevelDocumentSecurityOrigin().isSameSchemeHostPort(topLevelDocumentOrigin)) >- continue; >- if (grantedRequest->frameID() != frameID) >- continue; >- >- if (grantedRequest->requiresVideoCapture()) >- checkForVideo = false; >- >- if (grantedRequest->requiresAudioCapture()) >- checkForAudio = false; >- >- if (checkForVideo || checkForAudio) >- continue; >- >- return grantedRequest.ptr(); >- } >- return nullptr; >-} >- >-bool UserMediaPermissionRequestManagerProxy::wasRequestDenied(uint64_t mainFrameID, const SecurityOrigin& userMediaDocumentOrigin, const 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; > } > > bool UserMediaPermissionRequestManagerProxy::grantAccess(uint64_t userMediaID, const CaptureDevice audioDevice, const CaptureDevice videoDevice, const String& deviceIdentifierHashSalt) >@@ -270,29 +239,46 @@ void UserMediaPermissionRequestManagerProxy::requestUserMediaPermissionForFrame( > if (!m_page.isValid() || !m_page.mainFrame()) > return; > >+ // FIXME: We could remove this when all the ports use the PermissionRequest Manager to generate the hash salts. >+ m_page.websiteDataStore().permissionManager()->setDeviceIdentifierHashSaltForOrigin(userMediaDocumentOrigin.get(), topLevelDocumentOrigin.get(), String(deviceIdentifierHashSalt)); >+ > if (videoDevices.isEmpty() && audioDevices.isEmpty()) { > denyRequest(userMediaID, UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::NoConstraints, emptyString()); > return; > } > >- if (wasRequestDenied(m_page.mainFrame()->frameID(), userMediaDocumentOrigin.get(), topLevelDocumentOrigin.get(), !audioDevices.isEmpty(), !videoDevices.isEmpty())) { >+ PermissionManager::PermissionState audioState = PermissionManager::PermissionState::Prompt; >+ if (!audioDevices.isEmpty()) >+ audioState = m_page.websiteDataStore().permissionManager()->getMediaPermissionForOrigin(userMediaDocumentOrigin.get(), topLevelDocumentOrigin.get(), PermissionManager::PermissionName::Microphone); >+ else >+ audioState = PermissionManager::PermissionState::Granted; >+ >+ PermissionManager::PermissionState videoState = PermissionManager::PermissionState::Prompt; >+ if (!videoDevices.isEmpty()) >+ videoState = m_page.websiteDataStore().permissionManager()->getMediaPermissionForOrigin(userMediaDocumentOrigin.get(), topLevelDocumentOrigin.get(), PermissionManager::PermissionName::Camera); >+ else >+ videoState = PermissionManager::PermissionState::Granted; >+ >+ >+ if (audioState == PermissionManager::PermissionState::Denied || videoState == PermissionManager::PermissionState::Denied) { > denyRequest(userMediaID, UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::PermissionDenied, emptyString()); > return; > } > >- auto* grantedRequest = searchForGrantedRequest(frameID, userMediaDocumentOrigin.get(), topLevelDocumentOrigin.get(), !audioDevices.isEmpty(), !videoDevices.isEmpty()); >- if (grantedRequest) { >+ if (audioState == PermissionManager::PermissionState::Granted && videoState == PermissionManager::PermissionState::Granted) { >+ auto grantedRequestDeviceIdentifierHashSalt = m_page.websiteDataStore().permissionManager()->getDeviceIdentifierHashSaltForOrigin(userMediaDocumentOrigin.get(), topLevelDocumentOrigin.get()); > if (m_page.isViewVisible()) { > // We select the first available devices, but the current client API allows client to select which device to pick. > // FIXME: Remove the possiblity for the client to do the device selection. > auto audioDevice = !audioDevices.isEmpty() ? audioDevices[0] : CaptureDevice(); > auto videoDevice = !videoDevices.isEmpty() ? videoDevices[0] : CaptureDevice(); >- grantAccess(userMediaID, WTFMove(audioDevice), WTFMove(videoDevice), grantedRequest->deviceIdentifierHashSalt()); >+ grantAccess(userMediaID, WTFMove(audioDevice), WTFMove(videoDevice), grantedRequestDeviceIdentifierHashSalt); > } else >- m_pregrantedRequests.append(createPermissionRequest(userMediaID, m_page.mainFrame()->frameID(), frameID, WTFMove(userMediaDocumentOrigin), WTFMove(topLevelDocumentOrigin), WTFMove(audioDevices), WTFMove(videoDevices), String(grantedRequest->deviceIdentifierHashSalt()), WTFMove(localUserRequest))); >+ m_pregrantedRequests.append(createPermissionRequest(userMediaID, m_page.mainFrame()->frameID(), frameID, WTFMove(userMediaDocumentOrigin), WTFMove(topLevelDocumentOrigin), WTFMove(audioDevices), WTFMove(videoDevices), WTFMove(grantedRequestDeviceIdentifierHashSalt), WTFMove(localUserRequest))); > > return; > } >+ > auto userMediaOrigin = API::SecurityOrigin::create(userMediaDocumentOrigin.get()); > auto topLevelOrigin = API::SecurityOrigin::create(topLevelDocumentOrigin.get()); > >@@ -356,7 +342,7 @@ void UserMediaPermissionRequestManagerProxy::getUserMediaPermissionInfo(uint64_t > > if (!m_page.uiClient().checkUserMediaPermissionForOrigin(m_page, *m_page.process().webFrame(frameID), userMediaOrigin.get(), topLevelOrigin.get(), request.get())) > request->completionHandler()(userMediaID, String(), false); >-} >+} > #endif > > void UserMediaPermissionRequestManagerProxy::enumerateMediaDevicesForFrame(uint64_t userMediaID, uint64_t frameID, Ref<SecurityOrigin>&& userMediaDocumentOrigin, Ref<SecurityOrigin>&& topLevelDocumentOrigin) >@@ -380,7 +366,24 @@ void UserMediaPermissionRequestManagerProxy::enumerateMediaDevicesForFrame(uint6 > m_page.process().send(Messages::WebPage::DidCompleteMediaDeviceEnumeration(userMediaID, devices, deviceIdentifierHashSalt, originHasPersistentAccess), m_page.pageID()); > }; > >+#if PLATFORM(GTK) || PLATFORM(WPE) >+ if (m_page.preferences().mockCaptureDevicesEnabled()) { >+ getUserMediaPermissionInfo(userMediaID, frameID, WTFMove(completionHandler), WTFMove(userMediaDocumentOrigin), WTFMove(topLevelDocumentOrigin)); >+ return; >+ } >+ >+ PermissionManager::PermissionState state = m_page.websiteDataStore().permissionManager()->getMediaPermissionForOrigin(userMediaDocumentOrigin.get(), topLevelDocumentOrigin.get(), >+ PermissionManager::PermissionName::DeviceInfo); >+ >+ auto deviceIdentifierHashSalt = m_page.websiteDataStore().permissionManager()->getDeviceIdentifierHashSaltForOrigin(userMediaDocumentOrigin.get(), topLevelDocumentOrigin.get()); >+ auto request = UserMediaPermissionCheckProxy::create(userMediaID, frameID, WTFMove(completionHandler), WTFMove(userMediaDocumentOrigin), WTFMove(topLevelDocumentOrigin)); >+ m_pendingDeviceRequests.add(userMediaID, request.copyRef()); >+ request->completionHandler()(userMediaID, WTFMove(deviceIdentifierHashSalt), state == PermissionManager::PermissionState::Granted ? true : false); >+ >+#else > getUserMediaPermissionInfo(userMediaID, frameID, WTFMove(completionHandler), WTFMove(userMediaDocumentOrigin), WTFMove(topLevelDocumentOrigin)); >+#endif >+ > #else > UNUSED_PARAM(userMediaID); > UNUSED_PARAM(frameID); >@@ -443,7 +446,6 @@ void UserMediaPermissionRequestManagerProxy::processPregrantedRequests() > > void UserMediaPermissionRequestManagerProxy::watchdogTimerFired() > { >- m_grantedRequests.clear(); > m_pregrantedRequests.clear(); > m_currentWatchdogInterval = 0_s; > } >diff --git a/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.h b/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.h >index 573af04d71b..4f4a6d5f21c 100644 >--- a/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.h >+++ b/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.h >@@ -69,9 +69,6 @@ private: > void denyRequest(uint64_t userMediaID, UserMediaPermissionRequestProxy::UserMediaAccessDenialReason, const String& invalidConstraint); > #if ENABLE(MEDIA_STREAM) > bool grantAccess(uint64_t userMediaID, const WebCore::CaptureDevice audioDevice, const WebCore::CaptureDevice videoDevice, 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); > >@@ -87,16 +84,6 @@ private: > Vector<uint64_t> m_pendingRejections; > > 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; >- bool isVideoDenied; >- }; >- Vector<DeniedRequest> m_deniedRequests; > > WebCore::MediaProducer::MediaStateFlags m_captureState { WebCore::MediaProducer::IsNotPlaying }; > RunLoop::Timer<UserMediaPermissionRequestManagerProxy> m_watchdogTimer; >diff --git a/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp b/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp >index 4bd7978325d..7ca35e845ed 100644 >--- a/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp >+++ b/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp >@@ -30,6 +30,7 @@ > #include "APIWebsiteDataRecord.h" > #include "APIWebsiteDataStore.h" > #include "NetworkProcessMessages.h" >+#include "PermissionManager.h" > #include "StorageManager.h" > #include "StorageProcessCreationParameters.h" > #include "StorageProcessMessages.h" >@@ -95,6 +96,7 @@ WebsiteDataStore::WebsiteDataStore(Configuration configuration, PAL::SessionID s > : m_sessionID(sessionID) > , m_configuration(WTFMove(configuration)) > , m_storageManager(StorageManager::create(m_configuration.localStorageDirectory)) >+ , m_permissionRequestManager(PermissionManager::create()) > , m_queue(WorkQueue::create("com.apple.WebKit.WebsiteDataStore")) > { > WTF::setProcessPrivileges(allPrivileges()); >@@ -460,6 +462,19 @@ void WebsiteDataStore::fetchDataAndApply(OptionSet<WebsiteDataType> dataTypes, O > }); > } > >+ if (dataTypes.contains(WebsiteDataType::Permissions) && m_permissionRequestManager) { >+ callbackAggregator->addPendingCallback(); >+ >+ m_permissionRequestManager->getPermissionRequestOrigins([callbackAggregator](HashSet<WebCore::SecurityOriginData>&& origins) { >+ WebsiteData websiteData; >+ >+ while (!origins.isEmpty()) >+ websiteData.entries.append(WebsiteData::Entry { origins.takeAny(), WebsiteDataType::Permissions, 0 }); >+ >+ callbackAggregator->removePendingCallback(WTFMove(websiteData)); >+ }); >+ } >+ > if (dataTypes.contains(WebsiteDataType::OfflineWebApplicationCache) && isPersistent()) { > callbackAggregator->addPendingCallback(); > >@@ -782,6 +797,14 @@ void WebsiteDataStore::removeData(OptionSet<WebsiteDataType> dataTypes, WallTime > }); > } > >+ if (dataTypes.contains(WebsiteDataType::Permissions) && m_permissionRequestManager) { >+ callbackAggregator->addPendingCallback(); >+ >+ m_permissionRequestManager->deletePermissionRequestOriginsModifiedSince(modifiedSince, [callbackAggregator] { >+ callbackAggregator->removePendingCallback(); >+ }); >+ } >+ > if (dataTypes.contains(WebsiteDataType::OfflineWebApplicationCache) && isPersistent()) { > callbackAggregator->addPendingCallback(); > >@@ -1068,6 +1091,14 @@ void WebsiteDataStore::removeData(OptionSet<WebsiteDataType> dataTypes, const Ve > }); > } > >+ if (dataTypes.contains(WebsiteDataType::Permissions) && m_permissionRequestManager) { >+ callbackAggregator->addPendingCallback(); >+ >+ m_permissionRequestManager->deletePermissionRequestForOrigins(origins, [callbackAggregator] { >+ callbackAggregator->removePendingCallback(); >+ }); >+ } >+ > if (dataTypes.contains(WebsiteDataType::OfflineWebApplicationCache) && isPersistent()) { > HashSet<WebCore::SecurityOriginData> origins; > for (const auto& dataRecord : dataRecords) { >diff --git a/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h b/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h >index 31f505f7c5f..1427723e060 100644 >--- a/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h >+++ b/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h >@@ -26,6 +26,7 @@ > #pragma once > > #include "NetworkSessionCreationParameters.h" >+#include "UserMediaPermissionRequestManagerProxy.h" > #include "WebProcessLifetimeObserver.h" > #include <WebCore/Cookie.h> > #include <WebCore/SecurityOriginData.h> >@@ -53,6 +54,7 @@ namespace WebKit { > > class SecKeyProxyStore; > class StorageManager; >+class PermissionManager; > class WebPageProxy; > class WebProcessPool; > class WebResourceLoadStatisticsStore; >@@ -155,6 +157,8 @@ public: > > StorageManager* storageManager() { return m_storageManager.get(); } > >+ PermissionManager* permissionManager() { return m_permissionRequestManager.get(); } >+ > WebProcessPool* processPoolForCookieStorageOperations(); > bool isAssociatedProcessPool(WebProcessPool&) const; > >@@ -225,6 +229,7 @@ private: > bool m_hasResolvedDirectories { false }; > > const RefPtr<StorageManager> m_storageManager; >+ const RefPtr<PermissionManager> m_permissionRequestManager; > RefPtr<WebResourceLoadStatisticsStore> m_resourceLoadStatistics; > bool m_resourceLoadStatisticsDebugMode { false }; > >diff --git a/Source/WebKit/WebKit.xcodeproj/project.pbxproj b/Source/WebKit/WebKit.xcodeproj/project.pbxproj >index 6f86e045b57..a61396560b5 100644 >--- a/Source/WebKit/WebKit.xcodeproj/project.pbxproj >+++ b/Source/WebKit/WebKit.xcodeproj/project.pbxproj >@@ -68,6 +68,8 @@ > 00B9661A18E25AE100CE1F88 /* FindClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 00B9661818E25AE100CE1F88 /* FindClient.h */; }; > 07297F9E1C17BBEA003F0735 /* UserMediaPermissionCheckProxy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07297F9C1C17BBEA003F0735 /* UserMediaPermissionCheckProxy.cpp */; }; > 07297F9F1C17BBEA003F0735 /* UserMediaPermissionCheckProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 07297F9D1C17BBEA003F0735 /* UserMediaPermissionCheckProxy.h */; }; >+ 07297F9E1C17BBEA014F0735 /* PermissionManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07297F9C1C1711EA003F0735 /* PermissionManager.cpp */; }; >+ 07297F9F1C17BBEA015F0735 /* PermissionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 07297F9D1C17BBEA223F0735 /* PermissionManager.h */; }; > 07297FA21C186ADB003F0735 /* WKUserMediaPermissionCheck.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07297FA01C186ADB003F0735 /* WKUserMediaPermissionCheck.cpp */; }; > 07297FA31C186ADB003F0735 /* WKUserMediaPermissionCheck.h in Headers */ = {isa = PBXBuildFile; fileRef = 07297FA11C186ADB003F0735 /* WKUserMediaPermissionCheck.h */; settings = {ATTRIBUTES = (Private, ); }; }; > 074E75FD1DF2211500D318EC /* UserMediaProcessManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 074E75FC1DF2002400D318EC /* UserMediaProcessManager.cpp */; }; >@@ -2469,6 +2471,8 @@ > 00B9661818E25AE100CE1F88 /* FindClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FindClient.h; sourceTree = "<group>"; }; > 07297F9C1C17BBEA003F0735 /* UserMediaPermissionCheckProxy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UserMediaPermissionCheckProxy.cpp; sourceTree = "<group>"; }; > 07297F9D1C17BBEA003F0735 /* UserMediaPermissionCheckProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UserMediaPermissionCheckProxy.h; sourceTree = "<group>"; }; >+ 07297F9C1C1711EA003F0735 /* PermissionManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PermissionManager.cpp; sourceTree = "<group>"; }; >+ 07297F9D1C17BBEA223F0735 /* PermissionManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PermissionManager.h; sourceTree = "<group>"; }; > 07297FA01C186ADB003F0735 /* WKUserMediaPermissionCheck.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WKUserMediaPermissionCheck.cpp; sourceTree = "<group>"; }; > 07297FA11C186ADB003F0735 /* WKUserMediaPermissionCheck.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKUserMediaPermissionCheck.h; sourceTree = "<group>"; }; > 074E75FB1DF1FD1300D318EC /* UserMediaProcessManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UserMediaProcessManager.h; sourceTree = "<group>"; }; >@@ -7462,6 +7466,8 @@ > 513FFB8B201459A7002596EA /* UIMessagePortChannelProvider.h */, > 07297F9C1C17BBEA003F0735 /* UserMediaPermissionCheckProxy.cpp */, > 07297F9D1C17BBEA003F0735 /* UserMediaPermissionCheckProxy.h */, >+ 07297F9C1C1711EA003F0735 /* PermissionManager.cpp */, >+ 07297F9D1C17BBEA223F0735 /* PermissionManager.h */, > 4A410F3919AF7B04002EBAB5 /* UserMediaPermissionRequestManagerProxy.cpp */, > 4A410F3A19AF7B04002EBAB5 /* UserMediaPermissionRequestManagerProxy.h */, > 4A410F3B19AF7B04002EBAB5 /* UserMediaPermissionRequestProxy.cpp */, >@@ -9406,6 +9412,7 @@ > CD491B131E73482100009066 /* UserMediaCaptureManagerProxy.h in Headers */, > CD491B181E73525500009066 /* UserMediaCaptureManagerProxyMessages.h in Headers */, > 07297F9F1C17BBEA003F0735 /* UserMediaPermissionCheckProxy.h in Headers */, >+ 07297F9F1C17BBEA015F0735 /* PermissionManager.h in Headers */, > 4A3CC18B19B0640F00D14AEF /* UserMediaPermissionRequestManagerProxy.h in Headers */, > 4A3CC18D19B0641900D14AEF /* UserMediaPermissionRequestProxy.h in Headers */, > 074E75FE1DF2211900D318EC /* UserMediaProcessManager.h in Headers */, >@@ -11239,6 +11246,7 @@ > CD491B121E73482100009066 /* UserMediaCaptureManagerProxy.cpp in Sources */, > CD491B171E73525500009066 /* UserMediaCaptureManagerProxyMessageReceiver.cpp in Sources */, > 07297F9E1C17BBEA003F0735 /* UserMediaPermissionCheckProxy.cpp in Sources */, >+ 07297F9E1C17BBEA014F0735 /* PermissionManager.cpp in Sources */, > 15739BBC1B42040300D258C1 /* UserMediaPermissionRequestManager.cpp in Sources */, > 4A3CC18A19B063E700D14AEF /* UserMediaPermissionRequestManagerProxy.cpp in Sources */, > 4A3CC18C19B0641500D14AEF /* UserMediaPermissionRequestProxy.cpp in Sources */, >diff --git a/Tools/MiniBrowser/gtk/main.c b/Tools/MiniBrowser/gtk/main.c >index 58701fc842c..6324122414d 100644 >--- a/Tools/MiniBrowser/gtk/main.c >+++ b/Tools/MiniBrowser/gtk/main.c >@@ -402,6 +402,7 @@ static void gotWebsiteDataCallback(WebKitWebsiteDataManager *manager, GAsyncResu > > guint64 pageID = webkit_web_view_get_page_id(webkit_uri_scheme_request_get_web_view(dataRequest->request)); > aboutDataFillTable(result, dataRequest, dataList, "Cookies", WEBKIT_WEBSITE_DATA_COOKIES, NULL, pageID); >+ aboutDataFillTable(result, dataRequest, dataList, "Permissions", WEBKIT_WEBSITE_DATA_PERMISSIONS, NULL, pageID); > aboutDataFillTable(result, dataRequest, dataList, "Memory Cache", WEBKIT_WEBSITE_DATA_MEMORY_CACHE, NULL, pageID); > aboutDataFillTable(result, dataRequest, dataList, "Disk Cache", WEBKIT_WEBSITE_DATA_DISK_CACHE, webkit_website_data_manager_get_disk_cache_directory(manager), pageID); > aboutDataFillTable(result, dataRequest, dataList, "Session Storage", WEBKIT_WEBSITE_DATA_SESSION_STORAGE, NULL, pageID);
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 185761
:
340841
|
346900
|
351077
|
351080
|
351081
|
351526
|
351531
|
351533
|
351591
|
351952
|
352030