12022-01-17 Sihui Liu <sihui_liu@apple.com>
2
3 Make LocalStorage prewarming async
4 https://bugs.webkit.org/show_bug.cgi?id=235236
5
6 Reviewed by NOBODY (OOPS!).
7
8 StorageAreaMap in web process needs to sync with a remote StorageArea in network process before it performs any
9 Web Storage operation. To connect to remote StorageArea, StorageAreaMap currently sends out two sync messages:
10 1. ConnectTo*StorageArea: for getting the remote StorageAreaIdentifier
11 2. getValues: for getting the content of StorageArea
12 We can merge these two messages into one message: ConnectToStorageAreaSync, and return both remote
13 StorageAreaIdentifier and content in its reply. This way, web process will not be blocked twice.
14
15 To reduce the wait time for connecting to a local StorageArea, we would prewarm LocalStorage by creating its
16 StorageAreaMap ahead and making it connected (r247555), but we don't actually need StorageAreaMap to be ready
17 for operation at this time. Therefore, a new async message ConnectToStorageArea is added to be used for
18 prewarming.
19
20 If LocalStorage is used immediately after prewarming, a StorageAreaMap may send ConnectToStorageAreaSync before
21 receiving the reply of ConnectToStorageArea. In this case, StorageAreaMap would handle ConnectToStorageAreaSync
22 reply before ConnectToStorageArea reply (due to the priority of sync message), and also before other async
23 messages (DispatchStorageEvent / ClearCache) that are sent from network process earlier before the sync reply.
24 To solve this, we use a message identifier to indicate the order of messages sent from network process, so
25 StorageAreaMap can ignore previous messages when it is already synced with a more recent version of StorageArea.
26
27 * NetworkProcess/WebStorage/StorageArea.cpp:
28 (WebKit::StorageArea::clear):
29 (WebKit::StorageArea::dispatchEvents const):
30 * NetworkProcess/storage/LocalStorageManager.cpp:
31 (WebKit::LocalStorageManager::connectToLocalStorageArea):
32 (WebKit::LocalStorageManager::connectToTransientLocalStorageArea):
33 * NetworkProcess/storage/LocalStorageManager.h:
34 * NetworkProcess/storage/NetworkStorageManager.cpp:
35 (WebKit::NetworkStorageManager::connectToStorageArea):
36 (WebKit::NetworkStorageManager::connectToStorageAreaSync):
37 (WebKit::NetworkStorageManager::connectToLocalStorageArea): Deleted.
38 (WebKit::NetworkStorageManager::connectToTransientLocalStorageArea): Deleted.
39 (WebKit::NetworkStorageManager::connectToSessionStorageArea): Deleted.
40 (WebKit::NetworkStorageManager::getValues): Deleted.
41 * NetworkProcess/storage/NetworkStorageManager.h:
42 * NetworkProcess/storage/NetworkStorageManager.messages.in:
43 * NetworkProcess/storage/SessionStorageManager.cpp:
44 (WebKit::SessionStorageManager::connectToSessionStorageArea):
45 * NetworkProcess/storage/SessionStorageManager.h:
46 * NetworkProcess/storage/StorageAreaBase.cpp:
47 (WebKit::StorageAreaBase::nextMessageIdentifier):
48 (WebKit::StorageAreaBase::StorageAreaBase):
49 (WebKit::StorageAreaBase::addListener):
50 (WebKit::StorageAreaBase::notifyListenersAboutClear):
51 (WebKit::StorageAreaBase::dispatchEvents const):
52 * NetworkProcess/storage/StorageAreaBase.h:
53 * Scripts/webkit/messages.py:
54 (types_that_cannot_be_forward_declared):
55 (headers_for_type):
56 * WebKit.xcodeproj/project.pbxproj:
57 * WebProcess/Network/NetworkProcessConnection.cpp:
58 (WebKit::NetworkProcessConnection::didReceiveMessage):
59 * WebProcess/WebProcess.cpp:
60 (WebKit::WebProcess::networkProcessConnectionClosed):
61 (WebKit::WebProcess::registerStorageAreaMap):
62 (WebKit::WebProcess::unregisterStorageAreaMap):
63 (WebKit::WebProcess::storageAreaMap const):
64 * WebProcess/WebProcess.h:
65 * WebProcess/WebStorage/StorageAreaImpl.cpp:
66 (WebKit::StorageAreaImpl::prewarm):
67 (WebKit::StorageAreaImpl::incrementAccessCount): Deleted.
68 (WebKit::StorageAreaImpl::decrementAccessCount): Deleted.
69 (WebKit::StorageAreaImpl::closeDatabaseIfIdle): Deleted.
70 * WebProcess/WebStorage/StorageAreaImpl.h:
71 * WebProcess/WebStorage/StorageAreaMap.cpp:
72 (WebKit::StorageAreaMap::StorageAreaMap):
73 (WebKit::StorageAreaMap::~StorageAreaMap):
74 (WebKit::StorageAreaMap::setItem):
75 (WebKit::StorageAreaMap::removeItem):
76 (WebKit::StorageAreaMap::clear):
77 (WebKit::StorageAreaMap::ensureMap):
78 (WebKit::StorageAreaMap::dispatchStorageEvent):
79 (WebKit::StorageAreaMap::clearCache):
80 (WebKit::StorageAreaMap::sendConnectMessage):
81 (WebKit::StorageAreaMap::connectSync):
82 (WebKit::StorageAreaMap::connect):
83 (WebKit::StorageAreaMap::didConnect):
84 (WebKit::StorageAreaMap::disconnect):
85 * WebProcess/WebStorage/StorageAreaMap.h:
86 * WebProcess/WebStorage/StorageAreaMap.messages.in:
87 * WebProcess/WebStorage/StorageAreaMapIdentifier.h: Added.
88