Skip to content

Commit

Permalink
Create DeviceIdHashSaltStorage only when it is necessary
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=270946
rdar://124563708

Reviewed by Chris Dumez.

Currently WebsiteDataStore creates DeviceIdHashSaltStorage unconditionally at initialization, and
DeviceIdHashSaltStorage reads all data into memory at initialization. To reduce memory use and avoid unnecessary I/O
operations, this patch makes sure DeviceIdHashSaltStorage is created when it's going to used.

* Source/WebKit/UIProcess/API/glib/WebKitUIClient.cpp:
* Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp:
(WebKit::UserMediaPermissionRequestManagerProxy::grantRequest):
(WebKit::UserMediaPermissionRequestManagerProxy::processUserMediaPermissionRequest):
(WebKit::UserMediaPermissionRequestManagerProxy::enumerateMediaDevicesForFrame):
* Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp:
(WebKit::WebsiteDataStore::WebsiteDataStore):
(WebKit::WebsiteDataStore::fetchDataAndApply):
(WebKit::WebsiteDataStore::removeData):
(WebKit::WebsiteDataStore::ensureDeviceIdHashSaltStorage):
(WebKit::WebsiteDataStore::ensureProtectedDeviceIdHashSaltStorage):
(WebKit::WebsiteDataStore::protectedDeviceIdHashSaltStorage): Deleted.
* Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h:
(WebKit::WebsiteDataStore::deviceIdHashSaltStorage): Deleted.

Canonical link: https://commits.webkit.org/276119@main
  • Loading branch information
