|
Lines 51-67
namespace WebKit {
a/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.cpp_sec1
|
| 51 |
using namespace WebCore; |
51 |
using namespace WebCore; |
| 52 |
|
52 |
|
| 53 |
StorageAreaMap::StorageAreaMap(StorageNamespaceImpl& storageNamespace, Ref<WebCore::SecurityOrigin>&& securityOrigin) |
53 |
StorageAreaMap::StorageAreaMap(StorageNamespaceImpl& storageNamespace, Ref<WebCore::SecurityOrigin>&& securityOrigin) |
| 54 |
: m_namespace(storageNamespace) |
54 |
: m_identifier(StorageAreaMapIdentifier::generate()) |
|
|
55 |
, m_namespace(storageNamespace) |
| 55 |
, m_securityOrigin(WTFMove(securityOrigin)) |
56 |
, m_securityOrigin(WTFMove(securityOrigin)) |
| 56 |
, m_quotaInBytes(storageNamespace.quotaInBytes()) |
57 |
, m_quotaInBytes(storageNamespace.quotaInBytes()) |
| 57 |
, m_type(storageNamespace.storageType()) |
58 |
, m_type(storageNamespace.storageType()) |
| 58 |
{ |
59 |
{ |
| 59 |
connect(); |
60 |
WebProcess::singleton().registerStorageAreaMap(*this); |
| 60 |
} |
61 |
} |
| 61 |
|
62 |
|
| 62 |
StorageAreaMap::~StorageAreaMap() |
63 |
StorageAreaMap::~StorageAreaMap() |
| 63 |
{ |
64 |
{ |
| 64 |
disconnect(); |
65 |
disconnect(); |
|
|
66 |
WebProcess::singleton().unregisterStorageAreaMap(*this); |
| 65 |
} |
67 |
} |
| 66 |
|
68 |
|
| 67 |
unsigned StorageAreaMap::length() |
69 |
unsigned StorageAreaMap::length() |
|
Lines 95-102
void StorageAreaMap::setItem(Frame* sourceFrame, StorageAreaImpl* sourceArea, co
a/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.cpp_sec2
|
| 95 |
|
97 |
|
| 96 |
m_pendingValueChanges.add(key); |
98 |
m_pendingValueChanges.add(key); |
| 97 |
|
99 |
|
| 98 |
if (m_mapID) |
100 |
if (m_remoteAreaIdentifier) |
| 99 |
WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkStorageManager::SetItem(*m_mapID, sourceArea->identifier(), m_currentSeed, key, value, sourceFrame->document()->url().string()), 0); |
101 |
WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkStorageManager::SetItem(*m_remoteAreaIdentifier, sourceArea->identifier(), m_currentSeed, key, value, sourceFrame->document()->url().string()), 0); |
| 100 |
else |
102 |
else |
| 101 |
RELEASE_LOG_ERROR(Storage, "StorageAreaMap::setItem failed because storage map ID is invalid"); |
103 |
RELEASE_LOG_ERROR(Storage, "StorageAreaMap::setItem failed because storage map ID is invalid"); |
| 102 |
} |
104 |
} |
|
Lines 114-136
void StorageAreaMap::removeItem(WebCore::Frame* sourceFrame, StorageAreaImpl* so
a/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.cpp_sec3
|
| 114 |
|
116 |
|
| 115 |
m_pendingValueChanges.add(key); |
117 |
m_pendingValueChanges.add(key); |
| 116 |
|
118 |
|
| 117 |
if (m_mapID) |
119 |
if (m_remoteAreaIdentifier) |
| 118 |
WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkStorageManager::RemoveItem(*m_mapID, sourceArea->identifier(), m_currentSeed, key, sourceFrame->document()->url().string()), 0); |
120 |
WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkStorageManager::RemoveItem(*m_remoteAreaIdentifier, sourceArea->identifier(), m_currentSeed, key, sourceFrame->document()->url().string()), 0); |
| 119 |
else |
121 |
else |
| 120 |
RELEASE_LOG_ERROR(Storage, "StorageAreaMap::removeItem failed because storage map ID is invalid"); |
122 |
RELEASE_LOG_ERROR(Storage, "StorageAreaMap::removeItem failed because storage map ID is invalid"); |
| 121 |
} |
123 |
} |
| 122 |
|
124 |
|
| 123 |
void StorageAreaMap::clear(WebCore::Frame* sourceFrame, StorageAreaImpl* sourceArea) |
125 |
void StorageAreaMap::clear(WebCore::Frame* sourceFrame, StorageAreaImpl* sourceArea) |
| 124 |
{ |
126 |
{ |
| 125 |
connect(); |
127 |
connectSync(); |
| 126 |
|
|
|
| 127 |
resetValues(); |
128 |
resetValues(); |
| 128 |
|
129 |
|
| 129 |
m_hasPendingClear = true; |
130 |
m_hasPendingClear = true; |
| 130 |
m_map = makeUnique<StorageMap>(m_quotaInBytes); |
131 |
m_map = makeUnique<StorageMap>(m_quotaInBytes); |
| 131 |
|
132 |
|
| 132 |
if (m_mapID) |
133 |
if (m_remoteAreaIdentifier) |
| 133 |
WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkStorageManager::Clear(*m_mapID, sourceArea->identifier(), m_currentSeed, sourceFrame->document()->url().string()), 0); |
134 |
WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkStorageManager::Clear(*m_remoteAreaIdentifier, sourceArea->identifier(), m_currentSeed, sourceFrame->document()->url().string()), 0); |
| 134 |
else |
135 |
else |
| 135 |
RELEASE_LOG_ERROR(Storage, "StorageAreaMap::clear failed because storage map ID is invalid"); |
136 |
RELEASE_LOG_ERROR(Storage, "StorageAreaMap::clear failed because storage map ID is invalid"); |
| 136 |
} |
137 |
} |
|
Lines 151-171
void StorageAreaMap::resetValues()
a/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.cpp_sec4
|
| 151 |
|
152 |
|
| 152 |
StorageMap& StorageAreaMap::ensureMap() |
153 |
StorageMap& StorageAreaMap::ensureMap() |
| 153 |
{ |
154 |
{ |
| 154 |
connect(); |
155 |
connectSync(); |
| 155 |
|
156 |
|
| 156 |
if (!m_map) { |
157 |
if (!m_map) |
| 157 |
m_map = makeUnique<StorageMap>(m_quotaInBytes); |
158 |
m_map = makeUnique<StorageMap>(m_quotaInBytes); |
| 158 |
|
159 |
|
| 159 |
if (m_mapID) { |
|
|
| 160 |
// We need to use a IPC::UnboundedSynchronousIPCScope to prevent UIProcess hangs in case we receive a synchronous IPC from the UIProcess while we're waiting for a response |
| 161 |
// from our StorageManagerSet::GetValues() IPC. This IPC may be very slow because it may need to fetch the values from disk and there may be a lot of data. |
| 162 |
IPC::UnboundedSynchronousIPCScope unboundedSynchronousIPCScope; |
| 163 |
HashMap<String, String> values; |
| 164 |
WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::NetworkStorageManager::GetValues(*m_mapID), Messages::StorageManagerSet::GetValues::Reply(values), 0); |
| 165 |
m_map->importItems(WTFMove(values)); |
| 166 |
} else |
| 167 |
RELEASE_LOG_ERROR(Storage, "StorageAreaMap::ensureMap failed to load from network process because storage map ID is invalid"); |
| 168 |
} |
| 169 |
return *m_map; |
160 |
return *m_map; |
| 170 |
} |
161 |
} |
| 171 |
|
162 |
|
|
Lines 259-266
void StorageAreaMap::applyChange(const String& key, const String& newValue)
a/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.cpp_sec5
|
| 259 |
m_map->setItemIgnoringQuota(key, newValue); |
250 |
m_map->setItemIgnoringQuota(key, newValue); |
| 260 |
} |
251 |
} |
| 261 |
|
252 |
|
| 262 |
void StorageAreaMap::dispatchStorageEvent(const std::optional<StorageAreaImplIdentifier>& storageAreaImplID, const String& key, const String& oldValue, const String& newValue, const String& urlString) |
253 |
void StorageAreaMap::dispatchStorageEvent(const std::optional<StorageAreaImplIdentifier>& storageAreaImplID, const String& key, const String& oldValue, const String& newValue, const String& urlString, uint64_t messageIdentifier) |
| 263 |
{ |
254 |
{ |
|
|
255 |
if (messageIdentifier < m_lastHandledMessageIdentifier) |
| 256 |
return; |
| 257 |
|
| 258 |
m_lastHandledMessageIdentifier = messageIdentifier; |
| 264 |
if (!storageAreaImplID) { |
259 |
if (!storageAreaImplID) { |
| 265 |
// This storage event originates from another process so we need to apply the change to our storage area map. |
260 |
// This storage event originates from another process so we need to apply the change to our storage area map. |
| 266 |
applyChange(key, newValue); |
261 |
applyChange(key, newValue); |
|
Lines 272-279
void StorageAreaMap::dispatchStorageEvent(const std::optional<StorageAreaImplIde
a/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.cpp_sec6
|
| 272 |
dispatchLocalStorageEvent(storageAreaImplID, key, oldValue, newValue, urlString); |
267 |
dispatchLocalStorageEvent(storageAreaImplID, key, oldValue, newValue, urlString); |
| 273 |
} |
268 |
} |
| 274 |
|
269 |
|
| 275 |
void StorageAreaMap::clearCache() |
270 |
void StorageAreaMap::clearCache(uint64_t messageIdentifier) |
| 276 |
{ |
271 |
{ |
|
|
272 |
if (messageIdentifier < m_lastHandledMessageIdentifier) |
| 273 |
return; |
| 274 |
|
| 275 |
m_lastHandledMessageIdentifier = messageIdentifier; |
| 277 |
resetValues(); |
276 |
resetValues(); |
| 278 |
} |
277 |
} |
| 279 |
|
278 |
|
|
Lines 344-385
void StorageAreaMap::dispatchLocalStorageEvent(const std::optional<StorageAreaIm
a/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.cpp_sec7
|
| 344 |
StorageEventDispatcher::dispatchLocalStorageEventsToFrames(pageGroup, frames, key, oldValue, newValue, urlString, m_securityOrigin->data()); |
343 |
StorageEventDispatcher::dispatchLocalStorageEventsToFrames(pageGroup, frames, key, oldValue, newValue, urlString, m_securityOrigin->data()); |
| 345 |
} |
344 |
} |
| 346 |
|
345 |
|
|
|
346 |
void StorageAreaMap::sendConnectMessage(SendMode mode) |
| 347 |
{ |
| 348 |
auto& ipcConnection = WebProcess::singleton().ensureNetworkProcessConnection().connection(); |
| 349 |
auto namespaceIdentifier = m_namespace.storageNamespaceID(); |
| 350 |
auto originData = m_securityOrigin->data(); |
| 351 |
auto topOriginData = m_namespace.topLevelOrigin() ? m_namespace.topLevelOrigin()->data() : originData; |
| 352 |
auto origin = WebCore::ClientOrigin { topOriginData, originData }; |
| 353 |
auto type = m_type; |
| 354 |
if ((type == StorageType::Local || type == StorageType::TransientLocal) && m_namespace.topLevelOrigin()) |
| 355 |
type = StorageType::TransientLocal; |
| 356 |
|
| 357 |
if (mode == SendMode::Sync) { |
| 358 |
StorageAreaIdentifier remoteAreaIdentifier; |
| 359 |
HashMap<String, String> items; |
| 360 |
uint64_t messageIdentifier; |
| 361 |
ipcConnection.sendSync(Messages::NetworkStorageManager::ConnectToStorageAreaSync(type, m_identifier, namespaceIdentifier, origin), Messages::NetworkStorageManager::ConnectToStorageAreaSync::Reply(remoteAreaIdentifier, items, messageIdentifier), 0); |
| 362 |
didConnect(remoteAreaIdentifier, WTFMove(items), messageIdentifier); |
| 363 |
return; |
| 364 |
} |
| 365 |
|
| 366 |
auto completionHandler = [this, weakThis = WeakPtr { *this }, weakConnection = WeakPtr { ipcConnection }](auto remoteAreaIdentifier, auto items, auto messageIdentifier) mutable { |
| 367 |
if (weakThis) |
| 368 |
return didConnect(remoteAreaIdentifier, WTFMove(items), messageIdentifier); |
| 369 |
|
| 370 |
if (weakConnection && remoteAreaIdentifier.isValid()) |
| 371 |
weakConnection->send(Messages::NetworkStorageManager::DisconnectFromStorageArea(remoteAreaIdentifier), 0); |
| 372 |
}; |
| 373 |
|
| 374 |
ipcConnection.sendWithAsyncReply(Messages::NetworkStorageManager::ConnectToStorageArea(type, m_identifier, namespaceIdentifier, origin), WTFMove(completionHandler)); |
| 375 |
} |
| 376 |
|
| 377 |
void StorageAreaMap::connectSync() |
| 378 |
{ |
| 379 |
if (m_remoteAreaIdentifier) |
| 380 |
return; |
| 381 |
|
| 382 |
sendConnectMessage(SendMode::Sync); |
| 383 |
} |
| 384 |
|
| 347 |
void StorageAreaMap::connect() |
385 |
void StorageAreaMap::connect() |
| 348 |
{ |
386 |
{ |
| 349 |
if (m_mapID) |
387 |
if (m_remoteAreaIdentifier) |
| 350 |
return; |
388 |
return; |
| 351 |
|
389 |
|
| 352 |
StorageAreaIdentifier mapID; |
390 |
sendConnectMessage(SendMode::Async); |
| 353 |
switch (m_type) { |
391 |
} |
| 354 |
case StorageType::Local: |
|
|
| 355 |
case StorageType::TransientLocal: |
| 356 |
if (SecurityOrigin* topLevelOrigin = m_namespace.topLevelOrigin()) |
| 357 |
WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::NetworkStorageManager::ConnectToTransientLocalStorageArea(m_namespace.storageNamespaceID(), topLevelOrigin->data(), m_securityOrigin->data()), Messages::NetworkStorageManager::ConnectToTransientLocalStorageArea::Reply(mapID), 0); |
| 358 |
else |
| 359 |
WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::NetworkStorageManager::ConnectToLocalStorageArea(m_namespace.storageNamespaceID(), m_securityOrigin->data()), Messages::NetworkStorageManager::ConnectToLocalStorageArea::Reply(mapID), 0); |
| 360 |
break; |
| 361 |
case StorageType::Session: |
| 362 |
WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::NetworkStorageManager::ConnectToSessionStorageArea(m_namespace.storageNamespaceID(), m_securityOrigin->data()), Messages::NetworkStorageManager::ConnectToSessionStorageArea::Reply(mapID), 0); |
| 363 |
} |
| 364 |
|
392 |
|
| 365 |
if (mapID.isValid()) { |
393 |
void StorageAreaMap::didConnect(StorageAreaIdentifier remoteAreaIdentifier, HashMap<String, String>&& items, uint64_t messageIdentifier) |
| 366 |
m_mapID = mapID; |
394 |
{ |
| 367 |
WebProcess::singleton().registerStorageAreaMap(*this); |
395 |
if (messageIdentifier < m_lastHandledMessageIdentifier) |
| 368 |
} |
396 |
return; |
|
|
397 |
|
| 398 |
m_lastHandledMessageIdentifier = messageIdentifier; |
| 399 |
if (!remoteAreaIdentifier.isValid()) |
| 400 |
return; |
| 401 |
|
| 402 |
m_remoteAreaIdentifier = remoteAreaIdentifier; |
| 403 |
m_map = makeUnique<StorageMap>(m_quotaInBytes); |
| 404 |
m_map->importItems(WTFMove(items)); |
| 369 |
} |
405 |
} |
| 370 |
|
406 |
|
| 371 |
void StorageAreaMap::disconnect() |
407 |
void StorageAreaMap::disconnect() |
| 372 |
{ |
408 |
{ |
| 373 |
if (!m_mapID) |
409 |
if (!m_remoteAreaIdentifier) |
| 374 |
return; |
410 |
return; |
| 375 |
|
411 |
|
| 376 |
resetValues(); |
412 |
resetValues(); |
| 377 |
WebProcess::singleton().unregisterStorageAreaMap(*this); |
|
|
| 378 |
|
413 |
|
| 379 |
if (auto* networkProcessConnection = WebProcess::singleton().existingNetworkProcessConnection()) |
414 |
if (auto* networkProcessConnection = WebProcess::singleton().existingNetworkProcessConnection()) |
| 380 |
networkProcessConnection->connection().send(Messages::NetworkStorageManager::DisconnectFromStorageArea(*m_mapID), 0); |
415 |
networkProcessConnection->connection().send(Messages::NetworkStorageManager::DisconnectFromStorageArea(*m_remoteAreaIdentifier), 0); |
| 381 |
|
416 |
|
| 382 |
m_mapID = { }; |
417 |
m_remoteAreaIdentifier = { }; |
|
|
418 |
m_lastHandledMessageIdentifier = 0; |
| 383 |
} |
419 |
} |
| 384 |
|
420 |
|
| 385 |
void StorageAreaMap::incrementUseCount() |
421 |
void StorageAreaMap::incrementUseCount() |