szewai committed Mar 14, 2024
1 parent 129e646 commit 04246e3
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 13 deletions.
2 changes: 1 addition & 1 deletion Source/WebKit/UIProcess/API/glib/WebKitUIClient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,7 @@ class UIClient : public API::UIClient {

void checkUserMediaPermissionForOrigin(WebPageProxy& page, WebFrameProxy&, API::SecurityOrigin& userMediaDocumentOrigin, API::SecurityOrigin& topLevelDocumentOrigin, UserMediaPermissionCheckProxy& permissionRequest) override
{
auto deviceInfoPermissionRequest = adoptGRef(webkitDeviceInfoPermissionRequestCreate(permissionRequest, &page.websiteDataStore().deviceIdHashSaltStorage()));
auto deviceInfoPermissionRequest = adoptGRef(webkitDeviceInfoPermissionRequestCreate(permissionRequest, page.websiteDataStore().ensureProtectedDeviceIdHashSaltStorage().ptr()));
webkitWebViewMakePermissionRequest(m_webView, WEBKIT_PERMISSION_REQUEST(deviceInfoPermissionRequest.get()));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -274,7 +274,7 @@ void UserMediaPermissionRequestManagerProxy::grantRequest(UserMediaPermissionReq

Ref userMediaDocumentSecurityOrigin = request.userMediaDocumentSecurityOrigin();
Ref topLevelDocumentSecurityOrigin = request.topLevelDocumentSecurityOrigin();
page->websiteDataStore().protectedDeviceIdHashSaltStorage()->deviceIdHashSaltForOrigin(userMediaDocumentSecurityOrigin, topLevelDocumentSecurityOrigin, [weakThis = WeakPtr { *this }, request = Ref { request }](String&&) mutable {
page->websiteDataStore().ensureProtectedDeviceIdHashSaltStorage()->deviceIdHashSaltForOrigin(userMediaDocumentSecurityOrigin, topLevelDocumentSecurityOrigin, [weakThis = WeakPtr { *this }, request = Ref { request }](String&&) mutable {
if (weakThis)
weakThis->finishGrantingRequest(request);
});
Expand Down Expand Up @@ -581,7 +581,7 @@ void UserMediaPermissionRequestManagerProxy::processUserMediaPermissionRequest()

Ref userMediaDocumentSecurityOrigin = m_currentUserMediaRequest->userMediaDocumentSecurityOrigin();
Ref topLevelDocumentSecurityOrigin = m_currentUserMediaRequest->topLevelDocumentSecurityOrigin();
protectedPage()->websiteDataStore().protectedDeviceIdHashSaltStorage()->deviceIdHashSaltForOrigin(userMediaDocumentSecurityOrigin, topLevelDocumentSecurityOrigin, [this, weakThis = WeakPtr { *this }, request = m_currentUserMediaRequest] (String&& deviceIDHashSalt) mutable {
protectedPage()->websiteDataStore().ensureProtectedDeviceIdHashSaltStorage()->deviceIdHashSaltForOrigin(userMediaDocumentSecurityOrigin, topLevelDocumentSecurityOrigin, [this, weakThis = WeakPtr { *this }, request = m_currentUserMediaRequest] (String&& deviceIDHashSalt) mutable {
if (!weakThis)
return;

Expand Down Expand Up @@ -942,7 +942,7 @@ void UserMediaPermissionRequestManagerProxy::enumerateMediaDevicesForFrame(Frame
m_pendingDeviceRequests.add(requestID);

callCompletionHandler.release();
page->websiteDataStore().protectedDeviceIdHashSaltStorage()->deviceIdHashSaltForOrigin(userMediaDocumentOrigin, topLevelDocumentOrigin, [this, weakThis = WeakPtr { *this }, requestID, frameID, userMediaDocumentOrigin, topLevelDocumentOrigin, originHasPersistentAccess, completionHandler = WTFMove(completionHandler)](String&& deviceIDHashSalt) mutable {
page->websiteDataStore().ensureProtectedDeviceIdHashSaltStorage()->deviceIdHashSaltForOrigin(userMediaDocumentOrigin, topLevelDocumentOrigin, [this, weakThis = WeakPtr { *this }, requestID, frameID, userMediaDocumentOrigin, topLevelDocumentOrigin, originHasPersistentAccess, completionHandler = WTFMove(completionHandler)](String&& deviceIDHashSalt) mutable {
auto callCompletionHandler = makeScopeExit([&completionHandler] {
completionHandler({ }, { });
});
Expand Down
19 changes: 13 additions & 6 deletions Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,6 @@ WebsiteDataStore::WebsiteDataStore(Ref<WebsiteDataStoreConfiguration>&& configur
: m_sessionID(sessionID)
, m_resolvedConfiguration(WTFMove(configuration))
, m_configuration(m_resolvedConfiguration->copy())
, m_deviceIdHashSaltStorage(DeviceIdHashSaltStorage::create(isPersistent() ? m_configuration->deviceIdHashSaltsStorageDirectory() : String()))
, m_trackingPreventionDebugMode(m_resolvedConfiguration->resourceLoadStatisticsDebugModeEnabled())
, m_queue(WorkQueue::create("com.apple.WebKit.WebsiteDataStore"))
#if ENABLE(WEB_AUTHN)
Expand Down Expand Up @@ -672,7 +671,7 @@ void WebsiteDataStore::fetchDataAndApply(OptionSet<WebsiteDataType> dataTypes, O
}

if (dataTypes.contains(WebsiteDataType::DeviceIdHashSalt)) {
m_deviceIdHashSaltStorage->getDeviceIdHashSaltOrigins([callbackAggregator](auto&& origins) {
ensureProtectedDeviceIdHashSaltStorage()->getDeviceIdHashSaltOrigins([callbackAggregator](auto&& origins) {
WebsiteData websiteData;
websiteData.entries = WTF::map(origins, [](auto& origin) {
return WebsiteData::Entry { origin, WebsiteDataType::DeviceIdHashSalt, 0 };
Expand Down Expand Up @@ -790,7 +789,7 @@ void WebsiteDataStore::removeData(OptionSet<WebsiteDataType> dataTypes, WallTime
}

if (dataTypes.contains(WebsiteDataType::DeviceIdHashSalt) || (dataTypes.contains(WebsiteDataType::Cookies)))
m_deviceIdHashSaltStorage->deleteDeviceIdHashSaltOriginsModifiedSince(modifiedSince, [callbackAggregator] { });
ensureProtectedDeviceIdHashSaltStorage()->deleteDeviceIdHashSaltOriginsModifiedSince(modifiedSince, [callbackAggregator] { });

if (dataTypes.contains(WebsiteDataType::MediaKeys) && isPersistent()) {
auto mediaKeysStorageDirectory = migrateMediaKeysStorageIfNecessary(m_configuration->mediaKeysStorageDirectory());
Expand Down Expand Up @@ -882,7 +881,7 @@ void WebsiteDataStore::removeData(OptionSet<WebsiteDataType> dataTypes, const Ve
}

if (dataTypes.contains(WebsiteDataType::DeviceIdHashSalt) || (dataTypes.contains(WebsiteDataType::Cookies)))
protectedDeviceIdHashSaltStorage()->deleteDeviceIdHashSaltForOrigins(origins, [callbackAggregator] { });
ensureProtectedDeviceIdHashSaltStorage()->deleteDeviceIdHashSaltForOrigins(origins, [callbackAggregator] { });

if (dataTypes.contains(WebsiteDataType::MediaKeys) && isPersistent()) {
HashSet<WebCore::SecurityOriginData> origins;
Expand All @@ -898,9 +897,17 @@ void WebsiteDataStore::removeData(OptionSet<WebsiteDataType> dataTypes, const Ve
}
}

Ref<DeviceIdHashSaltStorage> WebsiteDataStore::protectedDeviceIdHashSaltStorage()
DeviceIdHashSaltStorage& WebsiteDataStore::ensureDeviceIdHashSaltStorage()
{
return m_deviceIdHashSaltStorage;
if (!m_deviceIdHashSaltStorage)
m_deviceIdHashSaltStorage = DeviceIdHashSaltStorage::create(isPersistent() ? m_configuration->deviceIdHashSaltsStorageDirectory() : String());

return *m_deviceIdHashSaltStorage;
}

Ref<DeviceIdHashSaltStorage> WebsiteDataStore::ensureProtectedDeviceIdHashSaltStorage()
{
return ensureDeviceIdHashSaltStorage();
}

void WebsiteDataStore::setServiceWorkerTimeoutForTesting(Seconds seconds)
Expand Down
6 changes: 3 additions & 3 deletions Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h
Original file line number Diff line number Diff line change
Expand Up @@ -300,8 +300,8 @@ class WebsiteDataStore : public API::ObjectImpl<API::Object::Type::WebsiteDataSt
#endif
void allowTLSCertificateChainForLocalPCMTesting(const WebCore::CertificateInfo&);

DeviceIdHashSaltStorage& deviceIdHashSaltStorage() { return m_deviceIdHashSaltStorage.get(); }
Ref<DeviceIdHashSaltStorage> protectedDeviceIdHashSaltStorage();
DeviceIdHashSaltStorage& ensureDeviceIdHashSaltStorage();
Ref<DeviceIdHashSaltStorage> ensureProtectedDeviceIdHashSaltStorage();

WebsiteDataStoreParameters parameters();
static Vector<WebsiteDataStoreParameters> parametersFromEachWebsiteDataStore();
Expand Down Expand Up @@ -549,7 +549,7 @@ class WebsiteDataStore : public API::ObjectImpl<API::Object::Type::WebsiteDataSt
Ref<WebsiteDataStoreConfiguration> m_resolvedConfiguration;
Ref<const WebsiteDataStoreConfiguration> m_configuration;
bool m_hasResolvedDirectories { false };
const Ref<DeviceIdHashSaltStorage> m_deviceIdHashSaltStorage;
RefPtr<DeviceIdHashSaltStorage> m_deviceIdHashSaltStorage;
#if PLATFORM(IOS_FAMILY)
String m_resolvedContainerCachesWebContentDirectory;
String m_resolvedContainerCachesNetworkingDirectory;
Expand Down

0 comments on commit 04246e3

Please sign in to comment.