Changeset 248734 in webkit
- Timestamp:
- Aug 15, 2019, 11:41:53 AM (7 years ago)
- Location:
- trunk
- Files:
-
- 3 added
- 1 deleted
- 89 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/platform/ios-simulator-wk2/TestExpectations (modified) (1 diff)
-
LayoutTests/platform/mac-wk2/TestExpectations (modified) (1 diff)
-
LayoutTests/storage/domstorage/localstorage/private-browsing-affects-storage-expected.txt (modified) (1 diff)
-
LayoutTests/storage/indexeddb/IDBObject-leak.html (modified) (3 diffs)
-
LayoutTests/storage/indexeddb/modern/opendatabase-after-storage-crash-expected.txt (modified) (1 diff)
-
LayoutTests/storage/indexeddb/modern/opendatabase-after-storage-crash.html (modified) (5 diffs)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/loader/EmptyClients.cpp (modified) (3 diffs)
-
Source/WebCore/page/Chrome.cpp (modified) (1 diff)
-
Source/WebCore/page/DOMWindow.cpp (modified) (1 diff)
-
Source/WebCore/page/Page.cpp (modified) (5 diffs)
-
Source/WebCore/page/Page.h (modified) (3 diffs)
-
Source/WebCore/storage/Storage.cpp (modified) (1 diff)
-
Source/WebCore/storage/Storage.h (modified) (1 diff)
-
Source/WebCore/storage/StorageArea.h (modified) (1 diff)
-
Source/WebCore/storage/StorageNamespace.h (modified) (2 diffs)
-
Source/WebCore/storage/StorageNamespaceProvider.cpp (modified) (3 diffs)
-
Source/WebCore/storage/StorageNamespaceProvider.h (modified) (3 diffs)
-
Source/WebCore/storage/StorageType.h (modified) (2 diffs)
-
Source/WebKit/CMakeLists.txt (modified) (1 diff)
-
Source/WebKit/ChangeLog (modified) (1 diff)
-
Source/WebKit/DerivedSources-input.xcfilelist (modified) (2 diffs)
-
Source/WebKit/DerivedSources-output.xcfilelist (modified) (1 diff)
-
Source/WebKit/DerivedSources.make (modified) (1 diff)
-
Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp (modified) (3 diffs)
-
Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h (modified) (1 diff)
-
Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in (modified) (1 diff)
-
Source/WebKit/NetworkProcess/NetworkProcess.cpp (modified) (16 diffs)
-
Source/WebKit/NetworkProcess/NetworkProcess.h (modified) (4 diffs)
-
Source/WebKit/NetworkProcess/NetworkProcess.messages.in (modified) (1 diff)
-
Source/WebKit/NetworkProcess/NetworkSession.cpp (modified) (4 diffs)
-
Source/WebKit/NetworkProcess/NetworkSession.h (modified) (3 diffs)
-
Source/WebKit/NetworkProcess/NetworkSessionCreationParameters.cpp (modified) (4 diffs)
-
Source/WebKit/NetworkProcess/NetworkSessionCreationParameters.h (modified) (1 diff)
-
Source/WebKit/NetworkProcess/WebStorage/LocalStorageDatabase.cpp (modified) (1 diff)
-
Source/WebKit/NetworkProcess/WebStorage/LocalStorageDatabase.h (modified) (2 diffs)
-
Source/WebKit/NetworkProcess/WebStorage/LocalStorageDatabaseTracker.cpp (modified) (2 diffs)
-
Source/WebKit/NetworkProcess/WebStorage/LocalStorageDatabaseTracker.h (modified) (3 diffs)
-
Source/WebKit/NetworkProcess/WebStorage/LocalStorageNamespace.cpp (modified) (2 diffs)
-
Source/WebKit/NetworkProcess/WebStorage/LocalStorageNamespace.h (modified) (1 diff)
-
Source/WebKit/NetworkProcess/WebStorage/SessionStorageNamespace.cpp (modified) (1 diff)
-
Source/WebKit/NetworkProcess/WebStorage/SessionStorageNamespace.h (modified) (2 diffs)
-
Source/WebKit/NetworkProcess/WebStorage/StorageArea.cpp (modified) (9 diffs)
-
Source/WebKit/NetworkProcess/WebStorage/StorageArea.h (modified) (3 diffs)
-
Source/WebKit/NetworkProcess/WebStorage/StorageManager.cpp (modified) (8 diffs)
-
Source/WebKit/NetworkProcess/WebStorage/StorageManager.h (modified) (3 diffs)
-
Source/WebKit/NetworkProcess/WebStorage/StorageManager.messages.in (deleted)
-
Source/WebKit/NetworkProcess/WebStorage/StorageManagerSet.cpp (added)
-
Source/WebKit/NetworkProcess/WebStorage/StorageManagerSet.h (added)
-
Source/WebKit/NetworkProcess/WebStorage/StorageManagerSet.messages.in (added)
-
Source/WebKit/Shared/WebsiteDataStoreParameters.cpp (modified) (3 diffs)
-
Source/WebKit/Shared/WebsiteDataStoreParameters.h (modified) (1 diff)
-
Source/WebKit/Sources.txt (modified) (1 diff)
-
Source/WebKit/UIProcess/API/C/WKContext.cpp (modified) (1 diff)
-
Source/WebKit/UIProcess/API/C/WKContextPrivate.h (modified) (1 diff)
-
Source/WebKit/UIProcess/API/C/WKWebsiteDataStoreRef.cpp (modified) (1 diff)
-
Source/WebKit/UIProcess/API/C/WKWebsiteDataStoreRef.h (modified) (1 diff)
-
Source/WebKit/UIProcess/WebProcessPool.cpp (modified) (2 diffs)
-
Source/WebKit/UIProcess/WebProcessPool.h (modified) (1 diff)
-
Source/WebKit/UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm (modified) (3 diffs)
-
Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp (modified) (1 diff)
-
Source/WebKit/WebKit.xcodeproj/project.pbxproj (modified) (10 diffs)
-
Source/WebKit/WebProcess/InjectedBundle/InjectedBundle.cpp (modified) (2 diffs)
-
Source/WebKit/WebProcess/WebProcess.cpp (modified) (6 diffs)
-
Source/WebKit/WebProcess/WebProcess.h (modified) (1 diff)
-
Source/WebKit/WebProcess/WebStorage/StorageAreaImpl.cpp (modified) (6 diffs)
-
Source/WebKit/WebProcess/WebStorage/StorageAreaImpl.h (modified) (2 diffs)
-
Source/WebKit/WebProcess/WebStorage/StorageAreaMap.cpp (modified) (13 diffs)
-
Source/WebKit/WebProcess/WebStorage/StorageAreaMap.h (modified) (6 diffs)
-
Source/WebKit/WebProcess/WebStorage/StorageAreaMap.messages.in (modified) (1 diff)
-
Source/WebKit/WebProcess/WebStorage/StorageNamespaceImpl.cpp (modified) (4 diffs)
-
Source/WebKit/WebProcess/WebStorage/StorageNamespaceImpl.h (modified) (3 diffs)
-
Source/WebKit/WebProcess/WebStorage/WebStorageNamespaceProvider.cpp (modified) (1 diff)
-
Source/WebKit/WebProcess/WebStorage/WebStorageNamespaceProvider.h (modified) (1 diff)
-
Source/WebKitLegacy/ChangeLog (modified) (1 diff)
-
Source/WebKitLegacy/Storage/StorageAreaImpl.cpp (modified) (1 diff)
-
Source/WebKitLegacy/Storage/StorageAreaImpl.h (modified) (2 diffs)
-
Source/WebKitLegacy/Storage/StorageAreaSync.h (modified) (1 diff)
-
Source/WebKitLegacy/Storage/StorageNamespaceImpl.cpp (modified) (7 diffs)
-
Source/WebKitLegacy/Storage/StorageNamespaceImpl.h (modified) (4 diffs)
-
Source/WebKitLegacy/Storage/WebStorageNamespaceProvider.cpp (modified) (2 diffs)
-
Source/WebKitLegacy/Storage/WebStorageNamespaceProvider.h (modified) (1 diff)
-
Source/WebKitLegacy/mac/ChangeLog (modified) (1 diff)
-
Source/WebKitLegacy/mac/WebView/WebView.mm (modified) (1 diff)
-
Tools/ChangeLog (modified) (1 diff)
-
Tools/TestWebKitAPI/Tests/WebKitCocoa/LocalStoragePersistence.mm (modified) (1 diff)
-
Tools/WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl (modified) (1 diff)
-
Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp (modified) (1 diff)
-
Tools/WebKitTestRunner/InjectedBundle/TestRunner.h (modified) (1 diff)
-
Tools/WebKitTestRunner/TestController.cpp (modified) (3 diffs)
-
Tools/WebKitTestRunner/TestController.h (modified) (1 diff)
-
Tools/WebKitTestRunner/TestInvocation.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r248733 r248734 1 2019-08-15 Sihui Liu <sihui_liu@apple.com> 2 3 Some improvements on web storage 4 https://bugs.webkit.org/show_bug.cgi?id=200373 5 6 Reviewed by Geoffrey Garen. 7 8 Modify tests for a behavior change: sessionStorage will be lost when network process crashes. 9 10 For tests which use sessionStorage to store items, crash network process, then read from sessionStorage and 11 expect items to be in sessionStorage, replace sessionStorage with localStorage. Also, to make sure localStorage 12 is stored persistently before network process gets terminated, adopt a newly introduced SPI to 13 synchronously flush localStorage content to disk before terminating network process. 14 15 * platform/ios-simulator-wk2/TestExpectations: 16 * platform/mac-wk2/TestExpectations: 17 * storage/domstorage/localstorage/private-browsing-affects-storage-expected.txt: 18 * storage/indexeddb/IDBObject-leak.html: 19 * storage/indexeddb/modern/opendatabase-after-storage-crash-expected.txt: 20 * storage/indexeddb/modern/opendatabase-after-storage-crash.html: 21 1 22 2019-08-15 Wenson Hsieh <wenson_hsieh@apple.com> 2 23 -
trunk/LayoutTests/platform/ios-simulator-wk2/TestExpectations
r246641 r248734 67 67 http/wpt/cache-storage/cache-quota-add.any.html [ Slow ] 68 68 69 webkit.org/b/196376 [ Debug ] storage/domstorage/localstorage/private-browsing-affects-storage.html [ Pass Failure]69 webkit.org/b/196376 [ Debug ] storage/domstorage/localstorage/private-browsing-affects-storage.html [ Pass ] 70 70 71 71 webkit.org/b/196403 imported/w3c/web-platform-tests/mediacapture-record/MediaRecorder-stop.html [ Pass Failure ] -
trunk/LayoutTests/platform/mac-wk2/TestExpectations
r248679 r248734 923 923 webkit.org/b/194916 fast/mediastream/MediaStream-video-element.html [ Pass Failure ] 924 924 925 webkit.org/b/196376 storage/domstorage/localstorage/private-browsing-affects-storage.html [ Pass Failure]925 webkit.org/b/196376 storage/domstorage/localstorage/private-browsing-affects-storage.html [ Pass ] 926 926 927 927 webkit.org/b/196400 fast/mediastream/MediaStreamTrack-getSettings.html [ Pass Failure ] -
trunk/LayoutTests/storage/domstorage/localstorage/private-browsing-affects-storage-expected.txt
r215315 r248734 9 9 ALERT: The item in new window is now: NewWindowValue 10 10 ALERT: Back in parent window, localStorage's length is: 1 11 ALERT: Back in parent window, testItem is: ChangedValue11 ALERT: Back in parent window, testItem is: NewWindowValue 12 12 ALERT: Final window, localStorage's length is: 1 13 13 ALERT: Final window, item is: Persistent item! -
trunk/LayoutTests/storage/indexeddb/IDBObject-leak.html
r242043 r248734 14 14 } 15 15 16 if ( sessionStorage.doneFirstLoad) {16 if (localStorage.doneFirstLoad) { 17 17 gc(); 18 18 shouldBeEqualToNumber("internals.numberOfIDBTransactions()", 0); … … 24 24 var request = window.indexedDB.open(dbname); 25 25 request.onupgradeneeded = function(evt) { 26 sessionStorage.doneFirstLoad = true;26 localStorage.doneFirstLoad = true; 27 27 if (!window.testRunner || !testRunner.terminateNetworkProcess) { 28 28 testFailed('This test requires access to the TestRunner object and terminateNetworkProcess() function'); … … 30 30 return; 31 31 } 32 33 // Make sure localStorage is flushed to disk before crashing network process. 34 testRunner.syncLocalStorage(); 32 35 testRunner.terminateNetworkProcess(); 33 setTimeout((()=> { 34 location.reload(); 35 }), 0); 36 evt.target.result.onerror = function(e) { 37 setTimeout((()=> { 38 location.reload(); 39 }), 0); 40 } 36 41 } 37 42 } -
trunk/LayoutTests/storage/indexeddb/modern/opendatabase-after-storage-crash-expected.txt
r234077 r248734 1 PASS sessionStorage[storageKey] is "Made it"1 PASS localStorage[storageKey] is "Made it" 2 2 Successfully opened database with version 3. -
trunk/LayoutTests/storage/indexeddb/modern/opendatabase-after-storage-crash.html
r236035 r248734 21 21 // Good, we received an expected error. 22 22 // Now reload to see if a new document connects successfully 23 if ( sessionStorage[storageKey]) {23 if (localStorage[storageKey]) { 24 24 document.body.innerHTML = "Received error more than once unexpectedly. Database: name " + dbname + ", version 2."; 25 25 if (window.testRunner) … … 28 28 } 29 29 30 sessionStorage[storageKey] = "Made it";30 localStorage[storageKey] = "Made it"; 31 31 location.reload(); 32 32 } 33 33 34 34 request.onsuccess = function(e) { 35 document.body.innerHTML = "Unexpected upgradeneeded after storage process termination. Database: name " + dbname + ", version 2. SessionStorage value: " + sessionStorage[storageKey] + ".";35 document.body.innerHTML = "Unexpected upgradeneeded after storage process termination. Database: name " + dbname + ", version 2. localStorage value: " + sessionStorage[storageKey] + "."; 36 36 if (window.testRunner) 37 37 testRunner.notifyDone(); … … 39 39 } 40 40 41 var versionToOpen = sessionStorage.doneFirstLoad ? 3 : 1;41 var versionToOpen = localStorage.doneFirstLoad ? 3 : 1; 42 42 var request = window.indexedDB.open(dbname, versionToOpen); 43 43 44 44 request.onupgradeneeded = function(e) { 45 if ( sessionStorage.doneFirstLoad) {45 if (localStorage.doneFirstLoad) { 46 46 document.body.innerHTML = "Successfully opened database with version " + versionToOpen + "."; 47 shouldBeEqualToString(' sessionStorage[storageKey]', 'Made it');47 shouldBeEqualToString('localStorage[storageKey]', 'Made it'); 48 48 49 49 if (window.testRunner) { … … 53 53 } 54 54 55 sessionStorage.doneFirstLoad = true;55 localStorage.doneFirstLoad = true; 56 56 57 57 // Set an error handler on the database connection so once the storage process terminates we know to continue the test … … 62 62 if (window.testRunner) { 63 63 testRunner.waitUntilDone(); 64 // Make sure localStorage is flushed to disk before crashing network process. 65 testRunner.syncLocalStorage(); 64 66 testRunner.terminateNetworkProcess(); 65 67 } -
trunk/Source/WebCore/ChangeLog
r248730 r248734 1 2019-08-15 Sihui Liu <sihui_liu@apple.com> 2 3 Some improvements on web storage 4 https://bugs.webkit.org/show_bug.cgi?id=200373 5 6 Reviewed by Geoffrey Garen. 7 8 Remove storage type EphemeralLocalStorage, which is used for localStorage in ephemeral session, and use 9 LocalStorage instead. 10 11 Add SessionID to StorageNamespace to make StorageNamespace session-specific. 12 13 No new test, updating existing tests for new behavior. 14 15 * loader/EmptyClients.cpp: 16 (WebCore::EmptyStorageNamespaceProvider::createLocalStorageNamespace): 17 (WebCore::EmptyStorageNamespaceProvider::createTransientLocalStorageNamespace): 18 (WebCore::EmptyStorageNamespaceProvider::createEphemeralLocalStorageNamespace): Deleted. 19 20 * page/Chrome.cpp: 21 (WebCore::Chrome::createWindow const): ephemeral localStorage of different windows will connect to the same 22 StorageArea in network process, so no need to copy from parent window to child window. 23 24 * page/DOMWindow.cpp: 25 (WebCore::DOMWindow::prewarmLocalStorageIfNecessary): localStorage will be prewarmed in network process in the 26 initialization of StorageAreaMap. 27 28 * page/Page.cpp: 29 (WebCore::m_applicationManifest): 30 (WebCore::Page::~Page): 31 (WebCore::Page::setSessionID): 32 (WebCore::Page::ephemeralLocalStorage): Deleted. 33 (WebCore::Page::setEphemeralLocalStorage): Deleted. 34 (WebCore::Page::setStorageNamespaceProvider): Deleted. 35 * page/Page.h: 36 (WebCore::Page::storageNamespaceProvider): 37 * storage/Storage.cpp: 38 (WebCore::Storage::prewarm): Deleted. 39 * storage/Storage.h: 40 * storage/StorageArea.h: 41 (WebCore::StorageArea::closeDatabaseIfIdle): 42 (WebCore::StorageArea::prewarm): Deleted. 43 * storage/StorageNamespace.h: 44 * storage/StorageNamespaceProvider.cpp: 45 (WebCore::StorageNamespaceProvider::~StorageNamespaceProvider): 46 (WebCore::StorageNamespaceProvider::localStorageArea): 47 (WebCore::StorageNamespaceProvider::localStorageNamespace): 48 (WebCore::StorageNamespaceProvider::transientLocalStorageNamespace): 49 (WebCore::StorageNamespaceProvider::enableLegacyPrivateBrowsingForTesting): change SessionID of storageNamespace 50 and update every StorageArea in this namespace. 51 (WebCore::StorageNamespaceProvider::addPage): Deleted. 52 (WebCore::StorageNamespaceProvider::removePage): Deleted. 53 * storage/StorageNamespaceProvider.h: 54 * storage/StorageType.h: 55 (WebCore::isLocalStorage): 56 1 57 2019-08-15 Saam Barati <sbarati@apple.com> 2 58 -
trunk/Source/WebCore/loader/EmptyClients.cpp
r247722 r248734 391 391 StorageType storageType() const final { return StorageType::Local; } 392 392 size_t memoryBytesUsedByCache() final { return 0; } 393 const SecurityOriginData& securityOrigin() const final { static NeverDestroyed<SecurityOriginData> origin; return origin.get(); }394 393 }; 395 394 … … 397 396 Ref<StorageArea> storageArea(const SecurityOriginData&) final { return adoptRef(*new EmptyStorageArea); } 398 397 Ref<StorageNamespace> copy(Page*) final { return adoptRef(*new EmptyStorageNamespace); } 398 PAL::SessionID sessionID() const { return PAL::SessionID::emptySessionID(); } 399 void setSessionIDForTesting(PAL::SessionID) { }; 399 400 }; 400 401 401 402 Ref<StorageNamespace> createSessionStorageNamespace(Page&, unsigned) final; 402 Ref<StorageNamespace> createLocalStorageNamespace(unsigned ) final;403 Ref<StorageNamespace> create EphemeralLocalStorageNamespace(Page&, unsigned) final;404 Ref<StorageNamespace> createTransientLocalStorageNamespace(SecurityOrigin&, unsigned) final; 403 Ref<StorageNamespace> createLocalStorageNamespace(unsigned, PAL::SessionID) final; 404 Ref<StorageNamespace> createTransientLocalStorageNamespace(SecurityOrigin&, unsigned, PAL::SessionID) final; 405 405 406 }; 406 407 … … 526 527 } 527 528 528 Ref<StorageNamespace> EmptyStorageNamespaceProvider::createLocalStorageNamespace(unsigned )529 Ref<StorageNamespace> EmptyStorageNamespaceProvider::createLocalStorageNamespace(unsigned, PAL::SessionID) 529 530 { 530 531 return adoptRef(*new EmptyStorageNamespace); 531 532 } 532 533 533 Ref<StorageNamespace> EmptyStorageNamespaceProvider::createEphemeralLocalStorageNamespace(Page&, unsigned) 534 { 535 return adoptRef(*new EmptyStorageNamespace); 536 } 537 538 Ref<StorageNamespace> EmptyStorageNamespaceProvider::createTransientLocalStorageNamespace(SecurityOrigin&, unsigned) 534 Ref<StorageNamespace> EmptyStorageNamespaceProvider::createTransientLocalStorageNamespace(SecurityOrigin&, unsigned, PAL::SessionID) 539 535 { 540 536 return adoptRef(*new EmptyStorageNamespace); -
trunk/Source/WebCore/page/Chrome.cpp
r248139 r248734 190 190 if (auto* oldSessionStorage = m_page.sessionStorage(false)) 191 191 newPage->setSessionStorage(oldSessionStorage->copy(newPage)); 192 if (auto* oldEphemeralLocalStorage = m_page.ephemeralLocalStorage(false))193 newPage->setEphemeralLocalStorage(oldEphemeralLocalStorage->copy(newPage));194 192 195 193 return newPage; -
trunk/Source/WebCore/page/DOMWindow.cpp
r248491 r248734 443 443 return; 444 444 445 if (localStorage->prewarm()) 446 page->mainFrame().didPrewarmLocalStorage(); 445 page->mainFrame().didPrewarmLocalStorage(); 447 446 } 448 447 -
trunk/Source/WebCore/page/Page.cpp
r248667 r248734 290 290 291 291 m_pluginInfoProvider->addPage(*this); 292 m_storageNamespaceProvider->addPage(*this);293 292 m_userContentProvider->addPage(*this); 294 293 m_visitedLinkStore->addPage(*this); … … 368 367 369 368 m_pluginInfoProvider->removePage(*this); 370 m_storageNamespaceProvider->removePage(*this);371 369 m_userContentProvider->removePage(*this); 372 370 m_visitedLinkStore->removePage(*this); … … 1509 1507 { 1510 1508 m_sessionStorage = WTFMove(newStorage); 1511 }1512 1513 StorageNamespace* Page::ephemeralLocalStorage(bool optionalCreate)1514 {1515 if (!m_ephemeralLocalStorage && optionalCreate)1516 m_ephemeralLocalStorage = m_storageNamespaceProvider->createEphemeralLocalStorageNamespace(*this, m_settings->sessionStorageQuota());1517 1518 return m_ephemeralLocalStorage.get();1519 }1520 1521 void Page::setEphemeralLocalStorage(RefPtr<StorageNamespace>&& newStorage)1522 {1523 m_ephemeralLocalStorage = WTFMove(newStorage);1524 1509 } 1525 1510 … … 2471 2456 } 2472 2457 2473 void Page::setStorageNamespaceProvider(Ref<StorageNamespaceProvider>&& storageNamespaceProvider)2474 {2475 m_storageNamespaceProvider->removePage(*this);2476 m_storageNamespaceProvider = WTFMove(storageNamespaceProvider);2477 m_storageNamespaceProvider->addPage(*this);2478 2479 // This needs to reset all the local storage namespaces of all the pages.2480 }2481 2482 2458 VisitedLinkStore& Page::visitedLinkStore() 2483 2459 { … … 2507 2483 m_idbConnectionToServer = nullptr; 2508 2484 #endif 2485 2486 if (sessionID != m_sessionID && m_sessionStorage) 2487 m_sessionStorage->setSessionIDForTesting(sessionID); 2509 2488 2510 2489 bool privateBrowsingStateChanged = (sessionID.isEphemeral() != m_sessionID.isEphemeral()); -
trunk/Source/WebCore/page/Page.h
r247667 r248734 508 508 void setSessionStorage(RefPtr<StorageNamespace>&&); 509 509 510 StorageNamespace* ephemeralLocalStorage(bool optionalCreate = true);511 void setEphemeralLocalStorage(RefPtr<StorageNamespace>&&);512 513 510 bool hasCustomHTMLTokenizerTimeDelay() const; 514 511 double customHTMLTokenizerTimeDelay() const; … … 600 597 601 598 StorageNamespaceProvider& storageNamespaceProvider() { return m_storageNamespaceProvider.get(); } 602 void setStorageNamespaceProvider(Ref<StorageNamespaceProvider>&&);603 599 604 600 PluginInfoProvider& pluginInfoProvider(); … … 878 874 879 875 RefPtr<StorageNamespace> m_sessionStorage; 880 RefPtr<StorageNamespace> m_ephemeralLocalStorage;881 876 882 877 TimerThrottlingState m_timerThrottlingState { TimerThrottlingState::Disabled }; -
trunk/Source/WebCore/storage/Storage.cpp
r247555 r248734 98 98 } 99 99 100 bool Storage::prewarm()101 {102 return m_storageArea->prewarm();103 }104 105 100 ExceptionOr<void> Storage::clear() 106 101 { -
trunk/Source/WebCore/storage/Storage.h
r247555 r248734 47 47 ExceptionOr<void> clear(); 48 48 bool contains(const String& key) const; 49 bool prewarm();50 49 51 50 // Bindings support functions. -
trunk/Source/WebCore/storage/StorageArea.h
r247555 r248734 59 59 virtual void decrementAccessCount() { } 60 60 virtual void closeDatabaseIfIdle() { } 61 virtual bool prewarm() { return false; }62 63 virtual const SecurityOriginData& securityOrigin() const = 0;64 61 }; 65 62 -
trunk/Source/WebCore/storage/StorageNamespace.h
r239535 r248734 29 29 #include <wtf/RefCounted.h> 30 30 31 namespace PAL { 32 class SessionID; 33 } 34 31 35 namespace WebCore { 32 36 … … 40 44 virtual Ref<StorageArea> storageArea(const SecurityOriginData&) = 0; 41 45 virtual Ref<StorageNamespace> copy(Page* newPage) = 0; 46 47 virtual PAL::SessionID sessionID() const = 0; 48 virtual void setSessionIDForTesting(PAL::SessionID) = 0; 42 49 }; 43 50 -
trunk/Source/WebCore/storage/StorageNamespaceProvider.cpp
r239535 r248734 44 44 StorageNamespaceProvider::~StorageNamespaceProvider() 45 45 { 46 ASSERT(m_pages.isEmpty());47 }48 49 void StorageNamespaceProvider::addPage(Page& page)50 {51 ASSERT(!m_pages.contains(&page));52 53 m_pages.add(&page);54 }55 56 void StorageNamespaceProvider::removePage(Page& page)57 {58 ASSERT(m_pages.contains(&page));59 60 m_pages.remove(&page);61 46 } 62 47 … … 67 52 ASSERT(document.page()); 68 53 69 bool ephemeral = document.page()->usesEphemeralSession();70 54 bool transient = !document.securityOrigin().canAccessLocalStorage(&document.topOrigin()); 71 55 … … 73 57 74 58 if (transient) 75 storageNamespace = &transientLocalStorageNamespace(document.topOrigin()); 76 else if (ephemeral) 77 storageNamespace = document.page()->ephemeralLocalStorage(); 59 storageNamespace = &transientLocalStorageNamespace(document.topOrigin(), document.page()->sessionID()); 78 60 else 79 storageNamespace = &localStorageNamespace( );61 storageNamespace = &localStorageNamespace(document.page()->sessionID()); 80 62 81 63 return storageNamespace->storageArea(document.securityOrigin().data()); 82 64 } 83 65 84 StorageNamespace& StorageNamespaceProvider::localStorageNamespace( )66 StorageNamespace& StorageNamespaceProvider::localStorageNamespace(PAL::SessionID sessionID) 85 67 { 86 68 if (!m_localStorageNamespace) 87 m_localStorageNamespace = createLocalStorageNamespace(localStorageDatabaseQuotaInBytes );69 m_localStorageNamespace = createLocalStorageNamespace(localStorageDatabaseQuotaInBytes, sessionID); 88 70 71 ASSERT(m_localStorageNamespace->sessionID() == sessionID); 89 72 return *m_localStorageNamespace; 90 73 } 91 74 92 StorageNamespace& StorageNamespaceProvider::transientLocalStorageNamespace(SecurityOrigin& securityOrigin )75 StorageNamespace& StorageNamespaceProvider::transientLocalStorageNamespace(SecurityOrigin& securityOrigin, PAL::SessionID sessionID) 93 76 { 94 auto& slot = m_transientLocalStorage Map.add(&securityOrigin, nullptr).iterator->value;77 auto& slot = m_transientLocalStorageNamespaces.add(securityOrigin.data(), nullptr).iterator->value; 95 78 if (!slot) 96 slot = createTransientLocalStorageNamespace(securityOrigin, localStorageDatabaseQuotaInBytes );79 slot = createTransientLocalStorageNamespace(securityOrigin, localStorageDatabaseQuotaInBytes, sessionID); 97 80 81 ASSERT(slot->sessionID() == sessionID); 98 82 return *slot; 99 83 } 100 84 85 void StorageNamespaceProvider::enableLegacyPrivateBrowsingForTesting(bool enabled) 86 { 87 auto newSessionID = enabled ? PAL::SessionID::legacyPrivateSessionID() : PAL::SessionID::defaultSessionID(); 88 if (m_localStorageNamespace && newSessionID != m_localStorageNamespace->sessionID()) 89 m_localStorageNamespace->setSessionIDForTesting(newSessionID); 90 91 for (auto& transientLocalStorageNamespace : m_transientLocalStorageNamespaces.values()) { 92 if (newSessionID != transientLocalStorageNamespace->sessionID()) 93 m_localStorageNamespace->setSessionIDForTesting(newSessionID); 94 } 101 95 } 96 97 } -
trunk/Source/WebCore/storage/StorageNamespaceProvider.h
r239535 r248734 32 32 #include <wtf/RefCounted.h> 33 33 34 namespace PAL { 35 class SessionID; 36 } 37 34 38 namespace WebCore { 35 39 … … 46 50 47 51 virtual Ref<StorageNamespace> createSessionStorageNamespace(Page&, unsigned quota) = 0; 48 virtual Ref<StorageNamespace> createEphemeralLocalStorageNamespace(Page&, unsigned quota) = 0;49 52 50 53 Ref<StorageArea> localStorageArea(Document&); 51 54 52 void addPage(Page&); 53 void removePage(Page&); 55 WEBCORE_EXPORT void enableLegacyPrivateBrowsingForTesting(bool enabled); 54 56 55 57 protected: … … 57 59 58 60 private: 59 StorageNamespace& localStorageNamespace( );60 StorageNamespace& transientLocalStorageNamespace(SecurityOrigin& );61 StorageNamespace& localStorageNamespace(PAL::SessionID); 62 StorageNamespace& transientLocalStorageNamespace(SecurityOrigin&, PAL::SessionID); 61 63 62 virtual Ref<StorageNamespace> createLocalStorageNamespace(unsigned quota) = 0; 63 virtual Ref<StorageNamespace> createTransientLocalStorageNamespace(SecurityOrigin&, unsigned quota) = 0; 64 65 HashSet<Page*> m_pages; 64 virtual Ref<StorageNamespace> createLocalStorageNamespace(unsigned quota, PAL::SessionID) = 0; 65 virtual Ref<StorageNamespace> createTransientLocalStorageNamespace(SecurityOrigin&, unsigned quota, PAL::SessionID) = 0; 66 66 67 67 RefPtr<StorageNamespace> m_localStorageNamespace; 68 HashMap< RefPtr<SecurityOrigin>, RefPtr<StorageNamespace>> m_transientLocalStorageMap;68 HashMap<SecurityOriginData, RefPtr<StorageNamespace>> m_transientLocalStorageNamespaces; 69 69 }; 70 70 -
trunk/Source/WebCore/storage/StorageType.h
r215315 r248734 31 31 Session, 32 32 Local, 33 EphemeralLocal,34 33 TransientLocal, 35 34 }; … … 37 36 inline bool isLocalStorage(StorageType storageType) 38 37 { 39 return storageType == StorageType::Local || storageType == StorageType::TransientLocal || storageType == StorageType::EphemeralLocal;38 return storageType == StorageType::Local || storageType == StorageType::TransientLocal; 40 39 } 41 40 -
trunk/Source/WebKit/CMakeLists.txt
r246388 r248734 119 119 NetworkProcess/ServiceWorker/WebSWServerToContextConnection.messages.in 120 120 121 NetworkProcess/WebStorage/StorageManager .messages.in121 NetworkProcess/WebStorage/StorageManagerSet.messages.in 122 122 123 123 NetworkProcess/cache/CacheStorageEngineConnection.messages.in -
trunk/Source/WebKit/ChangeLog
r248733 r248734 1 2019-08-15 Sihui Liu <sihui_liu@apple.com> 2 3 Some improvements on web storage 4 https://bugs.webkit.org/show_bug.cgi?id=200373 5 6 Reviewed by Geoffrey Garen. 7 8 Fix some issues in web storage architecture. For example, sessionStorageNameSpace for web page is prepared and 9 destroyed in the network process when the page comes and goes, even though the page may not use sessionStorage 10 at all. The messages about page state sent from web process to network process can be waste. 11 12 Here are some general ideas of this patch: 13 1. Network process owns the web storage, and web process keeps a small local copy (based on session and 14 origins that are visited). There is a virtual connection from the local copy in the web process to the original 15 copy in the network process. The connection is created by web process when some page asks for web storage. 16 2. If connection is lost because network process is gone, storage in memory will be lost. The local copy in web 17 processs will be discarded. 18 3. (SessionID, StorageNamespaceID, SecurityOrigin) is used to identify a storage area. If session is changed in 19 web process (like enabling private browsing in layout test now), a re-connection with different sessionID would 20 suffice to load another copy of storage. 21 4. localStorage in ephemeral session has the same behavior as localStorage instead of sessionStorage, which 22 means different pages in the same ephemeral session share the same localStorage. 23 24 Also, this patch introduces StorageManagerSet to network process. It handles web storage stuff, including 25 receiving storage messages from web process, on one background thread. Previously each session has its own 26 StorageManager and each StorageManager has its own WorkQueue. 27 28 * CMakeLists.txt: 29 * DerivedSources-input.xcfilelist: 30 * DerivedSources-output.xcfilelist: 31 * DerivedSources.make: 32 33 * NetworkProcess/NetworkConnectionToWebProcess.cpp: remove message handlers that are no longer needed. Network 34 process no longer needs to know page states from web process. 35 (WebKit::NetworkConnectionToWebProcess::didClose): 36 (WebKit::NetworkConnectionToWebProcess::webPageWasAdded): Deleted. 37 (WebKit::NetworkConnectionToWebProcess::webPageWasRemoved): Deleted. 38 (WebKit::NetworkConnectionToWebProcess::webProcessSessionChanged): Deleted. 39 * NetworkProcess/NetworkConnectionToWebProcess.h: 40 * NetworkProcess/NetworkConnectionToWebProcess.messages.in: 41 42 * NetworkProcess/NetworkProcess.cpp: NetworkProcess uses StorageManagerSet instead of StorageManager from 43 different sessions to deal with web storage. 44 (WebKit::NetworkProcess::NetworkProcess): 45 (WebKit::NetworkProcess::initializeNetworkProcess): 46 (WebKit::NetworkProcess::createNetworkConnectionToWebProcess): StorageManagerSet starts handling 47 StorageManagerSet messages from the new connection. 48 (WebKit::NetworkProcess::addWebsiteDataStore): 49 (WebKit::NetworkProcess::destroySession): 50 (WebKit::NetworkProcess::hasLocalStorage): 51 (WebKit::NetworkProcess::fetchWebsiteData): 52 (WebKit::NetworkProcess::deleteWebsiteData): 53 (WebKit::NetworkProcess::deleteWebsiteDataForOrigins): 54 (WebKit::NetworkProcess::deleteWebsiteDataForRegistrableDomains): 55 (WebKit::NetworkProcess::actualPrepareToSuspend): 56 (WebKit::NetworkProcess::resume): 57 (WebKit::NetworkProcess::syncLocalStorage): 58 (WebKit::NetworkProcess::clearLegacyPrivateBrowsingLocalStorage): added for clearing in-memory ephemeral 59 localStorage. 60 (WebKit::NetworkProcess::getLocalStorageOriginDetails): 61 (WebKit::NetworkProcess::connectionToWebProcessClosed): 62 (WebKit::NetworkProcess::webPageWasAdded): Deleted. 63 (WebKit::NetworkProcess::webPageWasRemoved): Deleted. 64 (WebKit::NetworkProcess::webProcessWasDisconnected): Deleted. 65 (WebKit::NetworkProcess::webProcessSessionChanged): Deleted. 66 * NetworkProcess/NetworkProcess.h: 67 * NetworkProcess/NetworkProcess.messages.in: 68 69 * NetworkProcess/NetworkSession.cpp: StorageManager is moved out of NetworkSession. It is now managed by 70 StorageManagerSet. 71 (WebKit::NetworkSession::NetworkSession): 72 (WebKit::NetworkSession::~NetworkSession): 73 * NetworkProcess/NetworkSession.h: 74 (WebKit::NetworkSession::storageManager): Deleted. 75 76 * NetworkProcess/NetworkSessionCreationParameters.cpp: creation parameters of StorageManager is moved out of 77 NetworkSessionCreationParameters. 78 (WebKit::NetworkSessionCreationParameters::privateSessionParameters): 79 (WebKit::NetworkSessionCreationParameters::encode const): 80 (WebKit::NetworkSessionCreationParameters::decode): 81 * NetworkProcess/NetworkSessionCreationParameters.h: 82 83 * NetworkProcess/WebStorage/LocalStorageDatabase.cpp: 84 (WebKit::LocalStorageDatabase::updateDatabase): remove an assertion that is no longer true as we can force an 85 update with syncLocalStorage now. 86 * NetworkProcess/WebStorage/LocalStorageDatabase.h: make updateDatabase public for syncLocalStorage. 87 88 * NetworkProcess/WebStorage/LocalStorageDatabaseTracker.cpp: LocalStorageDatabaseTracker is created on the 89 background thread now, so it does not hold WorkQueue to do the file operation. 90 (WebKit::LocalStorageDatabaseTracker::create): 91 (WebKit::LocalStorageDatabaseTracker::LocalStorageDatabaseTracker): 92 (WebKit::LocalStorageDatabaseTracker::~LocalStorageDatabaseTracker): 93 * NetworkProcess/WebStorage/LocalStorageDatabaseTracker.h: 94 * NetworkProcess/WebStorage/LocalStorageNamespace.cpp: 95 (WebKit::LocalStorageNamespace::getOrCreateStorageArea): 96 (WebKit::LocalStorageNamespace::cloneTo): Deleted. 97 * NetworkProcess/WebStorage/LocalStorageNamespace.h: 98 * NetworkProcess/WebStorage/SessionStorageNamespace.cpp: 99 (WebKit::SessionStorageNamespace::getOrCreateStorageArea): 100 (WebKit::SessionStorageNamespace::addAllowedConnection): Deleted. 101 (WebKit::SessionStorageNamespace::removeAllowedConnection): Deleted. 102 * NetworkProcess/WebStorage/SessionStorageNamespace.h: 103 (WebKit::SessionStorageNamespace::allowedConnections const): Deleted. 104 105 * NetworkProcess/WebStorage/StorageArea.cpp: 106 (WebKit::generateStorageAreaIdentifier): each StorageArea has an identifier. StorageAreaMap in web process uses 107 this identifier to indicate which StorageArea it is connecting to. 108 (WebKit::StorageArea::StorageArea): 109 (WebKit::StorageArea::~StorageArea): StorageArea may still have listeners because StorageArea should be 110 destroyed by requests from UI process, and listeners are connections to web processses. 111 (WebKit::StorageArea::addListener): load localStorageDatabase in advance if there is some connection to this 112 LocalStorage area. 113 (WebKit::StorageArea::removeListener): 114 (WebKit::StorageArea::hasListener const): 115 (WebKit::StorageArea::clear): 116 (WebKit::StorageArea::openDatabaseAndImportItemsIfNeeded const): 117 (WebKit::StorageArea::dispatchEvents const): 118 (WebKit::StorageArea::syncToDatabase): 119 (WebKit::StorageArea::setItems): Deleted. Stop syncing from web process to network process after network process 120 is relaunched. 121 * NetworkProcess/WebStorage/StorageArea.h: 122 (WebKit::StorageArea::identifier): 123 (WebKit::StorageArea::setWorkQueue): 124 125 * NetworkProcess/WebStorage/StorageManager.cpp: StorageManager should be accessed by only background thread now. 126 (WebKit::StorageManager::StorageManager): 127 (WebKit::StorageManager::~StorageManager): 128 (WebKit::StorageManager::createSessionStorageNamespace): 129 (WebKit::StorageManager::destroySessionStorageNamespace): this is not used now but keep it for future 130 improvement to remove in-memory sessionStorage in network process if we know some web page is gone forever. 131 (WebKit::StorageManager::cloneSessionStorageNamespace): previously each page had its own ephemeral 132 localStorageNamespace and now all pages in the same session share one localStorage, so we don't need to clone 133 localStorageNamespace. 134 (WebKit::StorageManager::getSessionStorageOrigins): 135 (WebKit::StorageManager::deleteSessionStorageOrigins): 136 (WebKit::StorageManager::deleteSessionStorageEntriesForOrigins): 137 (WebKit::StorageManager::getLocalStorageOrigins): 138 (WebKit::StorageManager::getLocalStorageOriginDetails): 139 (WebKit::StorageManager::deleteLocalStorageOriginsModifiedSince): 140 (WebKit::StorageManager::deleteLocalStorageEntriesForOrigins): 141 (WebKit::StorageManager::createLocalStorageArea): 142 (WebKit::StorageManager::createTransientLocalStorageArea): 143 (WebKit::StorageManager::createSessionStorageArea): 144 (WebKit::StorageManager::getOrCreateLocalStorageNamespace): 145 (WebKit::StorageManager::getOrCreateTransientLocalStorageNamespace): 146 (WebKit::StorageManager::getOrCreateSessionStorageNamespace): 147 (WebKit::StorageManager::clearStorageNamespaces): 148 (WebKit::StorageManager::addAllowedSessionStorageNamespaceConnection): Deleted. 149 (WebKit::StorageManager::removeAllowedSessionStorageNamespaceConnection): Deleted. 150 (WebKit::StorageManager::processDidCloseConnection): Deleted. 151 (WebKit::StorageManager::deleteLocalStorageEntriesForOrigin): Deleted. 152 (WebKit::StorageManager::createLocalStorageMap): Deleted. 153 (WebKit::StorageManager::createTransientLocalStorageMap): Deleted. 154 (WebKit::StorageManager::createSessionStorageMap): Deleted. 155 (WebKit::StorageManager::destroyStorageMap): Deleted. 156 (WebKit::StorageManager::prewarm): Deleted. 157 (WebKit::StorageManager::getValues): Deleted. 158 (WebKit::StorageManager::setItem): Deleted. 159 (WebKit::StorageManager::setItems): Deleted. 160 (WebKit::StorageManager::removeItem): Deleted. 161 (WebKit::StorageManager::clear): Deleted. 162 (WebKit::StorageManager::waitUntilTasksFinished): Deleted. 163 (WebKit::StorageManager::suspend): Deleted. 164 (WebKit::StorageManager::resume): Deleted. 165 (WebKit::StorageManager::findStorageArea const): Deleted. 166 * NetworkProcess/WebStorage/StorageManager.h: 167 (WebKit::StorageManager::workQueue const): Deleted. 168 (): Deleted. 169 170 * NetworkProcess/WebStorage/StorageManager.messages.in: Removed. Moved to StorageManagerSet.messages.in. 171 172 * NetworkProcess/WebStorage/StorageManagerSet.cpp: Added. 173 (WebKit::StorageManagerSet::create): 174 (WebKit::StorageManagerSet::StorageManagerSet): 175 (WebKit::StorageManagerSet::~StorageManagerSet): 176 (WebKit::StorageManagerSet::add): 177 (WebKit::StorageManagerSet::remove): 178 (WebKit::StorageManagerSet::contains): 179 (WebKit::StorageManagerSet::addConnection): 180 (WebKit::StorageManagerSet::removeConnection): 181 (WebKit::StorageManagerSet::waitUntilTasksFinished): 182 (WebKit::StorageManagerSet::waitUntilSyncingLocalStorageFinished): 183 (WebKit::StorageManagerSet::suspend): 184 (WebKit::StorageManagerSet::resume): 185 (WebKit::StorageManagerSet::getSessionStorageOrigins): 186 (WebKit::StorageManagerSet::deleteSessionStorage): 187 (WebKit::StorageManagerSet::deleteSessionStorageForOrigins): 188 (WebKit::StorageManagerSet::getLocalStorageOrigins): 189 (WebKit::StorageManagerSet::deleteLocalStorageModifiedSince): 190 (WebKit::StorageManagerSet::deleteLocalStorageForOrigins): 191 (WebKit::StorageManagerSet::getLocalStorageOriginDetails): 192 (WebKit::StorageManagerSet::connectToLocalStorageArea): 193 (WebKit::StorageManagerSet::connectToTransientLocalStorageArea): 194 (WebKit::StorageManagerSet::connectToSessionStorageArea): 195 (WebKit::StorageManagerSet::disconnectFromStorageArea): 196 (WebKit::StorageManagerSet::getValues): 197 (WebKit::StorageManagerSet::setItem): 198 (WebKit::StorageManagerSet::removeItem): 199 (WebKit::StorageManagerSet::clear): 200 (WebKit::StorageManagerSet::cloneSessionStorageNamespace): 201 * NetworkProcess/WebStorage/StorageManagerSet.h: Added. 202 * NetworkProcess/WebStorage/StorageManagerSet.messages.in: Added. 203 204 * Shared/WebsiteDataStoreParameters.cpp: creation parameters of StorageManager are moved to 205 WebsiteDataStoreParameters. 206 (WebKit::WebsiteDataStoreParameters::encode const): 207 (WebKit::WebsiteDataStoreParameters::decode): 208 (WebKit::WebsiteDataStoreParameters::privateSessionParameters): 209 * Shared/WebsiteDataStoreParameters.h: 210 * Sources.txt: 211 212 * UIProcess/API/C/WKContext.cpp: add SPI for tests. 213 (WKContextSyncLocalStorage): 214 (WKContextClearLegacyPrivateBrowsingLocalStorage): 215 * UIProcess/API/C/WKContextPrivate.h: 216 * UIProcess/API/C/WKWebsiteDataStoreRef.cpp: 217 (WKWebsiteDataStoreRemoveLocalStorage): 218 * UIProcess/API/C/WKWebsiteDataStoreRef.h: 219 * UIProcess/WebProcessPool.cpp: 220 (WebKit::WebProcessPool::ensureNetworkProcess): 221 (WebKit::WebProcessPool::syncLocalStorage): 222 (WebKit::WebProcessPool::clearLegacyPrivateBrowsingLocalStorage): 223 * UIProcess/WebProcessPool.h: 224 * UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm: 225 (WebKit::WebsiteDataStore::parameters): 226 * UIProcess/WebsiteData/WebsiteDataStore.cpp: 227 (WebKit::WebsiteDataStore::parameters): 228 * WebKit.xcodeproj/project.pbxproj: 229 230 * WebProcess/InjectedBundle/InjectedBundle.cpp: session change of web storage is done via 231 WebStorageNamespaceProvider instead of WebProcess now. 232 (WebKit::InjectedBundle::setPrivateBrowsingEnabled): 233 * WebProcess/WebProcess.cpp: web process no longer sends messsages about page state to network process. 234 (WebKit::WebProcess::createWebPage): 235 (WebKit::WebProcess::removeWebPage): 236 (WebKit::WebProcess::ensureNetworkProcessConnection): 237 (WebKit::WebProcess::networkProcessConnectionClosed): 238 (WebKit::WebProcess::storageAreaMap const): 239 (WebKit::WebProcess::enablePrivateBrowsingForTesting): Deleted. This was used for changing session via 240 WebProcess. 241 * WebProcess/WebProcess.h: 242 * WebProcess/WebStorage/StorageAreaImpl.cpp: 243 (WebKit::StorageAreaImpl::StorageAreaImpl): 244 (WebKit::StorageAreaImpl::length): 245 (WebKit::StorageAreaImpl::key): 246 (WebKit::StorageAreaImpl::item): 247 (WebKit::StorageAreaImpl::setItem): 248 (WebKit::StorageAreaImpl::removeItem): 249 (WebKit::StorageAreaImpl::clear): 250 (WebKit::StorageAreaImpl::contains): 251 (WebKit::StorageAreaImpl::storageType const): 252 (WebKit::StorageAreaImpl::incrementAccessCount): 253 (WebKit::StorageAreaImpl::decrementAccessCount): 254 (WebKit::StorageAreaImpl::prewarm): Deleted. 255 (WebKit::StorageAreaImpl::securityOrigin const): Deleted. 256 257 * WebProcess/WebStorage/StorageAreaImpl.h: make StorageAreaImpl hold a weak reference to StorageAreaMap and 258 StorageNamespaceImpl hold a strong reference. In this way lifeime of localStorage StorageAreraMap stays align 259 with StorageNameSpaceProvider and Page. 260 261 * WebProcess/WebStorage/StorageAreaMap.cpp: identifier of StorageAreaMap is the same as identifier of 262 StorageArea it connects to. If the identifier is 0, it means the StorageAreaMap is disconnected. 263 (WebKit::StorageAreaMap::StorageAreaMap): 264 (WebKit::StorageAreaMap::~StorageAreaMap): 265 (WebKit::StorageAreaMap::setItem): 266 (WebKit::StorageAreaMap::removeItem): 267 (WebKit::StorageAreaMap::clear): 268 (WebKit::StorageAreaMap::resetValues): 269 (WebKit::StorageAreaMap::loadValuesIfNeeded): 270 (WebKit::StorageAreaMap::applyChange): 271 (WebKit::StorageAreaMap::dispatchStorageEvent): 272 (WebKit::StorageAreaMap::dispatchSessionStorageEvent): 273 (WebKit::StorageAreaMap::dispatchLocalStorageEvent): 274 (WebKit::StorageAreaMap::connect): 275 (WebKit::StorageAreaMap::disconnect): 276 (WebKit::generateStorageMapID): Deleted. 277 (WebKit::StorageAreaMap::prewarm): Deleted. 278 (WebKit::StorageAreaMap::didGetValues): Deleted. This is useless as GetValues is a synchronous operation. 279 * WebProcess/WebStorage/StorageAreaMap.h: 280 (): Deleted. 281 282 * WebProcess/WebStorage/StorageAreaMap.messages.in: there are two synchronous messages, one for connection and 283 one for getting values. We may merge them into one in future improvement. 284 * WebProcess/WebStorage/StorageNamespaceImpl.cpp: 285 (WebKit::StorageNamespaceImpl::createSessionStorageNamespace): 286 (WebKit::StorageNamespaceImpl::createLocalStorageNamespace): 287 (WebKit::StorageNamespaceImpl::createTransientLocalStorageNamespace): 288 (WebKit::StorageNamespaceImpl::StorageNamespaceImpl): 289 (WebKit::StorageNamespaceImpl::storageArea): 290 (WebKit::StorageNamespaceImpl::copy): 291 (WebKit::StorageNamespaceImpl::setSessionIDForTesting): 292 (WebKit::StorageNamespaceImpl::createEphemeralLocalStorageNamespace): Deleted. 293 * WebProcess/WebStorage/StorageNamespaceImpl.h: 294 * WebProcess/WebStorage/WebStorageNamespaceProvider.cpp: 295 (WebKit::WebStorageNamespaceProvider::createSessionStorageNamespace): 296 (WebKit::WebStorageNamespaceProvider::createLocalStorageNamespace): 297 (WebKit::WebStorageNamespaceProvider::createTransientLocalStorageNamespace): 298 (WebKit::WebStorageNamespaceProvider::createEphemeralLocalStorageNamespace): Deleted. 299 * WebProcess/WebStorage/WebStorageNamespaceProvider.h: 300 1 301 2019-08-15 Wenson Hsieh <wenson_hsieh@apple.com> 2 302 -
trunk/Source/WebKit/DerivedSources-input.xcfilelist
r246388 r248734 26 26 $(PROJECT_DIR)/NetworkProcess/ServiceWorker/WebSWServerConnection.messages.in 27 27 $(PROJECT_DIR)/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.messages.in 28 $(PROJECT_DIR)/NetworkProcess/WebStorage/StorageManager .messages.in28 $(PROJECT_DIR)/NetworkProcess/WebStorage/StorageManagerSet.messages.in 29 29 $(PROJECT_DIR)/NetworkProcess/cache/CacheStorageEngineConnection.messages.in 30 30 $(PROJECT_DIR)/NetworkProcess/mac/com.apple.WebKit.NetworkProcess.sb.in … … 84 84 $(PROJECT_DIR)/UIProcess/WebProcessPool.messages.in 85 85 $(PROJECT_DIR)/UIProcess/WebProcessProxy.messages.in 86 $(PROJECT_DIR)/UIProcess/WebStorage/StorageManager.messages.in87 86 $(PROJECT_DIR)/UIProcess/ios/EditableImageController.messages.in 88 87 $(PROJECT_DIR)/UIProcess/ios/SmartMagnificationController.messages.in -
trunk/Source/WebKit/DerivedSources-output.xcfilelist
r246388 r248734 89 89 $(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit2/StorageAreaMapMessageReceiver.cpp 90 90 $(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit2/StorageAreaMapMessages.h 91 $(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit2/StorageManager MessageReceiver.cpp92 $(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit2/StorageManager Messages.h91 $(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit2/StorageManagerSetMessageReceiver.cpp 92 $(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit2/StorageManagerSetMessages.h 93 93 $(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit2/TextCheckingControllerProxyMessageReceiver.cpp 94 94 $(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit2/TextCheckingControllerProxyMessages.h -
trunk/Source/WebKit/DerivedSources.make
r246388 r248734 137 137 SmartMagnificationController \ 138 138 StorageAreaMap \ 139 StorageManager \139 StorageManagerSet \ 140 140 TextCheckingControllerProxy \ 141 141 UserMediaCaptureManager \ -
trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp
r248713 r248734 50 50 #include "PreconnectTask.h" 51 51 #include "ServiceWorkerFetchTaskMessages.h" 52 #include "StorageManager.h"53 52 #include "WebCoreArgumentCoders.h" 54 53 #include "WebErrors.h" … … 300 299 stopAllNetworkActivityTracking(); 301 300 302 m_networkProcess-> webProcessWasDisconnected(connection);301 m_networkProcess->connectionToWebProcessClosed(connection); 303 302 304 303 m_networkProcess->removeNetworkConnectionToWebProcess(*this); … … 916 915 #endif 917 916 918 void NetworkConnectionToWebProcess::webPageWasAdded(PAL::SessionID sessionID, PageIdentifier pageID, WebCore::PageIdentifier oldPageID)919 {920 m_networkProcess->webPageWasAdded(m_connection.get(), sessionID, pageID, oldPageID);921 }922 923 void NetworkConnectionToWebProcess::webPageWasRemoved(PAL::SessionID sessionID, PageIdentifier pageID)924 {925 m_networkProcess->webPageWasRemoved(m_connection.get(), sessionID, pageID);926 }927 928 void NetworkConnectionToWebProcess::webProcessSessionChanged(PAL::SessionID newSessionID, const Vector<PageIdentifier>& pages)929 {930 m_networkProcess->webProcessSessionChanged(m_connection.get(), newSessionID, pages);931 }932 933 917 } // namespace WebKit -
trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h
r248713 r248734 142 142 Vector<RefPtr<WebCore::BlobDataFileReference>> resolveBlobReferences(const NetworkResourceLoadParameters&); 143 143 144 void webPageWasAdded(PAL::SessionID, WebCore::PageIdentifier, WebCore::PageIdentifier oldPageID);145 void webPageWasRemoved(PAL::SessionID, WebCore::PageIdentifier);146 void webProcessSessionChanged(PAL::SessionID newSessionID, const Vector<WebCore::PageIdentifier>& pages);147 148 144 void removeSocketChannel(uint64_t identifier); 149 145 -
trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in
r248713 r248734 87 87 EstablishSWServerConnection(PAL::SessionID sessionID) -> (WebCore::SWServerConnectionIdentifier serverConnectionIdentifier) Synchronous 88 88 #endif 89 90 WebPageWasAdded(PAL::SessionID sessionID, WebCore::PageIdentifier pageID, WebCore::PageIdentifier oldPageID)91 WebPageWasRemoved(PAL::SessionID sessionID, WebCore::PageIdentifier pageID)92 WebProcessSessionChanged(PAL::SessionID newSessionID, Vector<WebCore::PageIdentifier> pages)93 89 } -
trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp
r248699 r248734 54 54 #include "StatisticsData.h" 55 55 #include "StorageAccessStatus.h" 56 #include "StorageManager.h" 57 #include "StorageManagerMessages.h" 56 #include "StorageManagerSet.h" 58 57 #include "WebCookieManager.h" 59 58 #include "WebPageProxyMessages.h" … … 134 133 NetworkProcess::NetworkProcess(AuxiliaryProcessInitializationParameters&& parameters) 135 134 : m_downloadManager(*this) 135 , m_storageManagerSet(StorageManagerSet::create()) 136 136 #if ENABLE(CONTENT_EXTENSIONS) 137 137 , m_networkContentRuleListManager(*this) … … 337 337 initializeStorageQuota(parameters.defaultDataStoreParameters); 338 338 339 m_storageManagerSet->add(sessionID, parameters.defaultDataStoreParameters.localStorageDirectory, parameters.defaultDataStoreParameters.localStorageDirectoryExtensionHandle); 340 339 341 auto* defaultSession = networkSession(PAL::SessionID::defaultSessionID()); 340 342 auto* defaultStorageSession = defaultSession->networkStorageSession(); … … 448 450 UNUSED_PARAM(registrableDomain); 449 451 #endif 452 453 m_storageManagerSet->addConnection(m_webProcessConnections.last()->connection()); 450 454 } 451 455 … … 469 473 addServiceWorkerSession(parameters.networkSessionParameters.sessionID, parameters.serviceWorkerRegistrationDirectory, parameters.serviceWorkerRegistrationDirectoryExtensionHandle); 470 474 #endif 475 476 m_storageManagerSet->add(parameters.networkSessionParameters.sessionID, parameters.localStorageDirectory, parameters.localStorageDirectoryExtensionHandle); 471 477 472 478 initializeStorageQuota(parameters); … … 610 616 #endif 611 617 618 m_storageManagerSet->remove(sessionID); 619 612 620 m_storageQuotaManagers.remove(sessionID); 613 621 } … … 1051 1059 void NetworkProcess::hasLocalStorage(PAL::SessionID sessionID, const RegistrableDomain& domain, CompletionHandler<void(bool)>&& completionHandler) 1052 1060 { 1053 if ( auto* session = networkSession(sessionID)) {1054 session->storageManager().getLocalStorageOrigins([domain, completionHandler = WTFMove(completionHandler)](auto&& origins) mutable {1061 if (m_storageManagerSet->contains(sessionID)) { 1062 m_storageManagerSet->getLocalStorageOrigins(sessionID, [domain, completionHandler = WTFMove(completionHandler)](auto&& origins) mutable { 1055 1063 completionHandler(WTF::anyOf(origins, [&domain](auto& origin) { 1056 1064 return domain.matches(origin); … … 1341 1349 } 1342 1350 1343 auto* session = networkSession(sessionID); 1344 if (websiteDataTypes.contains(WebsiteDataType::SessionStorage) && session) { 1345 session->storageManager().getSessionStorageOrigins([callbackAggregator = callbackAggregator.copyRef()](auto&& origins) { 1351 if (websiteDataTypes.contains(WebsiteDataType::SessionStorage) && m_storageManagerSet->contains(sessionID)) { 1352 m_storageManagerSet->getSessionStorageOrigins(sessionID, [callbackAggregator = callbackAggregator.copyRef()](auto&& origins) { 1346 1353 while (!origins.isEmpty()) 1347 1354 callbackAggregator->m_websiteData.entries.append(WebsiteData::Entry { origins.takeAny(), WebsiteDataType::SessionStorage, 0 }); … … 1349 1356 } 1350 1357 1351 if (websiteDataTypes.contains(WebsiteDataType::LocalStorage) && session) {1352 session->storageManager().getLocalStorageOrigins([callbackAggregator = callbackAggregator.copyRef()](auto&& origins) {1358 if (websiteDataTypes.contains(WebsiteDataType::LocalStorage) && m_storageManagerSet->contains(sessionID)) { 1359 m_storageManagerSet->getLocalStorageOrigins(sessionID, [callbackAggregator = callbackAggregator.copyRef()](auto&& origins) { 1353 1360 while (!origins.isEmpty()) 1354 1361 callbackAggregator->m_websiteData.entries.append(WebsiteData::Entry { origins.takeAny(), WebsiteDataType::LocalStorage, 0 }); … … 1425 1432 CacheStorage::Engine::clearAllCaches(*this, sessionID, [clearTasksHandler = clearTasksHandler.copyRef()] { }); 1426 1433 1427 auto* session = networkSession(sessionID); 1428 if (websiteDataTypes.contains(WebsiteDataType::SessionStorage) && session) 1429 session->storageManager().deleteSessionStorageOrigins([clearTasksHandler = clearTasksHandler.copyRef()] { }); 1430 1431 if (websiteDataTypes.contains(WebsiteDataType::LocalStorage) && session) 1432 session->storageManager().deleteLocalStorageOriginsModifiedSince(modifiedSince, [clearTasksHandler = clearTasksHandler.copyRef()] { }); 1434 if (websiteDataTypes.contains(WebsiteDataType::SessionStorage) && m_storageManagerSet->contains(sessionID)) 1435 m_storageManagerSet->deleteSessionStorage(sessionID, [clearTasksHandler = clearTasksHandler.copyRef()] { }); 1436 1437 if (websiteDataTypes.contains(WebsiteDataType::LocalStorage) && m_storageManagerSet->contains(sessionID)) 1438 m_storageManagerSet->deleteLocalStorageModifiedSince(sessionID, modifiedSince, [clearTasksHandler = clearTasksHandler.copyRef()] { }); 1433 1439 1434 1440 #if ENABLE(INDEXED_DATABASE) … … 1525 1531 } 1526 1532 1527 auto* session = networkSession(sessionID); 1528 if (websiteDataTypes.contains(WebsiteDataType::SessionStorage) && session) 1529 session->storageManager().deleteSessionStorageEntriesForOrigins(originDatas, [clearTasksHandler = clearTasksHandler.copyRef()] { }); 1530 1531 if (websiteDataTypes.contains(WebsiteDataType::LocalStorage) && session) 1532 session->storageManager().deleteLocalStorageEntriesForOrigins(originDatas, [clearTasksHandler = clearTasksHandler.copyRef()] { }); 1533 if (websiteDataTypes.contains(WebsiteDataType::SessionStorage) && m_storageManagerSet->contains(sessionID)) 1534 m_storageManagerSet->deleteSessionStorageForOrigins(sessionID, originDatas, [clearTasksHandler = clearTasksHandler.copyRef()] { }); 1535 1536 if (websiteDataTypes.contains(WebsiteDataType::LocalStorage) && m_storageManagerSet->contains(sessionID)) 1537 m_storageManagerSet->deleteLocalStorageForOrigins(sessionID, originDatas, [clearTasksHandler = clearTasksHandler.copyRef()] { }); 1533 1538 1534 1539 #if ENABLE(INDEXED_DATABASE) … … 1727 1732 } 1728 1733 1729 auto* session = networkSession(sessionID); 1730 if (session) { 1731 auto& storageManager = session->storageManager(); 1734 if (m_storageManagerSet->contains(sessionID)) { 1732 1735 if (websiteDataTypes.contains(WebsiteDataType::SessionStorage)) { 1733 storageManager.getSessionStorageOrigins([storageManager = makeRefPtr(storageManager), callbackAggregator = callbackAggregator.copyRef(), domainsToDeleteAllButCookiesFor](auto&& origins) {1736 m_storageManagerSet->getSessionStorageOrigins(sessionID, [protectedThis = makeRef(*this), this, sessionID, callbackAggregator = callbackAggregator.copyRef(), domainsToDeleteAllButCookiesFor](auto&& origins) { 1734 1737 auto originsToDelete = filterForRegistrableDomains(origins, domainsToDeleteAllButCookiesFor, callbackAggregator->m_domains); 1735 storageManager->deleteSessionStorageEntriesForOrigins(originsToDelete, [callbackAggregator = callbackAggregator.copyRef()] { });1738 m_storageManagerSet->deleteSessionStorageForOrigins(sessionID, originsToDelete, [callbackAggregator = callbackAggregator.copyRef()] { }); 1736 1739 }); 1737 1740 } 1738 1741 1739 1742 if (websiteDataTypes.contains(WebsiteDataType::LocalStorage)) { 1740 storageManager.getLocalStorageOrigins([storageManager = makeRefPtr(storageManager), callbackAggregator = callbackAggregator.copyRef(), domainsToDeleteAllButCookiesFor](auto&& origins) {1743 m_storageManagerSet->getLocalStorageOrigins(sessionID, [protectedThis = makeRef(*this), this, sessionID, callbackAggregator = callbackAggregator.copyRef(), domainsToDeleteAllButCookiesFor](auto&& origins) { 1741 1744 auto originsToDelete = filterForRegistrableDomains(origins, domainsToDeleteAllButCookiesFor, callbackAggregator->m_domains); 1742 storageManager->deleteLocalStorageEntriesForOrigins(originsToDelete, [callbackAggregator = callbackAggregator.copyRef()] { });1745 m_storageManagerSet->deleteLocalStorageForOrigins(sessionID, originsToDelete, [callbackAggregator = callbackAggregator.copyRef()] { }); 1743 1746 }); 1744 1747 } … … 2112 2115 #endif 2113 2116 2114 forEachNetworkSession([&callbackAggregator](auto& session) { 2115 session.storageManager().suspend([callbackAggregator] { }); 2116 }); 2117 m_storageManagerSet->suspend([callbackAggregator] { }); 2117 2118 } 2118 2119 … … 2190 2191 #endif 2191 2192 2192 forEachNetworkSession([](auto& session) { 2193 session.storageManager().resume(); 2194 }); 2193 m_storageManagerSet->resume(); 2195 2194 } 2196 2195 … … 2397 2396 #endif // ENABLE(INDEXED_DATABASE) 2398 2397 2398 void NetworkProcess::syncLocalStorage(CompletionHandler<void()>&& completionHandler) 2399 { 2400 m_storageManagerSet->waitUntilSyncingLocalStorageFinished(); 2401 completionHandler(); 2402 } 2403 2404 void NetworkProcess::clearLegacyPrivateBrowsingLocalStorage() 2405 { 2406 if (m_storageManagerSet->contains(PAL::SessionID::legacyPrivateSessionID())) 2407 m_storageManagerSet->deleteLocalStorageModifiedSince(PAL::SessionID::legacyPrivateSessionID(), -WallTime::infinity(), []() { }); 2408 } 2409 2399 2410 void NetworkProcess::updateQuotaBasedOnSpaceUsageForTesting(PAL::SessionID sessionID, const ClientOrigin& origin) 2400 2411 { … … 2704 2715 } 2705 2716 2706 void NetworkProcess::webPageWasAdded(IPC::Connection& connection, PAL::SessionID sessionID, PageIdentifier pageID, PageIdentifier oldPageID)2707 {2708 if (!pageID || !oldPageID) {2709 LOG_ERROR("Cannot add page with invalid id");2710 return;2711 }2712 2713 auto* session = networkSession(sessionID);2714 if (!session) {2715 LOG_ERROR("Cannot add page to an unknown session");2716 return;2717 }2718 auto& storageManager = session->storageManager();2719 2720 auto addResult = m_sessionByConnection.add(connection.uniqueID(), sessionID);2721 ASSERT_UNUSED(addResult, addResult.iterator->value == sessionID);2722 2723 storageManager.createSessionStorageNamespace(pageID.toUInt64(), std::numeric_limits<unsigned>::max());2724 storageManager.addAllowedSessionStorageNamespaceConnection(pageID.toUInt64(), connection);2725 if (pageID != oldPageID)2726 storageManager.cloneSessionStorageNamespace(oldPageID.toUInt64(), pageID.toUInt64());2727 }2728 2729 void NetworkProcess::webPageWasRemoved(IPC::Connection& connection, PAL::SessionID sessionID, PageIdentifier pageID)2730 {2731 if (!pageID) {2732 LOG_ERROR("Cannot remove page with invalid id");2733 return;2734 }2735 2736 auto* session = networkSession(sessionID);2737 // Session can be destroyed before page gets removed.2738 if (!session)2739 return;2740 2741 auto& storageManager = session->storageManager();2742 storageManager.removeAllowedSessionStorageNamespaceConnection(pageID.toUInt64(), connection);2743 storageManager.destroySessionStorageNamespace(pageID.toUInt64());2744 }2745 2746 void NetworkProcess::webProcessWasDisconnected(IPC::Connection& connection)2747 {2748 auto sessionID = m_sessionByConnection.take(connection.uniqueID());2749 if (!sessionID.isValid())2750 return;2751 2752 if (auto* session = networkSession(sessionID))2753 session->storageManager().processDidCloseConnection(connection);2754 }2755 2756 void NetworkProcess::webProcessSessionChanged(IPC::Connection& connection, PAL::SessionID newSessionID, const Vector<PageIdentifier>& pageIDs)2757 {2758 auto connectionID = connection.uniqueID();2759 ASSERT(m_sessionByConnection.contains(connectionID));2760 if (m_sessionByConnection.get(connectionID) == newSessionID)2761 return;2762 2763 webProcessWasDisconnected(connection);2764 for (auto& pageID : pageIDs)2765 webPageWasAdded(connection, newSessionID, pageID, pageID);2766 }2767 2768 2717 void NetworkProcess::getLocalStorageOriginDetails(PAL::SessionID sessionID, CompletionHandler<void(Vector<LocalStorageDatabaseTracker::OriginDetails>&&)>&& completionHandler) 2769 2718 { 2770 auto* session = networkSession(sessionID); 2771 if (!session) { 2719 if (!m_storageManagerSet->contains(sessionID)) { 2772 2720 LOG_ERROR("Cannot get local storage information for an unknown session"); 2773 2721 return; 2774 2722 } 2775 2723 2776 auto& storageManager = session->storageManager(); 2777 storageManager.getLocalStorageOriginDetails([completionHandler = WTFMove(completionHandler)](auto&& details) mutable { 2724 m_storageManagerSet->getLocalStorageOriginDetails(sessionID, [completionHandler = WTFMove(completionHandler)](auto&& details) mutable { 2778 2725 completionHandler(WTFMove(details)); 2779 2726 }); 2780 2727 } 2781 2728 2729 void NetworkProcess::connectionToWebProcessClosed(IPC::Connection& connection) 2730 { 2731 m_storageManagerSet->removeConnection(connection); 2732 } 2733 2782 2734 } // namespace WebKit -
trunk/Source/WebKit/NetworkProcess/NetworkProcess.h
r248713 r248734 98 98 class NetworkProximityManager; 99 99 class NetworkResourceLoader; 100 class StorageManagerSet; 100 101 class WebSWServerConnection; 101 102 class WebSWServerToContextConnection; … … 270 271 bool sessionIsControlledByAutomation(PAL::SessionID) const; 271 272 272 void webPageWasAdded(IPC::Connection&, PAL::SessionID, WebCore::PageIdentifier, WebCore::PageIdentifier); 273 void webPageWasRemoved(IPC::Connection&, PAL::SessionID, WebCore::PageIdentifier); 274 void webProcessWasDisconnected(IPC::Connection&); 275 void webProcessSessionChanged(IPC::Connection&, PAL::SessionID, const Vector<WebCore::PageIdentifier>&); 273 void connectionToWebProcessClosed(IPC::Connection&); 276 274 void getLocalStorageOriginDetails(PAL::SessionID, CompletionHandler<void(Vector<LocalStorageDatabaseTracker::OriginDetails>&&)>&&); 277 275 … … 286 284 void setIDBPerOriginQuota(uint64_t); 287 285 #endif 286 287 void syncLocalStorage(CompletionHandler<void()>&&); 288 void clearLegacyPrivateBrowsingLocalStorage(); 289 288 290 void updateQuotaBasedOnSpaceUsageForTesting(PAL::SessionID, const WebCore::ClientOrigin&); 289 291 … … 500 502 mutable std::unique_ptr<WebCore::NetworkStorageSession> m_defaultNetworkStorageSession; 501 503 504 RefPtr<StorageManagerSet> m_storageManagerSet; 505 502 506 #if PLATFORM(COCOA) 503 507 void platformInitializeNetworkProcessCocoa(const NetworkProcessCreationParameters&); -
trunk/Source/WebKit/NetworkProcess/NetworkProcess.messages.in
r248699 r248734 164 164 SetIDBPerOriginQuota(uint64_t quota) 165 165 #endif 166 167 SyncLocalStorage() -> () Synchronous 168 ClearLegacyPrivateBrowsingLocalStorage() 169 166 170 UpdateQuotaBasedOnSpaceUsageForTesting(PAL::SessionID sessionID, struct WebCore::ClientOrigin origin) 167 171 -
trunk/Source/WebKit/NetworkProcess/NetworkSession.cpp
r248144 r248734 34 34 #include "NetworkResourceLoader.h" 35 35 #include "PingLoad.h" 36 #include "StorageManager.h"37 36 #include "WebPageProxy.h" 38 37 #include "WebPageProxyMessages.h" … … 86 85 #endif 87 86 , m_adClickAttribution(makeUniqueRef<AdClickAttributionManager>(parameters.sessionID)) 88 , m_storageManager(StorageManager::create(String(parameters.localStorageDirectory)))89 87 { 90 88 if (!m_sessionID.isEphemeral()) { … … 100 98 } 101 99 102 SandboxExtension::consumePermanently(parameters.localStorageDirectoryExtensionHandle);103 100 m_adClickAttribution->setPingLoadFunction([this, weakThis = makeWeakPtr(this)](NetworkResourceLoadParameters&& loadParameters, CompletionHandler<void(const WebCore::ResourceError&, const WebCore::ResourceResponse&)>&& completionHandler) { 104 101 if (!weakThis) … … 114 111 destroyResourceLoadStatistics(); 115 112 #endif 116 117 m_storageManager->resume();118 m_storageManager->waitUntilTasksFinished();119 113 } 120 114 -
trunk/Source/WebKit/NetworkProcess/NetworkSession.h
r248640 r248734 53 53 class NetworkProcess; 54 54 class NetworkResourceLoader; 55 class StorageManager;56 55 class NetworkSocketChannel; 57 56 class WebResourceLoadStatisticsStore; … … 81 80 void registerNetworkDataTask(NetworkDataTask& task) { m_dataTaskSet.add(&task); } 82 81 void unregisterNetworkDataTask(NetworkDataTask& task) { m_dataTaskSet.remove(&task); } 83 84 StorageManager& storageManager() { return m_storageManager.get(); }85 82 86 83 #if ENABLE(RESOURCE_LOAD_STATISTICS) … … 146 143 PrefetchCache m_prefetchCache; 147 144 148 Ref<StorageManager> m_storageManager;149 145 #if !ASSERT_DISABLED 150 146 bool m_isInvalidated { false }; -
trunk/Source/WebKit/NetworkProcess/NetworkSessionCreationParameters.cpp
r248668 r248734 51 51 , { }, { } 52 52 #endif 53 , { }, { }, false, false, { }, { }, { }, { }, { }, { }, { }, { } , { }, { }53 , { }, { }, false, false, { }, { }, { }, { }, { }, { }, { }, { } 54 54 }; 55 55 } … … 87 87 encoder << enableResourceLoadStatisticsNSURLSessionSwitching; 88 88 89 encoder << localStorageDirectory << localStorageDirectoryExtensionHandle;90 89 encoder << networkCacheDirectory << networkCacheDirectoryExtensionHandle; 91 90 … … 214 213 decoder >> enableResourceLoadStatisticsNSURLSessionSwitching; 215 214 if (!enableResourceLoadStatisticsNSURLSessionSwitching) 216 return WTF::nullopt;217 218 Optional<String> localStorageDirectory;219 decoder >> localStorageDirectory;220 if (!localStorageDirectory)221 return WTF::nullopt;222 223 Optional<SandboxExtension::Handle> localStorageDirectoryExtensionHandle;224 decoder >> localStorageDirectoryExtensionHandle;225 if (!localStorageDirectoryExtensionHandle)226 215 return WTF::nullopt; 227 216 … … 278 267 , WTFMove(*allLoadsBlockedByDeviceManagementRestrictionsForTesting) 279 268 , WTFMove(*resourceLoadStatisticsManualPrevalentResource) 280 , WTFMove(*localStorageDirectory)281 , WTFMove(*localStorageDirectoryExtensionHandle)282 269 , WTFMove(*networkCacheDirectory) 283 270 , WTFMove(*networkCacheDirectoryExtensionHandle) -
trunk/Source/WebKit/NetworkProcess/NetworkSessionCreationParameters.h
r248640 r248734 93 93 WebCore::RegistrableDomain resourceLoadStatisticsManualPrevalentResource { }; 94 94 95 String localStorageDirectory;96 SandboxExtension::Handle localStorageDirectoryExtensionHandle;97 95 String networkCacheDirectory; 98 96 SandboxExtension::Handle networkCacheDirectoryExtensionHandle; -
trunk/Source/WebKit/NetworkProcess/WebStorage/LocalStorageDatabase.cpp
r247486 r248734 260 260 return; 261 261 262 ASSERT(m_didScheduleDatabaseUpdate);263 262 m_didScheduleDatabaseUpdate = false; 264 263 -
trunk/Source/WebKit/NetworkProcess/WebStorage/LocalStorageDatabase.h
r245540 r248734 56 56 void clear(); 57 57 58 void updateDatabase(); 59 58 60 // Will block until all pending changes have been written to disk. 59 61 void close(); … … 74 76 75 77 void scheduleDatabaseUpdate(); 76 void updateDatabase();77 78 void updateDatabaseWithChangedItems(const HashMap<String, String>&); 78 79 -
trunk/Source/WebKit/NetworkProcess/WebStorage/LocalStorageDatabaseTracker.cpp
r247250 r248734 40 40 using namespace WebCore; 41 41 42 Ref<LocalStorageDatabaseTracker> LocalStorageDatabaseTracker::create( Ref<WorkQueue>&& queue,String&& localStorageDirectory)42 Ref<LocalStorageDatabaseTracker> LocalStorageDatabaseTracker::create(String&& localStorageDirectory) 43 43 { 44 return adoptRef(*new LocalStorageDatabaseTracker(WTFMove( queue), WTFMove(localStorageDirectory)));44 return adoptRef(*new LocalStorageDatabaseTracker(WTFMove(localStorageDirectory))); 45 45 } 46 46 47 LocalStorageDatabaseTracker::LocalStorageDatabaseTracker(Ref<WorkQueue>&& queue, String&& localStorageDirectory) 48 : m_queue(WTFMove(queue)) 49 , m_localStorageDirectory(WTFMove(localStorageDirectory)) 47 LocalStorageDatabaseTracker::LocalStorageDatabaseTracker(String&& localStorageDirectory) 48 : m_localStorageDirectory(WTFMove(localStorageDirectory)) 50 49 { 51 ASSERT( RunLoop::isMain());50 ASSERT(!RunLoop::isMain()); 52 51 53 // Make sure the encoding is initialized before we start dispatching things to the queue. 54 UTF8Encoding(); 55 56 m_queue->dispatch([protectedThis = makeRef(*this)]() mutable { 57 // Delete legacy storageTracker database file. 58 SQLiteFileSystem::deleteDatabaseFile(protectedThis->databasePath("StorageTracker.db")); 59 }); 52 SQLiteFileSystem::deleteDatabaseFile(databasePath("StorageTracker.db")); 60 53 } 61 54 … … 67 60 LocalStorageDatabaseTracker::~LocalStorageDatabaseTracker() 68 61 { 69 ASSERT( RunLoop::isMain());62 ASSERT(!RunLoop::isMain()); 70 63 } 71 64 -
trunk/Source/WebKit/NetworkProcess/WebStorage/LocalStorageDatabaseTracker.h
r247250 r248734 36 36 namespace WebKit { 37 37 38 class LocalStorageDatabaseTracker : public ThreadSafeRefCounted<LocalStorageDatabaseTracker , WTF::DestructionThread::MainRunLoop> {38 class LocalStorageDatabaseTracker : public ThreadSafeRefCounted<LocalStorageDatabaseTracker> { 39 39 public: 40 static Ref<LocalStorageDatabaseTracker> create( Ref<WorkQueue>&&,String&& localStorageDirectory);40 static Ref<LocalStorageDatabaseTracker> create(String&& localStorageDirectory); 41 41 ~LocalStorageDatabaseTracker(); 42 42 … … 65 65 66 66 private: 67 LocalStorageDatabaseTracker( Ref<WorkQueue>&&,String&& localStorageDirectory);67 LocalStorageDatabaseTracker(String&& localStorageDirectory); 68 68 69 69 String databasePath(const String& filename) const; … … 74 74 SkipIfNonExistent 75 75 }; 76 77 Ref<WorkQueue> m_queue;78 76 79 77 // It is not safe to use this member from a background thread, call localStorageDirectory() instead. -
trunk/Source/WebKit/NetworkProcess/WebStorage/LocalStorageNamespace.cpp
r248452 r248734 48 48 } 49 49 50 auto LocalStorageNamespace::getOrCreateStorageArea(SecurityOriginData&& securityOrigin, IsEphemeral isEphemeral) -> Ref<StorageArea> 50 Ref<StorageArea> LocalStorageNamespace::getOrCreateStorageArea(SecurityOriginData&& securityOrigin, IsEphemeral isEphemeral) 51 51 { 52 52 ASSERT(!RunLoop::isMain()); … … 82 82 } 83 83 84 void LocalStorageNamespace::cloneTo(LocalStorageNamespace& newLocalStorageNamespace)85 {86 ASSERT(!RunLoop::isMain());87 for (auto& pair : m_storageAreaMap)88 newLocalStorageNamespace.m_storageAreaMap.add(pair.key, pair.value->clone());89 }90 91 84 } // namespace WebKit -
trunk/Source/WebKit/NetworkProcess/WebStorage/LocalStorageNamespace.h
r248422 r248734 55 55 56 56 Vector<WebCore::SecurityOriginData> ephemeralOrigins() const; 57 void cloneTo(LocalStorageNamespace& newLocalStorageNamespace);58 57 59 58 private: -
trunk/Source/WebKit/NetworkProcess/WebStorage/SessionStorageNamespace.cpp
r248452 r248734 44 44 } 45 45 46 void SessionStorageNamespace::addAllowedConnection(IPC::Connection::UniqueID allowedConnection) 47 { 48 ASSERT(!RunLoop::isMain()); 49 m_allowedConnections.add(allowedConnection); 50 } 51 52 53 void SessionStorageNamespace::removeAllowedConnection(IPC::Connection::UniqueID allowedConnection) 54 { 55 ASSERT(!RunLoop::isMain()); 56 ASSERT(m_allowedConnections.contains(allowedConnection)); 57 m_allowedConnections.remove(allowedConnection); 58 } 59 auto SessionStorageNamespace::getOrCreateStorageArea(SecurityOriginData&& securityOrigin) -> Ref<StorageArea> 46 Ref<StorageArea> SessionStorageNamespace::getOrCreateStorageArea(SecurityOriginData&& securityOrigin) 60 47 { 61 48 ASSERT(!RunLoop::isMain()); -
trunk/Source/WebKit/NetworkProcess/WebStorage/SessionStorageNamespace.h
r248422 r248734 46 46 bool isEmpty() const { return m_storageAreaMap.isEmpty(); } 47 47 48 const HashSet<IPC::Connection::UniqueID>& allowedConnections() const { return m_allowedConnections; }49 void addAllowedConnection(IPC::Connection::UniqueID);50 void removeAllowedConnection(IPC::Connection::UniqueID);51 52 48 Ref<StorageArea> getOrCreateStorageArea(WebCore::SecurityOriginData&&); 53 49 … … 62 58 explicit SessionStorageNamespace(unsigned quotaInBytes); 63 59 64 HashSet<IPC::Connection::UniqueID> m_allowedConnections;65 60 unsigned m_quotaInBytes { 0 }; 66 61 -
trunk/Source/WebKit/NetworkProcess/WebStorage/StorageArea.cpp
r248542 r248734 37 37 using namespace WebCore; 38 38 39 static uint64_t generateStorageAreaIdentifier() 40 { 41 static uint64_t identifier; 42 return ++identifier; 43 } 44 39 45 StorageArea::StorageArea(LocalStorageNamespace* localStorageNamespace, const SecurityOriginData& securityOrigin, unsigned quotaInBytes) 40 46 : m_localStorageNamespace(makeWeakPtr(localStorageNamespace)) … … 42 48 , m_quotaInBytes(quotaInBytes) 43 49 , m_storageMap(StorageMap::create(m_quotaInBytes)) 50 , m_identifier(generateStorageAreaIdentifier()) 44 51 { 45 52 ASSERT(!RunLoop::isMain()); … … 49 56 { 50 57 ASSERT(!RunLoop::isMain()); 51 ASSERT(m_eventListeners.isEmpty());52 58 53 59 if (m_localStorageDatabase) … … 55 61 } 56 62 57 void StorageArea::addListener(IPC::Connection::UniqueID connectionID, uint64_t storageMapID) 58 { 59 ASSERT(!RunLoop::isMain()); 60 ASSERT(!m_eventListeners.contains(std::make_pair(connectionID, storageMapID))); 61 m_eventListeners.add(std::make_pair(connectionID, storageMapID)); 62 } 63 64 void StorageArea::removeListener(IPC::Connection::UniqueID connectionID, uint64_t storageMapID) 65 { 66 ASSERT(!RunLoop::isMain()); 67 ASSERT(isEphemeral() || m_eventListeners.contains(std::make_pair(connectionID, storageMapID))); 68 m_eventListeners.remove(std::make_pair(connectionID, storageMapID)); 69 } 70 71 bool StorageArea::hasListener(IPC::Connection::UniqueID connectionID, uint64_t storageMapID) const 72 { 73 ASSERT(!RunLoop::isMain()); 74 return m_eventListeners.contains(std::make_pair(connectionID, storageMapID)); 63 void StorageArea::addListener(IPC::Connection::UniqueID connectionID) 64 { 65 ASSERT(!RunLoop::isMain()); 66 ASSERT(!m_eventListeners.contains(connectionID)); 67 68 if (m_eventListeners.isEmpty() && !isEphemeral()) 69 openDatabaseAndImportItemsIfNeeded(); 70 71 m_eventListeners.add(connectionID); 72 } 73 74 void StorageArea::removeListener(IPC::Connection::UniqueID connectionID) 75 { 76 ASSERT(!RunLoop::isMain()); 77 m_eventListeners.remove(connectionID); 78 } 79 80 bool StorageArea::hasListener(IPC::Connection::UniqueID connectionID) const 81 { 82 ASSERT(!RunLoop::isMain()); 83 return m_eventListeners.contains(connectionID); 75 84 } 76 85 … … 104 113 105 114 dispatchEvents(sourceConnection, sourceStorageAreaID, key, oldValue, value, urlString); 106 }107 108 void StorageArea::setItems(const HashMap<String, String>& items)109 {110 ASSERT(!RunLoop::isMain());111 // Import items from web process if items are not stored on disk.112 if (!isEphemeral())113 return;114 115 for (auto& item : items) {116 String oldValue;117 bool quotaException;118 auto newStorageMap = m_storageMap->setItem(item.key, item.value, oldValue, quotaException);119 if (newStorageMap)120 m_storageMap = WTFMove(newStorageMap);121 122 if (quotaException)123 return;124 }125 115 } 126 116 … … 179 169 180 170 for (auto it = m_eventListeners.begin(), end = m_eventListeners.end(); it != end; ++it) { 181 RunLoop::main().dispatch([connectionID = it->first, destinationStorageAreaID = it->second] {171 RunLoop::main().dispatch([connectionID = *it, destinationStorageAreaID = m_identifier] { 182 172 if (auto* connection = IPC::Connection::connection(connectionID)) 183 173 connection->send(Messages::StorageAreaMap::ClearCache(), destinationStorageAreaID); … … 193 183 194 184 ASSERT(m_localStorageNamespace->storageManager()->localStorageDatabaseTracker()); 185 ASSERT(m_queue); 195 186 // We open the database here even if we've already imported our items to ensure that the database is open if we need to write to it. 196 187 if (!m_localStorageDatabase) 197 m_localStorageDatabase = LocalStorageDatabase::create( m_localStorageNamespace->storageManager()->workQueue(), *m_localStorageNamespace->storageManager()->localStorageDatabaseTracker(), m_securityOrigin);188 m_localStorageDatabase = LocalStorageDatabase::create(*m_queue, *m_localStorageNamespace->storageManager()->localStorageDatabaseTracker(), m_securityOrigin); 198 189 199 190 if (m_didImportItemsFromDatabase) … … 208 199 ASSERT(!RunLoop::isMain()); 209 200 for (auto it = m_eventListeners.begin(), end = m_eventListeners.end(); it != end; ++it) { 210 sourceStorageAreaID = it->first == sourceConnection ? sourceStorageAreaID : 0;211 212 RunLoop::main().dispatch([connectionID = it->first, sourceStorageAreaID, destinationStorageAreaID = it->second, key = key.isolatedCopy(), oldValue = oldValue.isolatedCopy(), newValue = newValue.isolatedCopy(), urlString = urlString.isolatedCopy()] {201 sourceStorageAreaID = *it == sourceConnection ? sourceStorageAreaID : 0; 202 203 RunLoop::main().dispatch([connectionID = *it, sourceStorageAreaID, destinationStorageAreaID = m_identifier, key = key.isolatedCopy(), oldValue = oldValue.isolatedCopy(), newValue = newValue.isolatedCopy(), urlString = urlString.isolatedCopy()] { 213 204 if (auto* connection = IPC::Connection::connection(connectionID)) 214 205 connection->send(Messages::StorageAreaMap::DispatchStorageEvent(sourceStorageAreaID, key, oldValue, newValue, urlString), destinationStorageAreaID); … … 217 208 } 218 209 210 void StorageArea::syncToDatabase() 211 { 212 if (!m_localStorageDatabase) 213 return; 214 215 m_localStorageDatabase->updateDatabase(); 216 } 217 219 218 } // namespace WebKit -
trunk/Source/WebKit/NetworkProcess/WebStorage/StorageArea.h
r248422 r248734 50 50 51 51 const WebCore::SecurityOriginData& securityOrigin() const { return m_securityOrigin; } 52 uint64_t identifier() { return m_identifier; } 52 53 53 void addListener(IPC::Connection::UniqueID , uint64_t storageMapID);54 void removeListener(IPC::Connection::UniqueID , uint64_t storageMapID);55 bool hasListener(IPC::Connection::UniqueID , uint64_t storageMapID) const;54 void addListener(IPC::Connection::UniqueID); 55 void removeListener(IPC::Connection::UniqueID); 56 bool hasListener(IPC::Connection::UniqueID connectionID) const; 56 57 57 58 Ref<StorageArea> clone() const; 58 59 59 60 void setItem(IPC::Connection::UniqueID sourceConnection, uint64_t sourceStorageAreaID, const String& key, const String& value, const String& urlString, bool& quotaException); 60 void setItems(const HashMap<String, String>&);61 61 void removeItem(IPC::Connection::UniqueID sourceConnection, uint64_t sourceStorageAreaID, const String& key, const String& urlString); 62 62 void clear(IPC::Connection::UniqueID sourceConnection, uint64_t sourceStorageAreaID, const String& urlString); … … 68 68 69 69 void openDatabaseAndImportItemsIfNeeded() const; 70 71 void setWorkQueue(RefPtr<WorkQueue>&& queue) { m_queue = WTFMove(queue); } 72 73 void syncToDatabase(); 70 74 71 75 private: … … 83 87 84 88 RefPtr<WebCore::StorageMap> m_storageMap; 85 HashSet<std::pair<IPC::Connection::UniqueID, uint64_t>> m_eventListeners; 89 HashSet<IPC::Connection::UniqueID> m_eventListeners; 90 91 uint64_t m_identifier; 92 RefPtr<WorkQueue> m_queue; 86 93 }; 87 94 -
trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManager.cpp
r248633 r248734 33 33 #include "StorageArea.h" 34 34 #include "StorageAreaMapMessages.h" 35 #include "StorageManagerMessages.h"36 35 #include "TransientLocalStorageNamespace.h" 37 36 #include "WebProcessProxy.h" … … 42 41 #include <memory> 43 42 #include <wtf/WorkQueue.h> 44 #include <wtf/threads/BinarySemaphore.h>45 43 46 44 namespace WebKit { … … 51 49 52 50 StorageManager::StorageManager(String&& localStorageDirectory) 53 : m_queue(WorkQueue::create("com.apple.WebKit.StorageManager")) 54 { 55 ASSERT(RunLoop::isMain()); 56 57 // Make sure the encoding is initialized before we start dispatching things to the queue. 58 UTF8Encoding(); 51 { 52 ASSERT(!RunLoop::isMain()); 53 59 54 if (!localStorageDirectory.isNull()) 60 m_localStorageDatabaseTracker = LocalStorageDatabaseTracker::create( m_queue.copyRef(),WTFMove(localStorageDirectory));55 m_localStorageDatabaseTracker = LocalStorageDatabaseTracker::create(WTFMove(localStorageDirectory)); 61 56 } 62 57 63 58 StorageManager::~StorageManager() 64 59 { 65 ASSERT( RunLoop::isMain());60 ASSERT(!RunLoop::isMain()); 66 61 } 67 62 68 63 void StorageManager::createSessionStorageNamespace(uint64_t storageNamespaceID, unsigned quotaInBytes) 69 64 { 70 ASSERT(RunLoop::isMain()); 71 m_queue->dispatch([this, protectedThis = makeRef(*this), storageNamespaceID, quotaInBytes]() mutable { 72 m_sessionStorageNamespaces.ensure(storageNamespaceID, [quotaInBytes] { 73 return SessionStorageNamespace::create(quotaInBytes); 74 }); 65 ASSERT(!RunLoop::isMain()); 66 67 m_sessionStorageNamespaces.ensure(storageNamespaceID, [quotaInBytes] { 68 return SessionStorageNamespace::create(quotaInBytes); 75 69 }); 76 70 } … … 78 72 void StorageManager::destroySessionStorageNamespace(uint64_t storageNamespaceID) 79 73 { 80 ASSERT(RunLoop::isMain()); 81 m_queue->dispatch([this, protectedThis = makeRef(*this), storageNamespaceID] { 82 ASSERT(m_sessionStorageNamespaces.contains(storageNamespaceID)); 83 if (auto* sessionStorageNamespace = m_sessionStorageNamespaces.get(storageNamespaceID)) { 84 if (sessionStorageNamespace->allowedConnections().isEmpty()) 85 m_sessionStorageNamespaces.remove(storageNamespaceID); 86 } 87 }); 88 } 89 90 void StorageManager::addAllowedSessionStorageNamespaceConnection(uint64_t storageNamespaceID, IPC::Connection& allowedConnection) 91 { 92 ASSERT(RunLoop::isMain()); 93 auto allowedConnectionID = allowedConnection.uniqueID(); 94 auto addResult = m_connections.add(allowedConnectionID); 95 if (addResult.isNewEntry) 96 allowedConnection.addWorkQueueMessageReceiver(Messages::StorageManager::messageReceiverName(), m_queue.get(), this); 97 98 m_queue->dispatch([this, protectedThis = makeRef(*this), allowedConnectionID, storageNamespaceID]() mutable { 99 ASSERT(m_sessionStorageNamespaces.contains(storageNamespaceID)); 100 101 m_sessionStorageNamespaces.get(storageNamespaceID)->addAllowedConnection(allowedConnectionID); 102 }); 103 } 104 105 void StorageManager::removeAllowedSessionStorageNamespaceConnection(uint64_t storageNamespaceID, IPC::Connection& allowedConnection) 106 { 107 ASSERT(RunLoop::isMain()); 108 auto allowedConnectionID = allowedConnection.uniqueID(); 109 m_queue->dispatch([this, protectedThis = makeRef(*this), allowedConnectionID, storageNamespaceID]() mutable { 110 ASSERT(m_sessionStorageNamespaces.contains(storageNamespaceID)); 111 if (auto* sessionStorageNamespace = m_sessionStorageNamespaces.get(storageNamespaceID)) 112 sessionStorageNamespace->removeAllowedConnection(allowedConnectionID); 113 }); 74 ASSERT(!RunLoop::isMain()); 75 76 ASSERT(m_sessionStorageNamespaces.contains(storageNamespaceID)); 77 if (auto* sessionStorageNamespace = m_sessionStorageNamespaces.get(storageNamespaceID)) 78 m_sessionStorageNamespaces.remove(storageNamespaceID); 114 79 } 115 80 116 81 void StorageManager::cloneSessionStorageNamespace(uint64_t storageNamespaceID, uint64_t newStorageNamespaceID) 117 82 { 118 ASSERT(RunLoop::isMain()); 119 m_queue->dispatch([this, protectedThis = makeRef(*this), storageNamespaceID, newStorageNamespaceID] { 120 SessionStorageNamespace* sessionStorageNamespace = m_sessionStorageNamespaces.get(storageNamespaceID); 121 if (!sessionStorageNamespace) { 122 // FIXME: We can get into this situation if someone closes the originating page from within a 123 // createNewPage callback. We bail for now, but we should really find a way to keep the session storage alive 124 // so we we'll clone the session storage correctly. 125 return; 126 } 127 128 SessionStorageNamespace* newSessionStorageNamespace = m_sessionStorageNamespaces.get(newStorageNamespaceID); 129 ASSERT(newSessionStorageNamespace); 130 131 sessionStorageNamespace->cloneTo(*newSessionStorageNamespace); 132 133 if (!m_localStorageDatabaseTracker) { 134 if (auto* localStorageNamespace = m_localStorageNamespaces.get(storageNamespaceID)) { 135 LocalStorageNamespace* newlocalStorageNamespace = getOrCreateLocalStorageNamespace(newStorageNamespaceID); 136 localStorageNamespace->cloneTo(*newlocalStorageNamespace); 137 } 138 } 139 }); 140 } 141 142 void StorageManager::processDidCloseConnection(IPC::Connection& connection) 143 { 144 ASSERT(RunLoop::isMain()); 145 if (m_connections.remove(connection.uniqueID())) 146 connection.removeWorkQueueMessageReceiver(Messages::StorageManager::messageReceiverName()); 147 148 m_queue->dispatch([this, protectedThis = makeRef(*this), connectionID = connection.uniqueID()]() mutable { 149 Vector<std::pair<IPC::Connection::UniqueID, uint64_t>> connectionAndStorageMapIDPairsToRemove; 150 for (auto& storageArea : m_storageAreasByConnection) { 151 if (storageArea.key.first != connectionID) 152 continue; 153 154 storageArea.value->removeListener(storageArea.key.first, storageArea.key.second); 155 connectionAndStorageMapIDPairsToRemove.append(storageArea.key); 156 } 157 158 for (auto& pair : connectionAndStorageMapIDPairsToRemove) 159 m_storageAreasByConnection.remove(pair); 160 161 Vector<uint64_t> sessionStorageNameSpaceIDsToRemove; 162 for (auto& sessionStorageNamespace : m_sessionStorageNamespaces) { 163 if (sessionStorageNamespace.value->allowedConnections().contains(connectionID)) 164 sessionStorageNamespace.value->removeAllowedConnection(connectionID); 165 166 if (sessionStorageNamespace.value->allowedConnections().isEmpty()) 167 sessionStorageNameSpaceIDsToRemove.append(sessionStorageNamespace.key); 168 } 169 170 for (auto id : sessionStorageNameSpaceIDsToRemove) 171 m_sessionStorageNamespaces.remove(id); 172 }); 83 ASSERT(!RunLoop::isMain()); 84 85 SessionStorageNamespace* sessionStorageNamespace = m_sessionStorageNamespaces.get(storageNamespaceID); 86 if (!sessionStorageNamespace) 87 return; 88 89 SessionStorageNamespace* newSessionStorageNamespace = getOrCreateSessionStorageNamespace(newStorageNamespaceID); 90 ASSERT(newSessionStorageNamespace); 91 92 sessionStorageNamespace->cloneTo(*newSessionStorageNamespace); 173 93 } 174 94 175 95 void StorageManager::getSessionStorageOrigins(Function<void(HashSet<WebCore::SecurityOriginData>&&)>&& completionHandler) 176 96 { 177 ASSERT(RunLoop::isMain()); 178 m_queue->dispatch([this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)]() mutable { 179 HashSet<SecurityOriginData> origins; 180 181 for (const auto& sessionStorageNamespace : m_sessionStorageNamespaces.values()) { 182 for (auto& origin : sessionStorageNamespace->origins()) 183 origins.add(crossThreadCopy(origin)); 184 } 185 186 RunLoop::main().dispatch([origins = WTFMove(origins), completionHandler = WTFMove(completionHandler)]() mutable { 187 completionHandler(WTFMove(origins)); 188 }); 97 ASSERT(!RunLoop::isMain()); 98 99 HashSet<SecurityOriginData> origins; 100 for (const auto& sessionStorageNamespace : m_sessionStorageNamespaces.values()) { 101 for (auto& origin : sessionStorageNamespace->origins()) 102 origins.add(crossThreadCopy(origin)); 103 } 104 105 RunLoop::main().dispatch([origins = WTFMove(origins), completionHandler = WTFMove(completionHandler)]() mutable { 106 completionHandler(WTFMove(origins)); 189 107 }); 190 108 } … … 192 110 void StorageManager::deleteSessionStorageOrigins(Function<void()>&& completionHandler) 193 111 { 194 ASSERT(RunLoop::isMain()); 195 m_queue->dispatch([this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)]() mutable { 112 ASSERT(!RunLoop::isMain()); 113 114 for (auto& sessionStorageNamespace : m_sessionStorageNamespaces.values()) 115 sessionStorageNamespace->clearAllStorageAreas(); 116 117 RunLoop::main().dispatch(WTFMove(completionHandler)); 118 } 119 120 void StorageManager::deleteSessionStorageEntriesForOrigins(const Vector<WebCore::SecurityOriginData>& origins, Function<void()>&& completionHandler) 121 { 122 ASSERT(!RunLoop::isMain()); 123 124 for (auto& origin : origins) { 196 125 for (auto& sessionStorageNamespace : m_sessionStorageNamespaces.values()) 197 sessionStorageNamespace->clearAllStorageAreas(); 198 199 RunLoop::main().dispatch(WTFMove(completionHandler)); 200 }); 201 } 202 203 void StorageManager::deleteSessionStorageEntriesForOrigins(const Vector<WebCore::SecurityOriginData>& origins, Function<void()>&& completionHandler) 204 { 205 ASSERT(RunLoop::isMain()); 206 m_queue->dispatch([this, protectedThis = makeRef(*this), copiedOrigins = crossThreadCopy(origins), completionHandler = WTFMove(completionHandler)]() mutable { 207 for (auto& origin : copiedOrigins) { 208 for (auto& sessionStorageNamespace : m_sessionStorageNamespaces.values()) 209 sessionStorageNamespace->clearStorageAreasMatchingOrigin(origin); 210 } 211 212 RunLoop::main().dispatch(WTFMove(completionHandler)); 213 }); 126 sessionStorageNamespace->clearStorageAreasMatchingOrigin(origin); 127 } 128 129 RunLoop::main().dispatch(WTFMove(completionHandler)); 214 130 } 215 131 216 132 void StorageManager::getLocalStorageOrigins(Function<void(HashSet<WebCore::SecurityOriginData>&&)>&& completionHandler) 217 133 { 218 ASSERT(RunLoop::isMain()); 219 m_queue->dispatch([this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)]() mutable { 220 HashSet<SecurityOriginData> origins; 221 222 if (m_localStorageDatabaseTracker) { 223 for (auto& origin : m_localStorageDatabaseTracker->origins()) 224 origins.add(origin.isolatedCopy()); 225 } else { 226 for (const auto& localStorageNameSpace : m_localStorageNamespaces.values()) { 227 for (auto& origin : localStorageNameSpace->ephemeralOrigins()) 228 origins.add(origin.isolatedCopy()); 229 } 230 } 231 232 for (auto& transientLocalStorageNamespace : m_transientLocalStorageNamespaces.values()) { 233 for (auto& origin : transientLocalStorageNamespace->origins()) 134 ASSERT(!RunLoop::isMain()); 135 136 HashSet<SecurityOriginData> origins; 137 if (m_localStorageDatabaseTracker) { 138 for (auto& origin : m_localStorageDatabaseTracker->origins()) 139 origins.add(origin.isolatedCopy()); 140 } else { 141 for (const auto& localStorageNameSpace : m_localStorageNamespaces.values()) { 142 for (auto& origin : localStorageNameSpace->ephemeralOrigins()) 234 143 origins.add(origin.isolatedCopy()); 235 144 } 236 237 RunLoop::main().dispatch([origins = WTFMove(origins), completionHandler = WTFMove(completionHandler)]() mutable { 238 completionHandler(WTFMove(origins)); 239 }); 145 } 146 147 for (auto& transientLocalStorageNamespace : m_transientLocalStorageNamespaces.values()) { 148 for (auto& origin : transientLocalStorageNamespace->origins()) 149 origins.add(origin.isolatedCopy()); 150 } 151 152 RunLoop::main().dispatch([origins = WTFMove(origins), completionHandler = WTFMove(completionHandler)]() mutable { 153 completionHandler(WTFMove(origins)); 240 154 }); 241 155 } … … 243 157 void StorageManager::getLocalStorageOriginDetails(Function<void(Vector<LocalStorageDatabaseTracker::OriginDetails>&&)>&& completionHandler) 244 158 { 245 ASSERT(RunLoop::isMain()); 246 m_queue->dispatch([this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)]() mutable { 247 Vector<LocalStorageDatabaseTracker::OriginDetails> originDetails; 248 if (m_localStorageDatabaseTracker) 249 originDetails = m_localStorageDatabaseTracker->originDetails().isolatedCopy(); 250 251 RunLoop::main().dispatch([originDetails = WTFMove(originDetails), completionHandler = WTFMove(completionHandler)]() mutable { 252 completionHandler(WTFMove(originDetails)); 253 }); 254 }); 255 } 256 257 void StorageManager::deleteLocalStorageEntriesForOrigin(const SecurityOriginData& securityOrigin) 258 { 259 ASSERT(RunLoop::isMain()); 260 m_queue->dispatch([this, protectedThis = makeRef(*this), copiedOrigin = securityOrigin.isolatedCopy()]() mutable { 261 for (auto& localStorageNamespace : m_localStorageNamespaces.values()) 262 localStorageNamespace->clearStorageAreasMatchingOrigin(copiedOrigin); 159 ASSERT(!RunLoop::isMain()); 160 161 Vector<LocalStorageDatabaseTracker::OriginDetails> originDetails; 162 if (m_localStorageDatabaseTracker) 163 originDetails = crossThreadCopy(m_localStorageDatabaseTracker->originDetails()); 164 165 RunLoop::main().dispatch([originDetails = WTFMove(originDetails), completionHandler = WTFMove(completionHandler)]() mutable { 166 completionHandler(WTFMove(originDetails)); 167 }); 168 } 169 170 void StorageManager::deleteLocalStorageOriginsModifiedSince(WallTime time, Function<void()>&& completionHandler) 171 { 172 ASSERT(!RunLoop::isMain()); 173 174 if (m_localStorageDatabaseTracker) { 175 auto originsToDelete = m_localStorageDatabaseTracker->databasesModifiedSince(time); 263 176 264 177 for (auto& transientLocalStorageNamespace : m_transientLocalStorageNamespaces.values()) 265 transientLocalStorageNamespace->clearStorageAreasMatchingOrigin(copiedOrigin); 266 267 if (m_localStorageDatabaseTracker) 268 m_localStorageDatabaseTracker->deleteDatabaseWithOrigin(copiedOrigin); 269 }); 270 } 271 272 void StorageManager::deleteLocalStorageOriginsModifiedSince(WallTime time, Function<void()>&& completionHandler) 273 { 274 ASSERT(RunLoop::isMain()); 275 m_queue->dispatch([this, protectedThis = makeRef(*this), time, completionHandler = WTFMove(completionHandler)]() mutable { 276 if (m_localStorageDatabaseTracker) { 277 auto originsToDelete = m_localStorageDatabaseTracker->databasesModifiedSince(time); 278 279 for (auto& transientLocalStorageNamespace : m_transientLocalStorageNamespaces.values()) 280 transientLocalStorageNamespace->clearAllStorageAreas(); 281 282 for (const auto& origin : originsToDelete) { 283 for (auto& localStorageNamespace : m_localStorageNamespaces.values()) 284 localStorageNamespace->clearStorageAreasMatchingOrigin(origin); 285 286 m_localStorageDatabaseTracker->deleteDatabaseWithOrigin(origin); 287 } 288 } else { 289 for (auto& localStorageNamespace : m_localStorageNamespaces.values()) 290 localStorageNamespace->clearAllStorageAreas(); 291 } 292 293 RunLoop::main().dispatch(WTFMove(completionHandler)); 294 }); 295 } 296 297 void StorageManager::deleteLocalStorageEntriesForOrigins(const Vector<WebCore::SecurityOriginData>& origins, Function<void()>&& completionHandler) 298 { 299 ASSERT(RunLoop::isMain()); 300 m_queue->dispatch([this, protectedThis = makeRef(*this), copiedOrigins = crossThreadCopy(origins), completionHandler = WTFMove(completionHandler)]() mutable { 301 for (auto& origin : copiedOrigins) { 178 transientLocalStorageNamespace->clearAllStorageAreas(); 179 180 for (const auto& origin : originsToDelete) { 302 181 for (auto& localStorageNamespace : m_localStorageNamespaces.values()) 303 182 localStorageNamespace->clearStorageAreasMatchingOrigin(origin); 304 305 for (auto& transientLocalStorageNamespace : m_transientLocalStorageNamespaces.values()) 306 transientLocalStorageNamespace->clearStorageAreasMatchingOrigin(origin); 307 308 if (m_localStorageDatabaseTracker) 309 m_localStorageDatabaseTracker->deleteDatabaseWithOrigin(origin); 183 m_localStorageDatabaseTracker->deleteDatabaseWithOrigin(origin); 310 184 } 311 312 RunLoop::main().dispatch(WTFMove(completionHandler)); 313 }); 314 } 315 316 void StorageManager::createLocalStorageMap(IPC::Connection& connection, uint64_t storageMapID, uint64_t storageNamespaceID, SecurityOriginData&& securityOriginData) 317 { 318 ASSERT(!RunLoop::isMain()); 319 auto connectionID = connection.uniqueID(); 320 std::pair<IPC::Connection::UniqueID, uint64_t> connectionAndStorageMapIDPair(connectionID, storageMapID); 321 322 ASSERT((HashMap<std::pair<IPC::Connection::UniqueID, uint64_t>, RefPtr<StorageArea>>::isValidKey(connectionAndStorageMapIDPair))); 323 324 auto result = m_storageAreasByConnection.add(connectionAndStorageMapIDPair, nullptr); 325 ASSERT(result.isNewEntry); 326 ASSERT((HashMap<uint64_t, RefPtr<LocalStorageNamespace>>::isValidKey(storageNamespaceID))); 327 328 LocalStorageNamespace* localStorageNamespace = getOrCreateLocalStorageNamespace(storageNamespaceID); 329 ASSERT(localStorageNamespace); 330 331 auto storageArea = localStorageNamespace->getOrCreateStorageArea(WTFMove(securityOriginData), m_localStorageDatabaseTracker ? LocalStorageNamespace::IsEphemeral::No : LocalStorageNamespace::IsEphemeral::Yes); 332 storageArea->addListener(connectionID, storageMapID); 333 334 result.iterator->value = WTFMove(storageArea); 335 } 336 337 void StorageManager::createTransientLocalStorageMap(IPC::Connection& connection, uint64_t storageMapID, uint64_t storageNamespaceID, SecurityOriginData&& topLevelOriginData, SecurityOriginData&& origin) 338 { 339 ASSERT(!RunLoop::isMain()); 340 auto connectionID = connection.uniqueID(); 341 342 ASSERT(m_storageAreasByConnection.isValidKey({ connectionID, storageMapID })); 343 344 // See if we already have session storage for this connection/origin combo. 345 // If so, update the map with the new ID, otherwise keep on trucking. 346 for (auto it = m_storageAreasByConnection.begin(), end = m_storageAreasByConnection.end(); it != end; ++it) { 347 if (it->key.first != connectionID) 348 continue; 349 Ref<StorageArea> area = *it->value; 350 if (!area->isEphemeral()) 351 continue; 352 if (!origin.securityOrigin()->isSameSchemeHostPort(area->securityOrigin().securityOrigin().get())) 353 continue; 354 area->addListener(connectionID, storageMapID); 355 // If the storageMapID used as key in m_storageAreasByConnection is no longer one of the StorageArea's listeners, then this means 356 // that destroyStorageMap() was already called for that storageMapID but it decided not to remove it from m_storageAreasByConnection 357 // so that we could reuse it later on for the same connection/origin combo. In this case, it is safe to remove the previous 358 // storageMapID from m_storageAreasByConnection. 359 if (!area->hasListener(connectionID, it->key.second)) 360 m_storageAreasByConnection.remove(it); 361 m_storageAreasByConnection.add({ connectionID, storageMapID }, WTFMove(area)); 362 return; 363 } 364 365 auto& slot = m_storageAreasByConnection.add({ connectionID, storageMapID }, nullptr).iterator->value; 366 ASSERT(!slot); 367 368 auto* transientLocalStorageNamespace = getOrCreateTransientLocalStorageNamespace(storageNamespaceID, WTFMove(topLevelOriginData)); 369 370 auto storageArea = transientLocalStorageNamespace->getOrCreateStorageArea(WTFMove(origin)); 371 storageArea->addListener(connectionID, storageMapID); 372 373 slot = WTFMove(storageArea); 374 } 375 376 void StorageManager::createSessionStorageMap(IPC::Connection& connection, uint64_t storageMapID, uint64_t storageNamespaceID, SecurityOriginData&& securityOriginData) 377 { 378 ASSERT(!RunLoop::isMain()); 379 auto connectionID = connection.uniqueID(); 380 ASSERT(m_sessionStorageNamespaces.isValidKey(storageNamespaceID)); 381 382 SessionStorageNamespace* sessionStorageNamespace = m_sessionStorageNamespaces.get(storageNamespaceID); 383 if (!sessionStorageNamespace) { 384 // We're getting an incoming message from the web process that's for session storage for a web page 385 // that has already been closed, just ignore it. 386 return; 387 } 388 389 ASSERT(m_storageAreasByConnection.isValidKey({ connectionID, storageMapID })); 390 391 auto& slot = m_storageAreasByConnection.add({ connectionID, storageMapID }, nullptr).iterator->value; 392 ASSERT(!slot); 393 ASSERT(sessionStorageNamespace->allowedConnections().contains(connectionID)); 394 395 auto storageArea = sessionStorageNamespace->getOrCreateStorageArea(WTFMove(securityOriginData)); 396 storageArea->addListener(connectionID, storageMapID); 397 398 slot = WTFMove(storageArea); 399 } 400 401 void StorageManager::destroyStorageMap(IPC::Connection& connection, uint64_t storageMapID) 402 { 403 ASSERT(!RunLoop::isMain()); 404 auto connectionID = connection.uniqueID(); 405 406 std::pair<IPC::Connection::UniqueID, uint64_t> connectionAndStorageMapIDPair(connectionID, storageMapID); 407 ASSERT(m_storageAreasByConnection.isValidKey(connectionAndStorageMapIDPair)); 408 409 auto it = m_storageAreasByConnection.find(connectionAndStorageMapIDPair); 410 if (it == m_storageAreasByConnection.end()) { 411 // The connection has been removed because the last page was closed. 412 return; 413 } 414 415 it->value->removeListener(connectionID, storageMapID); 416 417 // Don't remove session storage maps. The web process may reconnect and expect the data to still be around. 418 if (it->value->isEphemeral()) 419 return; 420 421 m_storageAreasByConnection.remove(connectionAndStorageMapIDPair); 422 } 423 424 void StorageManager::prewarm(IPC::Connection& connection, uint64_t storageMapID) 425 { 426 ASSERT(!RunLoop::isMain()); 427 if (auto* storageArea = findStorageArea(connection, storageMapID)) 428 storageArea->openDatabaseAndImportItemsIfNeeded(); 429 } 430 431 void StorageManager::getValues(IPC::Connection& connection, uint64_t storageMapID, uint64_t storageMapSeed, GetValuesCallback&& completionHandler) 432 { 433 ASSERT(!RunLoop::isMain()); 434 auto* storageArea = findStorageArea(connection, storageMapID); 435 436 // This is a session storage area for a page that has already been closed. Ignore it. 437 if (!storageArea) 438 return completionHandler({ }); 439 440 completionHandler(storageArea->items()); 441 connection.send(Messages::StorageAreaMap::DidGetValues(storageMapSeed), storageMapID); 442 } 443 444 void StorageManager::setItem(IPC::Connection& connection, WebCore::SecurityOriginData&& securityOriginData, uint64_t storageMapID, uint64_t sourceStorageAreaID, uint64_t storageMapSeed, const String& key, const String& value, const String& urlString) 445 { 446 ASSERT(!RunLoop::isMain()); 447 auto* storageArea = findStorageArea(connection, storageMapID); 448 449 // This is a session storage area for a page that has already been closed. Ignore it. 450 if (!storageArea) 451 return; 452 453 bool quotaError; 454 storageArea->setItem(connection.uniqueID(), sourceStorageAreaID, key, value, urlString, quotaError); 455 connection.send(Messages::StorageAreaMap::DidSetItem(storageMapSeed, key, quotaError), storageMapID); 456 } 457 458 void StorageManager::setItems(IPC::Connection& connection, uint64_t storageMapID, const HashMap<String, String>& items) 459 { 460 ASSERT(!RunLoop::isMain()); 461 if (auto* storageArea = findStorageArea(connection, storageMapID)) 462 storageArea->setItems(items); 463 } 464 465 void StorageManager::removeItem(IPC::Connection& connection, WebCore::SecurityOriginData&& securityOriginData, uint64_t storageMapID, uint64_t sourceStorageAreaID, uint64_t storageMapSeed, const String& key, const String& urlString) 466 { 467 ASSERT(!RunLoop::isMain()); 468 auto* storageArea = findStorageArea(connection, storageMapID); 469 470 // This is a session storage area for a page that has already been closed. Ignore it. 471 if (!storageArea) 472 return; 473 474 storageArea->removeItem(connection.uniqueID(), sourceStorageAreaID, key, urlString); 475 connection.send(Messages::StorageAreaMap::DidRemoveItem(storageMapSeed, key), storageMapID); 476 } 477 478 void StorageManager::clear(IPC::Connection& connection, WebCore::SecurityOriginData&& securityOriginData, uint64_t storageMapID, uint64_t sourceStorageAreaID, uint64_t storageMapSeed, const String& urlString) 479 { 480 ASSERT(!RunLoop::isMain()); 481 auto* storageArea = findStorageArea(connection, storageMapID); 482 483 // This is a session storage area for a page that has already been closed. Ignore it. 484 if (!storageArea) 485 return; 486 487 storageArea->clear(connection.uniqueID(), sourceStorageAreaID, urlString); 488 connection.send(Messages::StorageAreaMap::DidClear(storageMapSeed), storageMapID); 489 } 490 491 void StorageManager::waitUntilTasksFinished() 492 { 493 ASSERT(RunLoop::isMain()); 494 BinarySemaphore semaphore; 495 m_queue->dispatch([this, &semaphore] { 496 Vector<std::pair<IPC::Connection::UniqueID, uint64_t>> connectionAndStorageMapIDPairsToRemove; 497 for (auto& connectionStorageAreaPair : m_storageAreasByConnection) { 498 connectionStorageAreaPair.value->removeListener(connectionStorageAreaPair.key.first, connectionStorageAreaPair.key.second); 499 connectionAndStorageMapIDPairsToRemove.append(connectionStorageAreaPair.key); 500 } 501 502 for (auto& connectionStorageAreaPair : connectionAndStorageMapIDPairsToRemove) 503 m_storageAreasByConnection.remove(connectionStorageAreaPair); 504 505 m_sessionStorageNamespaces.clear(); 506 m_localStorageNamespaces.clear(); 507 508 semaphore.signal(); 509 }); 510 semaphore.wait(); 511 } 512 513 void StorageManager::suspend(CompletionHandler<void()>&& completionHandler) 514 { 515 ASSERT(RunLoop::isMain()); 516 CompletionHandlerCallingScope completionHandlerCaller(WTFMove(completionHandler)); 517 if (!m_localStorageDatabaseTracker) 518 return; 519 520 Locker<Lock> stateLocker(m_stateLock); 521 if (m_state != State::Running) 522 return; 523 m_state = State::WillSuspend; 524 525 m_queue->dispatch([this, protectedThis = makeRef(*this), completionHandler = completionHandlerCaller.release()] () mutable { 526 Locker<Lock> stateLocker(m_stateLock); 527 ASSERT(m_state != State::Suspended); 528 529 if (m_state != State::WillSuspend) { 530 RunLoop::main().dispatch(WTFMove(completionHandler)); 531 return; 532 } 533 534 m_state = State::Suspended; 535 RunLoop::main().dispatch(WTFMove(completionHandler)); 536 537 while (m_state == State::Suspended) 538 m_stateChangeCondition.wait(m_stateLock); 539 ASSERT(m_state == State::Running); 540 }); 541 } 542 543 void StorageManager::resume() 544 { 545 ASSERT(RunLoop::isMain()); 546 if (!m_localStorageDatabaseTracker) 547 return; 548 549 Locker<Lock> stateLocker(m_stateLock); 550 auto previousState = m_state; 551 m_state = State::Running; 552 if (previousState == State::Suspended) 553 m_stateChangeCondition.notifyOne(); 554 } 555 556 StorageArea* StorageManager::findStorageArea(IPC::Connection& connection, uint64_t storageMapID) const 557 { 558 ASSERT(!RunLoop::isMain()); 559 std::pair<IPC::Connection::UniqueID, uint64_t> connectionAndStorageMapIDPair(connection.uniqueID(), storageMapID); 560 561 if (!m_storageAreasByConnection.isValidKey(connectionAndStorageMapIDPair)) 562 return nullptr; 563 564 return m_storageAreasByConnection.get(connectionAndStorageMapIDPair); 185 } else { 186 for (auto& localStorageNamespace : m_localStorageNamespaces.values()) 187 localStorageNamespace->clearAllStorageAreas(); 188 } 189 190 RunLoop::main().dispatch(WTFMove(completionHandler)); 191 } 192 193 void StorageManager::deleteLocalStorageEntriesForOrigins(const Vector<WebCore::SecurityOriginData>& origins, Function<void()>&& completionHandler) 194 { 195 ASSERT(!RunLoop::isMain()); 196 197 for (auto& origin : origins) { 198 for (auto& localStorageNamespace : m_localStorageNamespaces.values()) 199 localStorageNamespace->clearStorageAreasMatchingOrigin(origin); 200 201 for (auto& transientLocalStorageNamespace : m_transientLocalStorageNamespaces.values()) 202 transientLocalStorageNamespace->clearStorageAreasMatchingOrigin(origin); 203 204 if (m_localStorageDatabaseTracker) 205 m_localStorageDatabaseTracker->deleteDatabaseWithOrigin(origin); 206 } 207 208 RunLoop::main().dispatch(WTFMove(completionHandler)); 209 } 210 211 StorageArea* StorageManager::createLocalStorageArea(uint64_t storageNamespaceID, WebCore::SecurityOriginData&& origin) 212 { 213 ASSERT(!RunLoop::isMain()); 214 215 if (auto* localStorageNamespace = getOrCreateLocalStorageNamespace(storageNamespaceID)) 216 return localStorageNamespace->getOrCreateStorageArea(WTFMove(origin), m_localStorageDatabaseTracker ? LocalStorageNamespace::IsEphemeral::No : LocalStorageNamespace::IsEphemeral::Yes).ptr(); 217 218 return nullptr; 219 } 220 221 StorageArea* StorageManager::createTransientLocalStorageArea(uint64_t storageNamespaceID, WebCore::SecurityOriginData&& topLevelOrigin, WebCore::SecurityOriginData&& origin) 222 { 223 ASSERT(!RunLoop::isMain()); 224 ASSERT((HashMap<uint64_t, RefPtr<TransientLocalStorageNamespace>>::isValidKey(storageNamespaceID))); 225 226 if (auto* transientLocalStorageNamespace = getOrCreateTransientLocalStorageNamespace(storageNamespaceID, WTFMove(topLevelOrigin))) 227 return transientLocalStorageNamespace->getOrCreateStorageArea(WTFMove(origin)).ptr(); 228 229 return nullptr; 230 } 231 232 StorageArea* StorageManager::createSessionStorageArea(uint64_t storageNamespaceID, WebCore::SecurityOriginData&& origin) 233 { 234 ASSERT(!RunLoop::isMain()); 235 ASSERT((HashMap<uint64_t, RefPtr<SessionStorageNamespace>>::isValidKey(storageNamespaceID))); 236 237 if (auto* sessionStorageNamespace = getOrCreateSessionStorageNamespace(storageNamespaceID)) 238 return sessionStorageNamespace->getOrCreateStorageArea(WTFMove(origin)).ptr(); 239 240 return nullptr; 565 241 } 566 242 … … 568 244 { 569 245 ASSERT(!RunLoop::isMain()); 246 570 247 if (!m_localStorageNamespaces.isValidKey(storageNamespaceID)) 571 248 return nullptr; … … 579 256 { 580 257 ASSERT(!RunLoop::isMain()); 258 581 259 if (!m_transientLocalStorageNamespaces.isValidKey({ storageNamespaceID, topLevelOrigin })) 582 260 return nullptr; 583 261 584 return m_transientLocalStorageNamespaces.ensure({ storageNamespaceID, WTFMove(topLevelOrigin) }, [] (){262 return m_transientLocalStorageNamespaces.ensure({ storageNamespaceID, WTFMove(topLevelOrigin) }, [] { 585 263 return TransientLocalStorageNamespace::create(); 586 264 }).iterator->value.get(); 587 265 } 588 266 267 SessionStorageNamespace* StorageManager::getOrCreateSessionStorageNamespace(uint64_t storageNamespaceID) 268 { 269 ASSERT(!RunLoop::isMain()); 270 271 if (!m_sessionStorageNamespaces.isValidKey(storageNamespaceID)) 272 return nullptr; 273 274 return m_sessionStorageNamespaces.ensure(storageNamespaceID, [] { 275 // We currently have no limit on session storage. 276 return SessionStorageNamespace::create(std::numeric_limits<unsigned>::max()); 277 }).iterator->value.get(); 278 } 279 280 void StorageManager::clearStorageNamespaces() 281 { 282 ASSERT(!RunLoop::isMain()); 283 284 m_localStorageNamespaces.clear(); 285 m_transientLocalStorageNamespaces.clear(); 286 m_sessionStorageNamespaces.clear(); 287 } 288 589 289 } // namespace WebKit -
trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManager.h
r248422 r248734 50 50 using GetValuesCallback = CompletionHandler<void(const HashMap<String, String>&)>; 51 51 52 class StorageManager : public IPC::Connection::WorkQueueMessageReceiver{52 class StorageManager : public RefCounted<StorageManager> { 53 53 public: 54 54 static Ref<StorageManager> create(String&& localStorageDirectory) … … 61 61 void createSessionStorageNamespace(uint64_t storageNamespaceID, unsigned quotaInBytes); 62 62 void destroySessionStorageNamespace(uint64_t storageNamespaceID); 63 void addAllowedSessionStorageNamespaceConnection(uint64_t storageNamespaceID, IPC::Connection&);64 void removeAllowedSessionStorageNamespaceConnection(uint64_t storageNamespaceID, IPC::Connection&);65 63 void cloneSessionStorageNamespace(uint64_t storageNamespaceID, uint64_t newStorageNamespaceID); 66 64 67 void processDidCloseConnection(IPC::Connection&); 68 void waitUntilTasksFinished(); 69 void suspend(CompletionHandler<void()>&&); 70 void resume(); 65 void getSessionStorageOrigins(Function<void(HashSet<WebCore::SecurityOriginData>&&)>&&); 66 void deleteSessionStorageOrigins(Function<void()>&& completionHandler); 67 void deleteSessionStorageEntriesForOrigins(const Vector<WebCore::SecurityOriginData>&, Function<void()>&&); 71 68 72 void getSessionStorageOrigins(Function<void(HashSet<WebCore::SecurityOriginData>&&)>&& completionHandler); 73 void deleteSessionStorageOrigins(Function<void()>&& completionHandler); 74 void deleteSessionStorageEntriesForOrigins(const Vector<WebCore::SecurityOriginData>&, Function<void()>&& completionHandler); 69 void getLocalStorageOrigins(Function<void(HashSet<WebCore::SecurityOriginData>&&)>&&); 70 void deleteLocalStorageOriginsModifiedSince(WallTime, Function<void()>&&); 71 void deleteLocalStorageEntriesForOrigins(const Vector<WebCore::SecurityOriginData>&, Function<void()>&&); 72 void getLocalStorageOriginDetails(Function<void(Vector<LocalStorageDatabaseTracker::OriginDetails>&&)>&&); 75 73 76 void getLocalStorageOrigins(Function<void(HashSet<WebCore::SecurityOriginData>&&)>&& completionHandler); 77 void deleteLocalStorageEntriesForOrigin(const WebCore::SecurityOriginData&); 78 79 void deleteLocalStorageOriginsModifiedSince(WallTime, Function<void()>&& completionHandler); 80 void deleteLocalStorageEntriesForOrigins(const Vector<WebCore::SecurityOriginData>&, Function<void()>&& completionHandler); 81 82 void getLocalStorageOriginDetails(Function<void(Vector<LocalStorageDatabaseTracker::OriginDetails>&&)>&& completionHandler); 74 void clearStorageNamespaces(); 83 75 84 76 void didReceiveMessage(IPC::Connection&, IPC::Decoder&); … … 87 79 LocalStorageDatabaseTracker* localStorageDatabaseTracker() const { return m_localStorageDatabaseTracker.get(); } 88 80 89 WorkQueue& workQueue() const { return m_queue.get(); }90 91 81 static const unsigned localStorageDatabaseQuotaInBytes; 82 83 StorageArea* createLocalStorageArea(uint64_t storageNamespaceID, WebCore::SecurityOriginData&&); 84 StorageArea* createTransientLocalStorageArea(uint64_t storageNamespaceID, WebCore::SecurityOriginData&&, WebCore::SecurityOriginData&&); 85 StorageArea* createSessionStorageArea(uint64_t storageNamespaceID, WebCore::SecurityOriginData&&); 92 86 93 87 private: 94 88 explicit StorageManager(String&& localStorageDirectory); 95 89 96 // Message handlers.97 void createLocalStorageMap(IPC::Connection&, uint64_t storageMapID, uint64_t storageNamespaceID, WebCore::SecurityOriginData&&);98 void createTransientLocalStorageMap(IPC::Connection&, uint64_t storageMapID, uint64_t storageNamespaceID, WebCore::SecurityOriginData&& topLevelOriginData, WebCore::SecurityOriginData&&);99 void createSessionStorageMap(IPC::Connection&, uint64_t storageMapID, uint64_t storageNamespaceID, WebCore::SecurityOriginData&&);100 void destroyStorageMap(IPC::Connection&, uint64_t storageMapID);101 102 void getValues(IPC::Connection&, uint64_t storageMapID, uint64_t storageMapSeed, GetValuesCallback&&);103 void prewarm(IPC::Connection&, uint64_t storageMapID);104 void setItem(IPC::Connection&, WebCore::SecurityOriginData&&, uint64_t storageMapID, uint64_t sourceStorageAreaID, uint64_t storageMapSeed, const String& key, const String& value, const String& urlString);105 void setItems(IPC::Connection&, uint64_t storageMapID, const HashMap<String, String>& items);106 void removeItem(IPC::Connection&, WebCore::SecurityOriginData&&, uint64_t storageMapID, uint64_t sourceStorageAreaID, uint64_t storageMapSeed, const String& key, const String& urlString);107 void clear(IPC::Connection&, WebCore::SecurityOriginData&&, uint64_t storageMapID, uint64_t sourceStorageAreaID, uint64_t storageMapSeed, const String& urlString);108 109 StorageArea* findStorageArea(IPC::Connection&, uint64_t) const;110 111 90 LocalStorageNamespace* getOrCreateLocalStorageNamespace(uint64_t storageNamespaceID); 112 113 91 TransientLocalStorageNamespace* getOrCreateTransientLocalStorageNamespace(uint64_t storageNamespaceID, WebCore::SecurityOriginData&& topLevelOrigin); 114 115 Ref<WorkQueue> m_queue; 92 SessionStorageNamespace* getOrCreateSessionStorageNamespace(uint64_t storageNamespaceID); 116 93 117 94 RefPtr<LocalStorageDatabaseTracker> m_localStorageDatabaseTracker; 118 95 HashMap<uint64_t, RefPtr<LocalStorageNamespace>> m_localStorageNamespaces; 119 120 96 HashMap<std::pair<uint64_t, WebCore::SecurityOriginData>, RefPtr<TransientLocalStorageNamespace>> m_transientLocalStorageNamespaces; 121 122 97 HashMap<uint64_t, RefPtr<SessionStorageNamespace>> m_sessionStorageNamespaces; 123 124 HashMap<std::pair<IPC::Connection::UniqueID, uint64_t>, RefPtr<StorageArea>> m_storageAreasByConnection;125 HashSet<IPC::Connection::UniqueID> m_connections;126 127 enum class State {128 Running,129 WillSuspend,130 Suspended131 };132 State m_state { State::Running };133 Lock m_stateLock;134 Condition m_stateChangeCondition;135 98 }; 136 99 -
trunk/Source/WebKit/Shared/WebsiteDataStoreParameters.cpp
r243911 r248734 53 53 encoder << serviceWorkerRegistrationDirectory << serviceWorkerRegistrationDirectoryExtensionHandle; 54 54 #endif 55 56 encoder << localStorageDirectory << localStorageDirectoryExtensionHandle; 55 57 56 58 encoder << perOriginStorageQuota; … … 122 124 #endif 123 125 126 Optional<String> localStorageDirectory; 127 decoder >> localStorageDirectory; 128 if (!localStorageDirectory) 129 return WTF::nullopt; 130 parameters.localStorageDirectory = WTFMove(*localStorageDirectory); 131 132 Optional<SandboxExtension::Handle> localStorageDirectoryExtensionHandle; 133 decoder >> localStorageDirectoryExtensionHandle; 134 if (!localStorageDirectoryExtensionHandle) 135 return WTF::nullopt; 136 parameters.localStorageDirectoryExtensionHandle = WTFMove(*localStorageDirectoryExtensionHandle); 137 124 138 Optional<uint64_t> perOriginStorageQuota; 125 139 decoder >> perOriginStorageQuota; … … 150 164 , { }, { } 151 165 #endif 166 , { }, { } 152 167 }; 153 168 } -
trunk/Source/WebKit/Shared/WebsiteDataStoreParameters.h
r243911 r248734 71 71 #endif 72 72 73 String localStorageDirectory; 74 SandboxExtension::Handle localStorageDirectoryExtensionHandle; 75 73 76 uint64_t perOriginStorageQuota { WebCore::StorageQuotaManager::defaultQuota() }; 74 77 uint64_t perThirdPartyOriginStorageQuota { WebCore::StorageQuotaManager::defaultThirdPartyQuota() }; -
trunk/Source/WebKit/Sources.txt
r248631 r248734 71 71 NetworkProcess/WebStorage/StorageArea.cpp 72 72 NetworkProcess/WebStorage/StorageManager.cpp 73 NetworkProcess/WebStorage/StorageManagerSet.cpp 73 74 NetworkProcess/WebStorage/TransientLocalStorageNamespace.cpp 74 75 -
trunk/Source/WebKit/UIProcess/API/C/WKContext.cpp
r248699 r248734 670 670 WebKit::toImpl(contextRef)->clearCurrentModifierStateForTesting(); 671 671 } 672 673 void WKContextSyncLocalStorage(WKContextRef contextRef, void* context, WKContextSyncLocalStorageCallback callback) 674 { 675 WebKit::toImpl(contextRef)->syncLocalStorage([context, callback] { 676 if (callback) 677 callback(context); 678 }); 679 } 680 681 void WKContextClearLegacyPrivateBrowsingLocalStorage(WKContextRef contextRef, void* context, WKContextClearLegacyPrivateBrowsingLocalStorageCallback callback) 682 { 683 WebKit::toImpl(contextRef)->clearLegacyPrivateBrowsingLocalStorage([context, callback] { 684 if (callback) 685 callback(context); 686 }); 687 } -
trunk/Source/WebKit/UIProcess/API/C/WKContextPrivate.h
r248699 r248734 121 121 WK_EXPORT void WKContextClearCurrentModifierStateForTesting(WKContextRef context); 122 122 123 typedef void (*WKContextSyncLocalStorageCallback)(void* functionContext); 124 WK_EXPORT void WKContextSyncLocalStorage(WKContextRef contextRef, void* context, WKContextSyncLocalStorageCallback callback); 125 126 typedef void (*WKContextClearLegacyPrivateBrowsingLocalStorageCallback)(void* functionContext); 127 WK_EXPORT void WKContextClearLegacyPrivateBrowsingLocalStorage(WKContextRef contextRef, void* context, WKContextClearLegacyPrivateBrowsingLocalStorageCallback callback); 128 123 129 #ifdef __cplusplus 124 130 } -
trunk/Source/WebKit/UIProcess/API/C/WKWebsiteDataStoreRef.cpp
r248640 r248734 532 532 } 533 533 534 void WKWebsiteDataStoreRemoveLocalStorage(WKWebsiteDataStoreRef dataStoreRef, void* context, WKWebsiteDataStoreRemoveLocalStorageCallback callback) 535 { 536 OptionSet<WebKit::WebsiteDataType> dataTypes = WebKit::WebsiteDataType::LocalStorage; 537 WebKit::toImpl(dataStoreRef)->websiteDataStore().removeData(dataTypes, -WallTime::infinity(), [context, callback] { 538 if (callback) 539 callback(context); 540 }); 541 } 542 534 543 void WKWebsiteDataStoreRemoveAllServiceWorkerRegistrations(WKWebsiteDataStoreRef dataStoreRef, void* context, WKWebsiteDataStoreRemoveAllServiceWorkerRegistrationsCallback callback) 535 544 { -
trunk/Source/WebKit/UIProcess/API/C/WKWebsiteDataStoreRef.h
r248640 r248734 122 122 WK_EXPORT void WKWebsiteDataStoreGetFetchCacheOrigins(WKWebsiteDataStoreRef dataStoreRef, void* context, WKWebsiteDataStoreGetFetchCacheOriginsFunction function); 123 123 124 typedef void (*WKWebsiteDataStoreRemoveLocalStorageCallback)(void* functionContext); 125 WK_EXPORT void WKWebsiteDataStoreRemoveLocalStorage(WKWebsiteDataStoreRef dataStoreRef, void* context, WKWebsiteDataStoreRemoveLocalStorageCallback callback); 126 124 127 typedef void (*WKWebsiteDataStoreGetFetchCacheSizeForOriginFunction)(uint64_t, void*); 125 128 WK_EXPORT void WKWebsiteDataStoreGetFetchCacheSizeForOrigin(WKWebsiteDataStoreRef dataStoreRef, WKStringRef origin, void* context, WKWebsiteDataStoreGetFetchCacheSizeForOriginFunction function); -
trunk/Source/WebKit/UIProcess/WebProcessPool.cpp
r248699 r248734 584 584 if (!localStorageDirectory) 585 585 localStorageDirectory = API::WebsiteDataStore::defaultLocalStorageDirectory(); 586 parameters.defaultDataStoreParameters. networkSessionParameters.localStorageDirectory = localStorageDirectory;587 SandboxExtension::createHandleForReadWriteDirectory(localStorageDirectory, parameters.defaultDataStoreParameters. networkSessionParameters.localStorageDirectoryExtensionHandle);586 parameters.defaultDataStoreParameters.localStorageDirectory = localStorageDirectory; 587 SandboxExtension::createHandleForReadWriteDirectory(localStorageDirectory, parameters.defaultDataStoreParameters.localStorageDirectoryExtensionHandle); 588 588 589 589 if (m_websiteDataStore) … … 1808 1808 ensureNetworkProcess().send(Messages::NetworkProcess::SetIDBPerOriginQuota(quota), 0); 1809 1809 #endif 1810 } 1811 1812 void WebProcessPool::syncLocalStorage(CompletionHandler<void()>&& completionHandler) 1813 { 1814 sendSyncToNetworkingProcess(Messages::NetworkProcess::SyncLocalStorage(), Messages::NetworkProcess::SyncLocalStorage::Reply()); 1815 completionHandler(); 1816 } 1817 1818 void WebProcessPool::clearLegacyPrivateBrowsingLocalStorage(CompletionHandler<void()>&& completionHandler) 1819 { 1820 if (m_networkProcess) 1821 m_networkProcess->send(Messages::NetworkProcess::ClearLegacyPrivateBrowsingLocalStorage(), 0); 1822 completionHandler(); 1810 1823 } 1811 1824 -
trunk/Source/WebKit/UIProcess/WebProcessPool.h
r248699 r248734 318 318 319 319 void syncNetworkProcessCookies(); 320 void syncLocalStorage(CompletionHandler<void()>&& callback); 321 void clearLegacyPrivateBrowsingLocalStorage(CompletionHandler<void()>&& callback); 320 322 321 323 void setIDBPerOriginQuota(uint64_t); -
trunk/Source/WebKit/UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm
r248640 r248734 110 110 SandboxExtension::createHandleForReadWriteDirectory(resourceLoadStatisticsDirectory, resourceLoadStatisticsDirectoryHandle); 111 111 112 auto localStorageDirectory = resolvedLocalStorageDirectory();113 SandboxExtension::Handle localStorageDirectoryExtensionHandle;114 if (!localStorageDirectory.isEmpty())115 SandboxExtension::createHandleForReadWriteDirectory(localStorageDirectory, localStorageDirectoryExtensionHandle);116 117 112 auto networkCacheDirectory = resolvedNetworkCacheDirectory(); 118 113 SandboxExtension::Handle networkCacheDirectoryExtensionHandle; … … 144 139 m_configuration->allLoadsBlockedByDeviceManagementRestrictionsForTesting(), 145 140 WTFMove(resourceLoadStatisticsManualPrevalentResource), 146 WTFMove(localStorageDirectory),147 WTFMove(localStorageDirectoryExtensionHandle),148 141 WTFMove(networkCacheDirectory), 149 142 WTFMove(networkCacheDirectoryExtensionHandle), … … 181 174 #endif 182 175 176 parameters.localStorageDirectory = resolvedLocalStorageDirectory(); 177 if (!parameters.localStorageDirectory.isEmpty()) 178 SandboxExtension::createHandleForReadWriteDirectory(parameters.localStorageDirectory, parameters.localStorageDirectoryExtensionHandle); 179 183 180 parameters.perOriginStorageQuota = perOriginStorageQuota(); 184 181 parameters.perThirdPartyOriginStorageQuota = perThirdPartyOriginStorageQuota(); -
trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp
r248640 r248734 1970 1970 auto localStorageDirectory = resolvedLocalStorageDirectory(); 1971 1971 if (!localStorageDirectory.isEmpty()) { 1972 parameters. networkSessionParameters.localStorageDirectory = localStorageDirectory;1973 SandboxExtension::createHandleForReadWriteDirectory(localStorageDirectory, parameters. networkSessionParameters.localStorageDirectoryExtensionHandle);1972 parameters.localStorageDirectory = localStorageDirectory; 1973 SandboxExtension::createHandleForReadWriteDirectory(localStorageDirectory, parameters.localStorageDirectoryExtensionHandle); 1974 1974 } 1975 1975 -
trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj
r248631 r248734 294 294 1AB1F7981D1B3613007C9BD1 /* WebPaymentCoordinatorProxyMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1AB1F7941D1B3613007C9BD1 /* WebPaymentCoordinatorProxyMessageReceiver.cpp */; }; 295 295 1AB1F7991D1B3613007C9BD1 /* WebPaymentCoordinatorProxyMessages.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AB1F7951D1B3613007C9BD1 /* WebPaymentCoordinatorProxyMessages.h */; }; 296 1AB31A9616BC688100F6DBC9 /* StorageManagerMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1AB31A9416BC688100F6DBC9 /* StorageManagerMessageReceiver.cpp */; };297 1AB31A9716BC688100F6DBC9 /* StorageManagerMessages.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AB31A9516BC688100F6DBC9 /* StorageManagerMessages.h */; };298 296 1AB40EE61BF677E300BA81BE /* WKMenuItemIdentifiersPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AB40EE41BF677E300BA81BE /* WKMenuItemIdentifiersPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; }; 299 297 1AB474D8184D43FD0051B622 /* WKBundlePageLoaderClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AB474D7184D43FD0051B622 /* WKBundlePageLoaderClient.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 1276 1274 935EEB9B1277617C003322B8 /* WKBundleBackForwardListItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 935EEB981277616D003322B8 /* WKBundleBackForwardListItem.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1277 1275 935EEB9F127761AC003322B8 /* WKBundleBackForwardList.h in Headers */ = {isa = PBXBuildFile; fileRef = 935EEB961277616D003322B8 /* WKBundleBackForwardList.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1276 9368EEDE2303A90200BDB11A /* StorageManagerSetMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9368EEDC2303A8D800BDB11A /* StorageManagerSetMessageReceiver.cpp */; }; 1277 9368EEDF2303A9ED00BDB11A /* StorageManagerSetMessages.h in Headers */ = {isa = PBXBuildFile; fileRef = 9368EEDD2303A8D800BDB11A /* StorageManagerSetMessages.h */; }; 1278 936B059823039097002FC06B /* StorageManagerSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 936B05952303900B002FC06B /* StorageManagerSet.h */; }; 1278 1279 93735EBB1C92986300336FA7 /* WKPreviewActionItemInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 93735EBA1C92986300336FA7 /* WKPreviewActionItemInternal.h */; }; 1279 1280 9391074F1BF6BC65008C17AD /* WKPreviewElementInfoInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 9391074E1BF6BC65008C17AD /* WKPreviewElementInfoInternal.h */; }; … … 1708 1709 filePatterns = "*.h"; 1709 1710 fileType = pattern.proxy; 1711 inputFiles = ( 1712 ); 1710 1713 isEditable = 1; 1711 1714 outputFiles = ( … … 2308 2311 1AB1F7941D1B3613007C9BD1 /* WebPaymentCoordinatorProxyMessageReceiver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WebPaymentCoordinatorProxyMessageReceiver.cpp; path = DerivedSources/WebKit2/WebPaymentCoordinatorProxyMessageReceiver.cpp; sourceTree = BUILT_PRODUCTS_DIR; }; 2309 2312 1AB1F7951D1B3613007C9BD1 /* WebPaymentCoordinatorProxyMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebPaymentCoordinatorProxyMessages.h; path = DerivedSources/WebKit2/WebPaymentCoordinatorProxyMessages.h; sourceTree = BUILT_PRODUCTS_DIR; }; 2310 1AB31A9416BC688100F6DBC9 /* StorageManagerMessageReceiver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = StorageManagerMessageReceiver.cpp; path = DerivedSources/WebKit2/StorageManagerMessageReceiver.cpp; sourceTree = BUILT_PRODUCTS_DIR; };2311 1AB31A9516BC688100F6DBC9 /* StorageManagerMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = StorageManagerMessages.h; path = DerivedSources/WebKit2/StorageManagerMessages.h; sourceTree = BUILT_PRODUCTS_DIR; };2312 2313 1AB40EE31BF677E300BA81BE /* WKMenuItemIdentifiers.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKMenuItemIdentifiers.mm; sourceTree = "<group>"; }; 2313 2314 1AB40EE41BF677E300BA81BE /* WKMenuItemIdentifiersPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKMenuItemIdentifiersPrivate.h; sourceTree = "<group>"; }; … … 3898 3899 935EEB971277616D003322B8 /* WKBundleBackForwardListItem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WKBundleBackForwardListItem.cpp; sourceTree = "<group>"; }; 3899 3900 935EEB981277616D003322B8 /* WKBundleBackForwardListItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKBundleBackForwardListItem.h; sourceTree = "<group>"; }; 3901 9368EEDC2303A8D800BDB11A /* StorageManagerSetMessageReceiver.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 4; name = StorageManagerSetMessageReceiver.cpp; path = DerivedSources/WebKit2/StorageManagerSetMessageReceiver.cpp; sourceTree = BUILT_PRODUCTS_DIR; }; 3902 9368EEDD2303A8D800BDB11A /* StorageManagerSetMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = StorageManagerSetMessages.h; path = DerivedSources/WebKit2/StorageManagerSetMessages.h; sourceTree = BUILT_PRODUCTS_DIR; }; 3903 936B05952303900B002FC06B /* StorageManagerSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StorageManagerSet.h; sourceTree = "<group>"; }; 3904 936B05962303900B002FC06B /* StorageManagerSet.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = StorageManagerSet.messages.in; sourceTree = "<group>"; }; 3905 936B05972303900B002FC06B /* StorageManagerSet.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StorageManagerSet.cpp; sourceTree = "<group>"; }; 3900 3906 93735EBA1C92986300336FA7 /* WKPreviewActionItemInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKPreviewActionItemInternal.h; sourceTree = "<group>"; }; 3901 3907 9391074E1BF6BC65008C17AD /* WKPreviewElementInfoInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKPreviewElementInfoInternal.h; sourceTree = "<group>"; }; … … 3927 3933 93B26149227D147200B97A76 /* StorageManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StorageManager.h; sourceTree = "<group>"; }; 3928 3934 93B2614A227D147200B97A76 /* StorageManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StorageManager.cpp; sourceTree = "<group>"; }; 3929 93B2614B227D147200B97A76 /* StorageManager.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = StorageManager.messages.in; sourceTree = "<group>"; };3930 3935 93B2614C227D147200B97A76 /* LocalStorageDatabase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LocalStorageDatabase.cpp; sourceTree = "<group>"; }; 3931 3936 93BA04DA2151ADF3007F455F /* WebSWServerConnection.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = WebSWServerConnection.messages.in; sourceTree = "<group>"; }; … … 7305 7310 93B2614A227D147200B97A76 /* StorageManager.cpp */, 7306 7311 93B26149227D147200B97A76 /* StorageManager.h */, 7307 93B2614B227D147200B97A76 /* StorageManager.messages.in */, 7312 936B05972303900B002FC06B /* StorageManagerSet.cpp */, 7313 936B05952303900B002FC06B /* StorageManagerSet.h */, 7314 936B05962303900B002FC06B /* StorageManagerSet.messages.in */, 7308 7315 46BEB6E222FBB21A00269867 /* TransientLocalStorageNamespace.cpp */, 7309 7316 46BEB6E122FBB21A00269867 /* TransientLocalStorageNamespace.h */, … … 8767 8774 1A334DEB16DE8F88006A8E38 /* StorageAreaMapMessageReceiver.cpp */, 8768 8775 1A334DEC16DE8F88006A8E38 /* StorageAreaMapMessages.h */, 8769 1AB31A9416BC688100F6DBC9 /* StorageManagerMessageReceiver.cpp */,8770 1AB31A9516BC688100F6DBC9 /* StorageManagerMessages.h */,8776 9368EEDC2303A8D800BDB11A /* StorageManagerSetMessageReceiver.cpp */, 8777 9368EEDD2303A8D800BDB11A /* StorageManagerSetMessages.h */, 8771 8778 5118E9A51F295963003EF9F5 /* StorageProcessMessageReceiver.cpp */, 8772 8779 5118E9A61F295963003EF9F5 /* StorageProcessMessages.h */, … … 9671 9678 1A334DEE16DE8F88006A8E38 /* StorageAreaMapMessages.h in Headers */, 9672 9679 93B2614D227D149E00B97A76 /* StorageManager.h in Headers */, 9673 1AB31A9716BC688100F6DBC9 /* StorageManagerMessages.h in Headers */, 9680 936B059823039097002FC06B /* StorageManagerSet.h in Headers */, 9681 9368EEDF2303A9ED00BDB11A /* StorageManagerSetMessages.h in Headers */, 9674 9682 1AE00D6C18327C1200087DD7 /* StringReference.h in Headers */, 9675 9683 296BD85D15019BC30071F424 /* StringUtilities.h in Headers */, … … 11185 11193 2DE6943D18BD2A68005C15E5 /* SmartMagnificationControllerMessageReceiver.cpp in Sources */, 11186 11194 1A334DED16DE8F88006A8E38 /* StorageAreaMapMessageReceiver.cpp in Sources */, 11187 1AB31A9616BC688100F6DBC9 /* StorageManagerMessageReceiver.cpp in Sources */,11195 9368EEDE2303A90200BDB11A /* StorageManagerSetMessageReceiver.cpp in Sources */, 11188 11196 2D92A783212B6A7100F493FD /* StringReference.cpp in Sources */, 11189 11197 2D11B7512126A282006F8878 /* UnifiedSource1-mm.mm in Sources */, -
trunk/Source/WebKit/WebProcess/InjectedBundle/InjectedBundle.cpp
r247283 r248734 47 47 #include "WebProcessMessages.h" 48 48 #include "WebProcessPoolMessages.h" 49 #include "WebStorageNamespaceProvider.h" 49 50 #include "WebUserContentController.h" 50 51 #include "WebsiteDataStoreParameters.h" … … 349 350 { 350 351 ASSERT(!hasProcessPrivilege(ProcessPrivilege::CanAccessRawCookies)); 351 WebProcess::singleton().enablePrivateBrowsingForTesting(enabled); 352 if (enabled) 353 WebProcess::singleton().ensureLegacyPrivateBrowsingSessionInNetworkProcess(); 352 354 353 355 PageGroup::pageGroup(pageGroup->identifier())->enableLegacyPrivateBrowsingForTesting(enabled); 356 357 auto webStorageNameSpaceProvider = WebStorageNamespaceProvider::getOrCreate(pageGroup->pageGroupID()); 358 webStorageNameSpaceProvider->enableLegacyPrivateBrowsingForTesting(enabled); 354 359 } 355 360 -
trunk/Source/WebKit/WebProcess/WebProcess.cpp
r248713 r248734 678 678 // link) the WebPage gets created both in the synchronous handler and through the normal way. 679 679 auto result = m_pageMap.add(pageID, nullptr); 680 auto oldPageID = parameters.oldPageID ? parameters.oldPageID.value() : pageID;681 680 if (result.isNewEntry) { 682 681 ASSERT(!result.iterator->value); … … 689 688 result.iterator->value->reinitializeWebPage(WTFMove(parameters)); 690 689 691 ensureNetworkProcessConnection().connection().send(Messages::NetworkConnectionToWebProcess::WebPageWasAdded(result.iterator->value->sessionID(), pageID, oldPageID), 0);692 693 690 ASSERT(result.iterator->value); 694 691 } … … 698 695 ASSERT(m_pageMap.contains(pageID)); 699 696 700 ensureNetworkProcessConnection().connection().send(Messages::NetworkConnectionToWebProcess::WebPageWasRemoved(sessionID, pageID), 0);701 697 pageWillLeaveWindow(pageID); 702 698 m_pageMap.remove(pageID); … … 1247 1243 1248 1244 m_networkProcessConnection = NetworkProcessConnection::create(connectionIdentifier); 1249 1250 // To recover web storage, network process needs to know active webpages to prepare session storage.1251 // FIXME: https://bugs.webkit.org/show_bug.cgi?id=198051.1252 // Webpage should be added when Storage is used, not when connection is re-established.1253 for (auto& page : m_pageMap) {1254 if (!page.value)1255 continue;1256 1257 m_networkProcessConnection->connection().send(Messages::NetworkConnectionToWebProcess::WebPageWasAdded(page.value->sessionID(), page.key, page.key), 0);1258 }1259 1245 } 1260 1246 … … 1287 1273 ASSERT_UNUSED(connection, m_networkProcessConnection == connection); 1288 1274 1289 for (auto* storageAreaMap : m_storageAreaMaps.values())1275 for (auto* storageAreaMap : copyToVector(m_storageAreaMaps.values())) 1290 1276 storageAreaMap->disconnect(); 1291 1277 … … 1688 1674 StorageAreaMap* WebProcess::storageAreaMap(uint64_t identifier) const 1689 1675 { 1690 ASSERT(m_storageAreaMaps.contains(identifier));1691 1676 return m_storageAreaMaps.get(identifier); 1692 }1693 1694 void WebProcess::enablePrivateBrowsingForTesting(bool enable)1695 {1696 if (enable)1697 ensureLegacyPrivateBrowsingSessionInNetworkProcess();1698 1699 Vector<PageIdentifier> pageIDs;1700 for (auto& page : m_pageMap) {1701 if (page.value)1702 pageIDs.append(page.key);1703 }1704 1705 if (!pageIDs.isEmpty())1706 ensureNetworkProcessConnection().connection().send(Messages::NetworkConnectionToWebProcess::WebProcessSessionChanged(enable ? PAL::SessionID::legacyPrivateSessionID() : PAL::SessionID::defaultSessionID(), pageIDs), 0);1707 1677 } 1708 1678 -
trunk/Source/WebKit/WebProcess/WebProcess.h
r248713 r248734 216 216 StorageAreaMap* storageAreaMap(uint64_t identifier) const; 217 217 218 void enablePrivateBrowsingForTesting(bool);219 220 218 #if PLATFORM(COCOA) 221 219 RetainPtr<CFDataRef> sourceApplicationAuditData() const; -
trunk/Source/WebKit/WebProcess/WebStorage/StorageAreaImpl.cpp
r247555 r248734 34 34 #include <WebCore/SecurityOriginData.h> 35 35 #include <WebCore/Settings.h> 36 #include <WebCore/StorageType.h> 36 37 37 38 namespace WebKit { … … 51 52 StorageAreaImpl::StorageAreaImpl(Ref<StorageAreaMap>&& storageAreaMap) 52 53 : m_storageAreaID(generateStorageAreaID()) 53 , m_storageAreaMap( WTFMove(storageAreaMap))54 , m_storageAreaMap(makeWeakPtr(storageAreaMap.get())) 54 55 { 55 56 } … … 61 62 unsigned StorageAreaImpl::length() 62 63 { 63 return m_storageAreaMap ->length();64 return m_storageAreaMap ? m_storageAreaMap->length() : 0; 64 65 } 65 66 66 67 String StorageAreaImpl::key(unsigned index) 67 68 { 68 return m_storageAreaMap ->key(index);69 return m_storageAreaMap ? m_storageAreaMap->key(index) : nullString(); 69 70 } 70 71 71 72 String StorageAreaImpl::item(const String& key) 72 73 { 73 return m_storageAreaMap->item(key); 74 } 75 76 bool StorageAreaImpl::prewarm() 77 { 78 return m_storageAreaMap->prewarm(); 74 return m_storageAreaMap ? m_storageAreaMap->item(key) : nullString(); 79 75 } 80 76 … … 83 79 ASSERT(!value.isNull()); 84 80 85 m_storageAreaMap->setItem(sourceFrame, this, key, value, quotaException); 81 if (m_storageAreaMap) 82 m_storageAreaMap->setItem(sourceFrame, this, key, value, quotaException); 86 83 } 87 84 88 85 void StorageAreaImpl::removeItem(Frame* sourceFrame, const String& key) 89 86 { 90 m_storageAreaMap->removeItem(sourceFrame, this, key); 87 if (m_storageAreaMap) 88 m_storageAreaMap->removeItem(sourceFrame, this, key); 91 89 } 92 90 93 91 void StorageAreaImpl::clear(Frame* sourceFrame) 94 92 { 95 m_storageAreaMap->clear(sourceFrame, this); 93 if (m_storageAreaMap) 94 m_storageAreaMap->clear(sourceFrame, this); 96 95 } 97 96 98 97 bool StorageAreaImpl::contains(const String& key) 99 98 { 100 return m_storageAreaMap->contains(key); 99 if (m_storageAreaMap) 100 return m_storageAreaMap->contains(key); 101 102 return false; 101 103 } 102 104 103 105 StorageType StorageAreaImpl::storageType() const 104 106 { 105 return m_storageAreaMap->storageType(); 107 if (m_storageAreaMap) 108 return m_storageAreaMap->storageType(); 109 110 // We probably need an Invalid type. 111 return StorageType::Local; 106 112 } 107 113 … … 113 119 void StorageAreaImpl::incrementAccessCount() 114 120 { 115 // Storage access is handled in the UIprocess, so there's nothing to do here.121 // Storage access is handled in the network process, so there's nothing to do here. 116 122 } 117 123 118 124 void StorageAreaImpl::decrementAccessCount() 119 125 { 120 // Storage access is handled in the UIprocess, so there's nothing to do here.126 // Storage access is handled in the network process, so there's nothing to do here. 121 127 } 122 128 … … 127 133 } 128 134 129 const SecurityOriginData& StorageAreaImpl::securityOrigin() const130 {131 return m_storageAreaMap->securityOrigin().data();132 }133 134 135 } // namespace WebKit -
trunk/Source/WebKit/WebProcess/WebStorage/StorageAreaImpl.h
r247555 r248734 29 29 #include <WebCore/StorageArea.h> 30 30 #include <wtf/HashMap.h> 31 #include <wtf/WeakPtr.h> 31 32 32 33 namespace WebCore { … … 61 62 void decrementAccessCount() override; 62 63 void closeDatabaseIfIdle() override; 63 const WebCore::SecurityOriginData& securityOrigin() const override;64 bool prewarm() final;65 64 66 65 uint64_t m_storageAreaID; 67 Ref<StorageAreaMap> m_storageAreaMap;66 WeakPtr<StorageAreaMap> m_storageAreaMap; 68 67 }; 69 68 -
trunk/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.cpp
r247555 r248734 30 30 #include "StorageAreaImpl.h" 31 31 #include "StorageAreaMapMessages.h" 32 #include "StorageManager Messages.h"32 #include "StorageManagerSetMessages.h" 33 33 #include "StorageNamespaceImpl.h" 34 34 #include "WebPage.h" … … 49 49 using namespace WebCore; 50 50 51 static uint64_t generateStorageMapID()52 {53 static uint64_t storageMapID;54 return ++storageMapID;55 }56 57 51 Ref<StorageAreaMap> StorageAreaMap::create(StorageNamespaceImpl* storageNamespace, Ref<WebCore::SecurityOrigin>&& securityOrigin) 58 52 { … … 61 55 62 56 StorageAreaMap::StorageAreaMap(StorageNamespaceImpl* storageNamespace, Ref<WebCore::SecurityOrigin>&& securityOrigin) 63 : m_storageNamespace( *storageNamespace)64 , m_storageMapID( generateStorageMapID())57 : m_storageNamespace(storageNamespace) 58 , m_storageMapID(0) 65 59 , m_storageType(storageNamespace->storageType()) 66 , m_storageNamespaceID(storageNamespace->storageNamespaceID())67 60 , m_quotaInBytes(storageNamespace->quotaInBytes()) 68 61 , m_securityOrigin(WTFMove(securityOrigin)) 69 62 , m_currentSeed(0) 70 63 , m_hasPendingClear(false) 71 , m_hasPendingGetValues(false) 72 { 73 WebProcess::singleton().registerStorageAreaMap(*this); 64 { 74 65 connect(); 75 66 } … … 77 68 StorageAreaMap::~StorageAreaMap() 78 69 { 79 if (m_storageType != StorageType::EphemeralLocal) 80 WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::StorageManager::DestroyStorageMap(m_storageMapID), 0); 81 82 m_storageNamespace->didDestroyStorageAreaMap(*this); 83 84 WebProcess::singleton().unregisterStorageAreaMap(*this); 70 disconnect(); 85 71 } 86 72 … … 123 109 m_pendingValueChanges.add(key); 124 110 125 WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::StorageManager ::SetItem(m_securityOrigin->data(),m_storageMapID, sourceArea->storageAreaID(), m_currentSeed, key, value, sourceFrame->document()->url()), 0);111 WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::StorageManagerSet::SetItem(m_storageMapID, sourceArea->storageAreaID(), m_currentSeed, key, value, sourceFrame->document()->url()), 0); 126 112 } 127 113 … … 139 125 m_pendingValueChanges.add(key); 140 126 141 WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::StorageManager ::RemoveItem(m_securityOrigin->data(),m_storageMapID, sourceArea->storageAreaID(), m_currentSeed, key, sourceFrame->document()->url()), 0);127 WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::StorageManagerSet::RemoveItem(m_storageMapID, sourceArea->storageAreaID(), m_currentSeed, key, sourceFrame->document()->url()), 0); 142 128 } 143 129 144 130 void StorageAreaMap::clear(WebCore::Frame* sourceFrame, StorageAreaImpl* sourceArea) 145 131 { 132 connect(); 133 146 134 resetValues(); 147 135 148 136 m_hasPendingClear = true; 149 137 m_storageMap = StorageMap::create(m_quotaInBytes); 150 WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::StorageManager ::Clear(m_securityOrigin->data(),m_storageMapID, sourceArea->storageAreaID(), m_currentSeed, sourceFrame->document()->url()), 0);138 WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::StorageManagerSet::Clear(m_storageMapID, sourceArea->storageAreaID(), m_currentSeed, sourceFrame->document()->url()), 0); 151 139 } 152 140 … … 164 152 m_pendingValueChanges.clear(); 165 153 m_hasPendingClear = false; 166 m_hasPendingGetValues = false;167 154 m_currentSeed++; 168 155 } … … 179 166 // (This flag does not yet exist). Since loadValuesIfNeeded() ends up being called from within JavaScript code, processing incoming synchronous messages 180 167 // could lead to weird reentrency bugs otherwise. 181 WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::StorageManager ::GetValues(m_storageMapID, m_currentSeed), Messages::StorageManager::GetValues::Reply(values), 0);168 WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::StorageManagerSet::GetValues(m_storageMapID), Messages::StorageManagerSet::GetValues::Reply(values), 0); 182 169 183 170 m_storageMap = StorageMap::create(m_quotaInBytes); 184 171 m_storageMap->importItems(WTFMove(values)); 185 186 // We want to ignore all changes until we get the DidGetValues message.187 m_hasPendingGetValues = true;188 }189 190 bool StorageAreaMap::prewarm()191 {192 if (m_didPrewarm || m_storageMap)193 return false;194 m_didPrewarm = true;195 196 connect();197 WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::StorageManager::Prewarm(m_storageMapID), 0);198 return true;199 }200 201 void StorageAreaMap::didGetValues(uint64_t storageMapSeed)202 {203 if (m_currentSeed != storageMapSeed)204 return;205 206 ASSERT(m_hasPendingGetValues);207 m_hasPendingGetValues = false;208 172 } 209 173 … … 260 224 ASSERT(!m_storageMap || m_storageMap->hasOneRef()); 261 225 262 // There 's a clear pending or getValues pending we don't want to apply any changes until we get the corresponding DidClear/DidGetValuesmessages.263 if (m_hasPendingClear || m_hasPendingGetValues)226 // There is at least one clear pending we don't want to apply any changes until we get the corresponding DidClear messages. 227 if (m_hasPendingClear) 264 228 return; 265 229 … … 306 270 } 307 271 308 if (storageType() == StorageType::Session || storageType() == StorageType::EphemeralLocal)272 if (storageType() == StorageType::Session) 309 273 dispatchSessionStorageEvent(sourceStorageAreaID, key, oldValue, newValue, urlString); 310 274 else … … 319 283 void StorageAreaMap::dispatchSessionStorageEvent(uint64_t sourceStorageAreaID, const String& key, const String& oldValue, const String& newValue, const String& urlString) 320 284 { 321 // Namespace IDs for session storage namespaces a nd ephemeral local storage namespaces are equivalent to web page IDs285 // Namespace IDs for session storage namespaces are equivalent to web page IDs 322 286 // so we can get the right page here. 323 WebPage* webPage = WebProcess::singleton().webPage(makeObjectIdentifier<PageIdentifierType>(m_storageNamespace ID));287 WebPage* webPage = WebProcess::singleton().webPage(makeObjectIdentifier<PageIdentifierType>(m_storageNamespace->storageNamespaceID())); 324 288 if (!webPage) 325 289 return; … … 355 319 Vector<RefPtr<Frame>> frames; 356 320 357 PageGroup& pageGroup = *WebProcess::singleton().webPageGroup(m_storageNamespaceID)->corePageGroup(); 321 // Namespace IDs for local storage namespaces are equivalent to web page group IDs. 322 PageGroup& pageGroup = *WebProcess::singleton().webPageGroup(m_storageNamespace->storageNamespaceID())->corePageGroup(); 358 323 const HashSet<Page*>& pages = pageGroup.pages(); 359 324 for (HashSet<Page*>::const_iterator it = pages.begin(), end = pages.end(); it != end; ++it) { … … 382 347 void StorageAreaMap::connect() 383 348 { 384 if ( !m_isDisconnected)349 if (m_storageMapID) 385 350 return; 386 351 387 352 switch (m_storageType) { 388 353 case StorageType::Local: 389 case StorageType::EphemeralLocal:390 354 case StorageType::TransientLocal: 391 355 if (SecurityOrigin* topLevelOrigin = m_storageNamespace->topLevelOrigin()) 392 WebProcess::singleton().ensureNetworkProcessConnection().connection().send (Messages::StorageManager::CreateTransientLocalStorageMap(m_storageMapID, m_storageNamespace->storageNamespaceID(), topLevelOrigin->data(), m_securityOrigin->data()), 0);356 WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::StorageManagerSet::ConnectToTransientLocalStorageArea(m_storageNamespace->sessionID(), m_storageNamespace->storageNamespaceID(), topLevelOrigin->data(), m_securityOrigin->data()), Messages::StorageManagerSet::ConnectToTransientLocalStorageArea::Reply(m_storageMapID), 0); 393 357 else 394 WebProcess::singleton().ensureNetworkProcessConnection().connection().send (Messages::StorageManager::CreateLocalStorageMap(m_storageMapID, m_storageNamespace->storageNamespaceID(), m_securityOrigin->data()), 0);358 WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::StorageManagerSet::ConnectToLocalStorageArea(m_storageNamespace->sessionID(), m_storageNamespace->storageNamespaceID(), m_securityOrigin->data()), Messages::StorageManagerSet::ConnectToLocalStorageArea::Reply(m_storageMapID), 0); 395 359 break; 396 360 case StorageType::Session: 397 WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::StorageManager::CreateSessionStorageMap(m_storageMapID, m_storageNamespace->storageNamespaceID(), m_securityOrigin->data()), 0); 398 } 399 400 if (m_storageMap) 401 WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::StorageManager::SetItems(m_storageMapID, m_storageMap->items()), 0); 402 m_isDisconnected = false; 361 WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::StorageManagerSet::ConnectToSessionStorageArea(m_storageNamespace->sessionID(), m_storageNamespace->storageNamespaceID(), m_securityOrigin->data()), Messages::StorageManagerSet::ConnectToSessionStorageArea::Reply(m_storageMapID), 0); 362 } 363 364 if (m_storageMapID) 365 WebProcess::singleton().registerStorageAreaMap(*this); 403 366 } 404 367 405 368 void StorageAreaMap::disconnect() 406 369 { 407 m_isDisconnected = true; 408 if (m_storageType == StorageType::Session && m_storageMap) { 409 m_pendingValueChanges.clear(); 410 m_hasPendingClear = false; 411 } else 412 resetValues(); 370 if (!m_storageMapID) 371 return; 372 373 resetValues(); 374 WebProcess::singleton().unregisterStorageAreaMap(*this); 375 376 if (auto networkProcessConnection = WebProcess::singleton().existingNetworkProcessConnection()) 377 networkProcessConnection->connection().send(Messages::StorageManagerSet::DisconnectFromStorageArea(m_storageMapID), 0); 378 379 m_storageMapID = 0; 413 380 } 414 381 -
trunk/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.h
r247555 r248734 33 33 #include <wtf/RefCounted.h> 34 34 #include <wtf/RefPtr.h> 35 #include <wtf/WeakPtr.h> 35 36 36 37 namespace WebCore { … … 44 45 class StorageNamespaceImpl; 45 46 46 class StorageAreaMap : public RefCounted<StorageAreaMap>, private IPC::MessageReceiver {47 class StorageAreaMap : public RefCounted<StorageAreaMap>, private IPC::MessageReceiver, public CanMakeWeakPtr<StorageAreaMap> { 47 48 public: 48 49 static Ref<StorageAreaMap> create(StorageNamespaceImpl*, Ref<WebCore::SecurityOrigin>&&); … … 58 59 void clear(WebCore::Frame* sourceFrame, StorageAreaImpl* sourceArea); 59 60 bool contains(const String& key); 60 bool prewarm();61 61 62 62 // IPC::MessageReceiver … … 72 72 StorageAreaMap(StorageNamespaceImpl*, Ref<WebCore::SecurityOrigin>&&); 73 73 74 void didGetValues(uint64_t storageMapSeed);75 74 void didSetItem(uint64_t storageMapSeed, const String& key, bool quotaError); 76 75 void didRemoveItem(uint64_t storageMapSeed, const String& key); … … 89 88 void dispatchLocalStorageEvent(uint64_t sourceStorageAreaID, const String& key, const String& oldValue, const String& newValue, const String& urlString); 90 89 91 Ref<StorageNamespaceImpl>m_storageNamespace;90 StorageNamespaceImpl* m_storageNamespace; 92 91 93 92 uint64_t m_storageMapID; 94 93 95 94 WebCore::StorageType m_storageType; 96 uint64_t m_storageNamespaceID;97 95 unsigned m_quotaInBytes; 98 96 Ref<WebCore::SecurityOrigin> m_securityOrigin; … … 102 100 uint64_t m_currentSeed; 103 101 bool m_hasPendingClear; 104 bool m_hasPendingGetValues;105 102 HashCountedSet<String> m_pendingValueChanges; 106 107 bool m_isDisconnected { true };108 bool m_didPrewarm { false };109 103 }; 110 104 -
trunk/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.messages.in
r219966 r248734 22 22 23 23 messages -> StorageAreaMap { 24 DidGetValues(uint64_t storageMapSeed)25 24 DidSetItem(uint64_t storageMapSeed, String key, bool quotaException) 26 25 DidRemoveItem(uint64_t storageMapSeed, String key) -
trunk/Source/WebKit/WebProcess/WebStorage/StorageNamespaceImpl.cpp
r246079 r248734 29 29 #include "StorageAreaImpl.h" 30 30 #include "StorageAreaMap.h" 31 #include "StorageManagerSetMessages.h" 31 32 #include "WebPage.h" 32 33 #include "WebPageGroupProxy.h" … … 41 42 using namespace WebCore; 42 43 43 Ref<StorageNamespaceImpl> StorageNamespaceImpl::createSessionStorageNamespace(uint64_t identifier, unsigned quotaInBytes )44 Ref<StorageNamespaceImpl> StorageNamespaceImpl::createSessionStorageNamespace(uint64_t identifier, unsigned quotaInBytes, PAL::SessionID sessionID) 44 45 { 45 return adoptRef(*new StorageNamespaceImpl(StorageType::Session, identifier, nullptr, quotaInBytes ));46 return adoptRef(*new StorageNamespaceImpl(StorageType::Session, identifier, nullptr, quotaInBytes, sessionID)); 46 47 } 47 48 48 Ref<StorageNamespaceImpl> StorageNamespaceImpl::create EphemeralLocalStorageNamespace(uint64_t identifier, unsigned quotaInBytes)49 Ref<StorageNamespaceImpl> StorageNamespaceImpl::createLocalStorageNamespace(uint64_t identifier, unsigned quotaInBytes, PAL::SessionID sessionID) 49 50 { 50 return createLocalStorageNamespace(identifier, quotaInBytes, IsEphemeral::Yes);51 return adoptRef(*new StorageNamespaceImpl(StorageType::Local, identifier, nullptr, quotaInBytes, sessionID)); 51 52 } 52 53 53 Ref<StorageNamespaceImpl> StorageNamespaceImpl::create LocalStorageNamespace(uint64_t identifier, unsigned quotaInBytes, IsEphemeral isEphemeral)54 Ref<StorageNamespaceImpl> StorageNamespaceImpl::createTransientLocalStorageNamespace(uint64_t identifier, WebCore::SecurityOrigin& topLevelOrigin, uint64_t quotaInBytes, PAL::SessionID sessionID) 54 55 { 55 return adoptRef(*new StorageNamespaceImpl( isEphemeral == IsEphemeral::Yes ? StorageType::EphemeralLocal : StorageType::Local, identifier, nullptr, quotaInBytes));56 return adoptRef(*new StorageNamespaceImpl(StorageType::TransientLocal, identifier, &topLevelOrigin, quotaInBytes, sessionID)); 56 57 } 57 58 58 Ref<StorageNamespaceImpl> StorageNamespaceImpl::createTransientLocalStorageNamespace(uint64_t identifier, WebCore::SecurityOrigin& topLevelOrigin, uint64_t quotaInBytes) 59 { 60 return adoptRef(*new StorageNamespaceImpl(StorageType::TransientLocal, identifier, &topLevelOrigin, quotaInBytes)); 61 } 62 63 StorageNamespaceImpl::StorageNamespaceImpl(WebCore::StorageType storageType, uint64_t storageNamespaceID, WebCore::SecurityOrigin* topLevelOrigin, unsigned quotaInBytes) 59 StorageNamespaceImpl::StorageNamespaceImpl(WebCore::StorageType storageType, uint64_t storageNamespaceID, WebCore::SecurityOrigin* topLevelOrigin, unsigned quotaInBytes, PAL::SessionID sessionID) 64 60 : m_storageType(storageType) 65 61 , m_storageNamespaceID(storageNamespaceID) 66 62 , m_topLevelOrigin(topLevelOrigin) 67 63 , m_quotaInBytes(quotaInBytes) 64 , m_sessionID(sessionID) 68 65 { 69 66 } … … 78 75 } 79 76 80 Ref<StorageArea> StorageNamespaceImpl::storageArea(const SecurityOriginData& securityOrigin )77 Ref<StorageArea> StorageNamespaceImpl::storageArea(const SecurityOriginData& securityOriginData) 81 78 { 82 79 RefPtr<StorageAreaMap> map; 83 80 84 auto& slot = m_storageAreaMaps.add(securityOrigin, nullptr).iterator->value; 81 auto securityOrigin = securityOriginData.securityOrigin(); 82 auto& slot = m_storageAreaMaps.add(securityOrigin->data(), nullptr).iterator->value; 85 83 if (!slot) { 86 map = StorageAreaMap::create(this, securityOrigin.securityOrigin());84 map = StorageAreaMap::create(this, WTFMove(securityOrigin)); 87 85 slot = map.get(); 88 86 } else … … 96 94 ASSERT(m_storageNamespaceID); 97 95 98 if ( m_storageType == StorageType::Session)99 return createSessionStorageNamespace(WebPage::fromCorePage(newPage)->pageID().toUInt64(), m_quotaInBytes);96 if (auto networkProcessConnection = WebProcess::singleton().existingNetworkProcessConnection()) 97 networkProcessConnection->connection().send(Messages::StorageManagerSet::CloneSessionStorageNamespace(newPage->sessionID(), m_storageNamespaceID, WebPage::fromCorePage(newPage)->pageID().toUInt64()), 0); 100 98 101 ASSERT(m_storageType == StorageType::EphemeralLocal);102 auto newNamespace = adoptRef(*new StorageNamespaceImpl(m_storageType, m_storageNamespaceID, m_topLevelOrigin.get(), m_quotaInBytes)); 99 return adoptRef(*new StorageNamespaceImpl(m_storageType, WebPage::fromCorePage(newPage)->pageID().toUInt64(), m_topLevelOrigin.get(), m_quotaInBytes, newPage->sessionID())); 100 } 103 101 104 return newNamespace; 102 void StorageNamespaceImpl::setSessionIDForTesting(PAL::SessionID sessionID) 103 { 104 m_sessionID = sessionID; 105 for (auto storageAreaMap : m_storageAreaMaps.values()) 106 storageAreaMap->disconnect(); 105 107 } 106 108 -
trunk/Source/WebKit/WebProcess/WebStorage/StorageNamespaceImpl.h
r246079 r248734 40 40 class StorageNamespaceImpl : public WebCore::StorageNamespace { 41 41 public: 42 static Ref<StorageNamespaceImpl> createSessionStorageNamespace(uint64_t identifier, unsigned quotaInBytes); 43 static Ref<StorageNamespaceImpl> createEphemeralLocalStorageNamespace(uint64_t identifier, unsigned quotaInBytes); 44 45 enum class IsEphemeral : bool { No, Yes }; 46 static Ref<StorageNamespaceImpl> createLocalStorageNamespace(uint64_t identifier, unsigned quotaInBytes, IsEphemeral isEphemeral); 47 static Ref<StorageNamespaceImpl> createTransientLocalStorageNamespace(uint64_t identifier, WebCore::SecurityOrigin& topLevelOrigin, uint64_t quotaInBytes); 42 static Ref<StorageNamespaceImpl> createSessionStorageNamespace(uint64_t identifier, unsigned quotaInBytes, PAL::SessionID); 43 static Ref<StorageNamespaceImpl> createLocalStorageNamespace(uint64_t identifier, unsigned quotaInBytes, PAL::SessionID); 44 static Ref<StorageNamespaceImpl> createTransientLocalStorageNamespace(uint64_t identifier, WebCore::SecurityOrigin& topLevelOrigin, uint64_t quotaInBytes, PAL::SessionID); 48 45 49 46 virtual ~StorageNamespaceImpl(); … … 53 50 WebCore::SecurityOrigin* topLevelOrigin() const { return m_topLevelOrigin.get(); } 54 51 unsigned quotaInBytes() const { return m_quotaInBytes; } 52 PAL::SessionID sessionID() const override { return m_sessionID; } 55 53 56 54 void didDestroyStorageAreaMap(StorageAreaMap&); 57 55 56 void setSessionIDForTesting(PAL::SessionID) override; 57 58 58 private: 59 explicit StorageNamespaceImpl(WebCore::StorageType, uint64_t storageNamespaceID, WebCore::SecurityOrigin* topLevelOrigin, unsigned quotaInBytes );59 explicit StorageNamespaceImpl(WebCore::StorageType, uint64_t storageNamespaceID, WebCore::SecurityOrigin* topLevelOrigin, unsigned quotaInBytes, PAL::SessionID); 60 60 61 61 Ref<WebCore::StorageArea> storageArea(const WebCore::SecurityOriginData&) override; … … 70 70 const unsigned m_quotaInBytes; 71 71 72 HashMap<WebCore::SecurityOriginData, StorageAreaMap*> m_storageAreaMaps; 72 PAL::SessionID m_sessionID; 73 74 HashMap<WebCore::SecurityOriginData, RefPtr<StorageAreaMap>> m_storageAreaMaps; 73 75 }; 74 76 -
trunk/Source/WebKit/WebProcess/WebStorage/WebStorageNamespaceProvider.cpp
r246079 r248734 68 68 Ref<WebCore::StorageNamespace> WebStorageNamespaceProvider::createSessionStorageNamespace(Page& page, unsigned quota) 69 69 { 70 return StorageNamespaceImpl::createSessionStorageNamespace(WebPage::fromCorePage(&page)->pageID().toUInt64(), quota );70 return StorageNamespaceImpl::createSessionStorageNamespace(WebPage::fromCorePage(&page)->pageID().toUInt64(), quota, page.sessionID()); 71 71 } 72 72 73 Ref<WebCore::StorageNamespace> WebStorageNamespaceProvider::create EphemeralLocalStorageNamespace(Page& page, unsigned quota)73 Ref<WebCore::StorageNamespace> WebStorageNamespaceProvider::createLocalStorageNamespace(unsigned quota, PAL::SessionID sessionID) 74 74 { 75 return StorageNamespaceImpl::create EphemeralLocalStorageNamespace(WebPage::fromCorePage(&page)->pageID().toUInt64(), quota);75 return StorageNamespaceImpl::createLocalStorageNamespace(m_identifier, quota, sessionID); 76 76 } 77 77 78 Ref<WebCore::StorageNamespace> WebStorageNamespaceProvider::create LocalStorageNamespace(unsigned quota)78 Ref<WebCore::StorageNamespace> WebStorageNamespaceProvider::createTransientLocalStorageNamespace(WebCore::SecurityOrigin& topLevelOrigin, unsigned quota, PAL::SessionID sessionID) 79 79 { 80 return StorageNamespaceImpl::createLocalStorageNamespace(m_identifier, quota, StorageNamespaceImpl::IsEphemeral::No); 81 } 82 83 Ref<WebCore::StorageNamespace> WebStorageNamespaceProvider::createTransientLocalStorageNamespace(WebCore::SecurityOrigin& topLevelOrigin, unsigned quota) 84 { 85 return StorageNamespaceImpl::createTransientLocalStorageNamespace(m_identifier, topLevelOrigin, quota); 80 return StorageNamespaceImpl::createTransientLocalStorageNamespace(m_identifier, topLevelOrigin, quota, sessionID); 86 81 } 87 82 -
trunk/Source/WebKit/WebProcess/WebStorage/WebStorageNamespaceProvider.h
r239535 r248734 39 39 40 40 Ref<WebCore::StorageNamespace> createSessionStorageNamespace(WebCore::Page&, unsigned quota) override; 41 Ref<WebCore::StorageNamespace> createEphemeralLocalStorageNamespace(WebCore::Page&, unsigned quota) override; 42 Ref<WebCore::StorageNamespace> createLocalStorageNamespace(unsigned quota) override; 43 Ref<WebCore::StorageNamespace> createTransientLocalStorageNamespace(WebCore::SecurityOrigin&, unsigned quota) override; 41 Ref<WebCore::StorageNamespace> createLocalStorageNamespace(unsigned quota, PAL::SessionID) override; 42 Ref<WebCore::StorageNamespace> createTransientLocalStorageNamespace(WebCore::SecurityOrigin&, unsigned quota, PAL::SessionID) override; 44 43 45 44 const uint64_t m_identifier; -
trunk/Source/WebKitLegacy/ChangeLog
r248699 r248734 1 2019-08-15 Sihui Liu <sihui_liu@apple.com> 2 3 Some improvements on web storage 4 https://bugs.webkit.org/show_bug.cgi?id=200373 5 6 Reviewed by Geoffrey Garen. 7 8 Do some clean-up and add support for session change of web storage in layout tests. 9 10 * Storage/StorageAreaImpl.cpp: 11 (WebKit::StorageAreaImpl::sessionChanged): 12 * Storage/StorageAreaImpl.h: 13 (): Deleted. 14 15 * Storage/StorageAreaSync.h: make sure StorageAreaSync is destructed on the main thread, as it can be 16 dereferenced in StorageAreaImpl::sessionChanged and its last reference for final sync could be released on the 17 background thread. 18 19 * Storage/StorageNamespaceImpl.cpp: replace EphemeralLocalStorage with LocalStorage, and store SessionID in 20 StorageNamespace. 21 (WebKit::StorageNamespaceImpl::createSessionStorageNamespace): 22 (WebKit::StorageNamespaceImpl::getOrCreateLocalStorageNamespace): 23 (WebKit::StorageNamespaceImpl::StorageNamespaceImpl): 24 (WebKit::StorageNamespaceImpl::copy): 25 (WebKit::StorageNamespaceImpl::close): 26 (WebKit::StorageNamespaceImpl::setSessionIDForTesting): 27 (WebKit::StorageNamespaceImpl::createEphemeralLocalStorageNamespace): Deleted. 28 * Storage/StorageNamespaceImpl.h: 29 * Storage/WebStorageNamespaceProvider.cpp: 30 (WebKit::WebStorageNamespaceProvider::createSessionStorageNamespace): 31 (WebKit::WebStorageNamespaceProvider::createLocalStorageNamespace): 32 (WebKit::WebStorageNamespaceProvider::createTransientLocalStorageNamespace): 33 (WebKit::WebStorageNamespaceProvider::createEphemeralLocalStorageNamespace): Deleted. 34 * Storage/WebStorageNamespaceProvider.h: 35 1 36 2019-08-14 Ryan Haddad <ryanhaddad@apple.com> 2 37 -
trunk/Source/WebKitLegacy/Storage/StorageAreaImpl.cpp
r247486 r248734 293 293 } 294 294 295 void StorageAreaImpl::sessionChanged(bool isNewSessionPersistent) 296 { 297 ASSERT(isMainThread()); 298 299 unsigned quota = m_storageMap->quota(); 300 m_storageMap = StorageMap::create(quota); 301 302 if (isNewSessionPersistent && !m_storageAreaSync && m_storageSyncManager) { 303 m_storageAreaSync = StorageAreaSync::create(m_storageSyncManager.get(), *this, m_securityOrigin.databaseIdentifier()); 304 return; 305 } 306 307 if (!isNewSessionPersistent && m_storageAreaSync) { 308 m_storageAreaSync->scheduleFinalSync(); 309 m_storageAreaSync = nullptr; 310 } 311 } 312 295 313 } // namespace WebCore -
trunk/Source/WebKitLegacy/Storage/StorageAreaImpl.h
r247486 r248734 62 62 void closeDatabaseIfIdle() override; 63 63 64 const WebCore::SecurityOriginData& securityOrigin() const override { return m_securityOrigin; }65 66 64 Ref<StorageAreaImpl> copy(); 67 65 void close(); … … 74 72 75 73 void sync(); 74 75 void sessionChanged(bool isNewSessionPersistent); 76 76 77 77 private: -
trunk/Source/WebKitLegacy/Storage/StorageAreaSync.h
r208499 r248734 40 40 class StorageAreaImpl; 41 41 42 class StorageAreaSync : public ThreadSafeRefCounted<StorageAreaSync > {42 class StorageAreaSync : public ThreadSafeRefCounted<StorageAreaSync, WTF::DestructionThread::Main> { 43 43 public: 44 44 static Ref<StorageAreaSync> create(RefPtr<WebCore::StorageSyncManager>&&, Ref<StorageAreaImpl>&&, const String& databaseIdentifier); -
trunk/Source/WebKitLegacy/Storage/StorageNamespaceImpl.cpp
r239535 r248734 46 46 } 47 47 48 Ref<StorageNamespaceImpl> StorageNamespaceImpl::createSessionStorageNamespace(unsigned quota )48 Ref<StorageNamespaceImpl> StorageNamespaceImpl::createSessionStorageNamespace(unsigned quota, PAL::SessionID sessionID) 49 49 { 50 return adoptRef(*new StorageNamespaceImpl(StorageType::Session, String(), quota ));50 return adoptRef(*new StorageNamespaceImpl(StorageType::Session, String(), quota, sessionID)); 51 51 } 52 52 53 Ref<StorageNamespaceImpl> StorageNamespaceImpl::createEphemeralLocalStorageNamespace(unsigned quota) 54 { 55 return adoptRef(*new StorageNamespaceImpl(StorageType::EphemeralLocal, String(), quota)); 56 } 57 58 Ref<StorageNamespaceImpl> StorageNamespaceImpl::getOrCreateLocalStorageNamespace(const String& databasePath, unsigned quota) 53 Ref<StorageNamespaceImpl> StorageNamespaceImpl::getOrCreateLocalStorageNamespace(const String& databasePath, unsigned quota, PAL::SessionID sessionID) 59 54 { 60 55 ASSERT(!databasePath.isNull()); … … 64 59 return *slot; 65 60 66 Ref<StorageNamespaceImpl> storageNamespace = adoptRef(*new StorageNamespaceImpl(StorageType::Local, databasePath, quota ));61 Ref<StorageNamespaceImpl> storageNamespace = adoptRef(*new StorageNamespaceImpl(StorageType::Local, databasePath, quota, sessionID)); 67 62 slot = storageNamespace.ptr(); 68 63 … … 70 65 } 71 66 72 StorageNamespaceImpl::StorageNamespaceImpl(StorageType storageType, const String& path, unsigned quota )67 StorageNamespaceImpl::StorageNamespaceImpl(StorageType storageType, const String& path, unsigned quota, PAL::SessionID sessionID) 73 68 : m_storageType(storageType) 74 69 , m_path(path.isolatedCopy()) … … 76 71 , m_quota(quota) 77 72 , m_isShutdown(false) 73 , m_sessionID(sessionID) 78 74 { 79 75 if (isPersistentLocalStorage(m_storageType) && !m_path.isEmpty()) … … 98 94 ASSERT(isMainThread()); 99 95 ASSERT(!m_isShutdown); 100 ASSERT(m_storageType == StorageType::Session || m_storageType == StorageType::EphemeralLocal);96 ASSERT(m_storageType == StorageType::Session); 101 97 102 auto newNamespace = adoptRef(*new StorageNamespaceImpl(m_storageType, m_path, m_quota ));98 auto newNamespace = adoptRef(*new StorageNamespaceImpl(m_storageType, m_path, m_quota, m_sessionID)); 103 99 for (auto& iter : m_storageAreaMap) 104 100 newNamespace->m_storageAreaMap.set(iter.key, iter.value->copy()); … … 128 124 129 125 // If we're not a persistent storage, we shouldn't need to do any work here. 130 if (m_storageType == StorageType::Session || m_storageType == StorageType::EphemeralLocal) {126 if (m_storageType == StorageType::Session) { 131 127 ASSERT(!m_syncManager); 132 128 return; … … 177 173 } 178 174 175 void StorageNamespaceImpl::setSessionIDForTesting(PAL::SessionID sessionID) 176 { 177 m_sessionID = sessionID; 178 for (auto storageAreaMap : m_storageAreaMap.values()) 179 storageAreaMap->sessionChanged(!sessionID.isEphemeral()); 180 } 181 179 182 } // namespace WebCore -
trunk/Source/WebKitLegacy/Storage/StorageNamespaceImpl.h
r239535 r248734 29 29 #include <WebCore/StorageArea.h> 30 30 #include <WebCore/StorageNamespace.h> 31 #include <pal/SessionID.h> 31 32 #include <wtf/HashMap.h> 32 33 #include <wtf/RefPtr.h> … … 39 40 class StorageNamespaceImpl : public WebCore::StorageNamespace { 40 41 public: 41 static Ref<StorageNamespaceImpl> createSessionStorageNamespace(unsigned quota); 42 static Ref<StorageNamespaceImpl> createEphemeralLocalStorageNamespace(unsigned quota); 43 static Ref<StorageNamespaceImpl> getOrCreateLocalStorageNamespace(const String& databasePath, unsigned quota); 42 static Ref<StorageNamespaceImpl> createSessionStorageNamespace(unsigned quota, PAL::SessionID); 43 static Ref<StorageNamespaceImpl> getOrCreateLocalStorageNamespace(const String& databasePath, unsigned quota, PAL::SessionID); 44 44 virtual ~StorageNamespaceImpl(); 45 45 … … 55 55 void closeIdleLocalStorageDatabases(); 56 56 57 PAL::SessionID sessionID() const override { return m_sessionID; } 58 void setSessionIDForTesting(PAL::SessionID) override; 59 57 60 private: 58 StorageNamespaceImpl(WebCore::StorageType, const String& path, unsigned quota );61 StorageNamespaceImpl(WebCore::StorageType, const String& path, unsigned quota, PAL::SessionID); 59 62 60 63 Ref<WebCore::StorageArea> storageArea(const WebCore::SecurityOriginData&) override; … … 74 77 75 78 bool m_isShutdown; 79 80 PAL::SessionID m_sessionID; 76 81 }; 77 82 -
trunk/Source/WebKitLegacy/Storage/WebStorageNamespaceProvider.cpp
r239535 r248734 27 27 28 28 #include "StorageNamespaceImpl.h" 29 #include <WebCore/Page.h> 29 30 #include <wtf/NeverDestroyed.h> 30 31 … … 97 98 } 98 99 99 Ref<StorageNamespace> WebStorageNamespaceProvider::createSessionStorageNamespace(Page& , unsigned quota)100 Ref<StorageNamespace> WebStorageNamespaceProvider::createSessionStorageNamespace(Page& page, unsigned quota) 100 101 { 101 return StorageNamespaceImpl::createSessionStorageNamespace(quota );102 return StorageNamespaceImpl::createSessionStorageNamespace(quota, page.sessionID()); 102 103 } 103 104 104 Ref<StorageNamespace> WebStorageNamespaceProvider::create EphemeralLocalStorageNamespace(Page&, unsigned quota)105 Ref<StorageNamespace> WebStorageNamespaceProvider::createLocalStorageNamespace(unsigned quota, PAL::SessionID sessionID) 105 106 { 106 return StorageNamespaceImpl:: createEphemeralLocalStorageNamespace(quota);107 return StorageNamespaceImpl::getOrCreateLocalStorageNamespace(m_localStorageDatabasePath, quota, sessionID); 107 108 } 108 109 109 Ref<StorageNamespace> WebStorageNamespaceProvider::createLocalStorageNamespace(unsigned quota) 110 { 111 return StorageNamespaceImpl::getOrCreateLocalStorageNamespace(m_localStorageDatabasePath, quota); 112 } 113 114 Ref<StorageNamespace> WebStorageNamespaceProvider::createTransientLocalStorageNamespace(SecurityOrigin&, unsigned quota) 110 Ref<StorageNamespace> WebStorageNamespaceProvider::createTransientLocalStorageNamespace(SecurityOrigin&, unsigned quota, PAL::SessionID sessionID) 115 111 { 116 112 // FIXME: A smarter implementation would create a special namespace type instead of just piggy-backing off 117 113 // SessionStorageNamespace here. 118 return StorageNamespaceImpl::createSessionStorageNamespace(quota );114 return StorageNamespaceImpl::createSessionStorageNamespace(quota, sessionID); 119 115 } 120 116 -
trunk/Source/WebKitLegacy/Storage/WebStorageNamespaceProvider.h
r239535 r248734 51 51 52 52 Ref<WebCore::StorageNamespace> createSessionStorageNamespace(WebCore::Page&, unsigned quota) override; 53 Ref<WebCore::StorageNamespace> createEphemeralLocalStorageNamespace(WebCore::Page&, unsigned quota) override; 54 Ref<WebCore::StorageNamespace> createLocalStorageNamespace(unsigned quota) override; 55 Ref<WebCore::StorageNamespace> createTransientLocalStorageNamespace(WebCore::SecurityOrigin&, unsigned quota) override; 53 Ref<WebCore::StorageNamespace> createLocalStorageNamespace(unsigned quota, PAL::SessionID) override; 54 Ref<WebCore::StorageNamespace> createTransientLocalStorageNamespace(WebCore::SecurityOrigin&, unsigned quota, PAL::SessionID) override; 56 55 57 56 const String m_localStorageDatabasePath; -
trunk/Source/WebKitLegacy/mac/ChangeLog
r248728 r248734 1 2019-08-15 Sihui Liu <sihui_liu@apple.com> 2 3 Some improvements on web storage 4 https://bugs.webkit.org/show_bug.cgi?id=200373 5 6 Reviewed by Geoffrey Garen. 7 8 * WebView/WebView.mm: 9 (-[WebView _preferencesChanged:]): notify storageNamespaceProvider about session change. 10 1 11 2019-08-15 Youenn Fablet <youenn@apple.com> 2 12 -
trunk/Source/WebKitLegacy/mac/WebView/WebView.mm
r248697 r248734 2889 2889 2890 2890 _private->page->enableLegacyPrivateBrowsing([preferences privateBrowsingEnabled]); 2891 _private->group->storageNamespaceProvider().enableLegacyPrivateBrowsingForTesting([preferences privateBrowsingEnabled]); 2891 2892 settings.setSansSerifFontFamily([preferences sansSerifFontFamily]); 2892 2893 settings.setSerifFontFamily([preferences serifFontFamily]); -
trunk/Tools/ChangeLog
r248727 r248734 1 2019-08-15 Sihui Liu <sihui_liu@apple.com> 2 3 Some improvements on web storage 4 https://bugs.webkit.org/show_bug.cgi?id=200373 5 6 Reviewed by Geoffrey Garen. 7 8 * TestWebKitAPI/Tests/WebKitCocoa/LocalStoragePersistence.mm: 9 (TEST): update expectation for behavior change. 10 11 * WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl: new SPI to synchronously flush localStorage to 12 database file. 13 * WebKitTestRunner/InjectedBundle/TestRunner.cpp: 14 (WTR::TestRunner::syncLocalStorage): 15 * WebKitTestRunner/InjectedBundle/TestRunner.h: 16 17 * WebKitTestRunner/TestController.cpp: clear local storage between test runs to make each test isolated. 18 (WTR::TestController::resetStateToConsistentValues): 19 (WTR::StorageVoidCallbackContext::StorageVoidCallbackContext): 20 (WTR::StorageVoidCallback): 21 (WTR::TestController::clearIndexedDatabases): 22 (WTR::TestController::clearLocalStorage): 23 (WTR::TestController::syncLocalStorage): 24 (WTR::RemoveAllIndexedDatabasesCallbackContext::RemoveAllIndexedDatabasesCallbackContext): Deleted. Replaced 25 with StorageVoidCallbackContext for general usage. 26 (WTR::RemoveAllIndexedDatabasesCallback): Deleted. Replaced with StorageVoidCallback. 27 (WTR::TestController::ClearIndexedDatabases): Deleted. Use lowercase for consistent style. 28 * WebKitTestRunner/TestController.h: 29 30 * WebKitTestRunner/TestInvocation.cpp: 31 (WTR::TestInvocation::didReceiveSynchronousMessageFromInjectedBundle): add handler for new message 32 SyncLocalStorage. 33 1 34 2019-08-15 Jonathan Bedard <jbedard@apple.com> 2 35 -
trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/LocalStoragePersistence.mm
r248047 r248734 105 105 TestWebKitAPI::Util::run(&readyToContinue); 106 106 107 // If network process crashes, sessionStorage would be lost. 107 108 readyToContinue = false; 108 109 [webView evaluateJavaScript:@"window.sessionStorage.getItem('session')" completionHandler:^(id result, NSError *) { 109 EXPECT_TRUE([ @"storage" isEqualToString:result]);110 EXPECT_TRUE([result isEqual:NSNull.null]); 110 111 readyToContinue = true; 111 112 }]; -
trunk/Tools/WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl
r248699 r248734 143 143 void setDatabaseQuota(unsigned long long quota); 144 144 DOMString pathToLocalResource(DOMString url); 145 void syncLocalStorage(); 145 146 146 147 attribute double databaseDefaultQuota; -
trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp
r248699 r248734 343 343 } 344 344 345 void TestRunner::syncLocalStorage() 346 { 347 WKRetainPtr<WKStringRef> messageName = adoptWK(WKStringCreateWithUTF8CString("SyncLocalStorage")); 348 WKRetainPtr<WKBooleanRef> messageBody = adoptWK(WKBooleanCreate(true)); 349 WKBundlePostSynchronousMessage(InjectedBundle::singleton().bundle(), messageName.get(), messageBody.get(), nullptr); 350 } 351 345 352 void TestRunner::clearAllApplicationCaches() 346 353 { -
trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.h
r248699 r248734 160 160 void setDatabaseQuota(uint64_t); 161 161 JSRetainPtr<JSStringRef> pathToLocalResource(JSStringRef); 162 void syncLocalStorage(); 162 163 163 164 // Application Cache -
trunk/Tools/WebKitTestRunner/TestController.cpp
r248699 r248734 940 940 WKWebsiteDataStoreClearAllDeviceOrientationPermissions(websiteDataStore); 941 941 942 ClearIndexedDatabases();943 942 setIDBPerOriginQuota(50 * MB); 943 944 clearIndexedDatabases(); 945 clearLocalStorage(); 944 946 945 947 clearServiceWorkerRegistrations(); … … 3070 3072 } 3071 3073 3072 struct RemoveAllIndexedDatabasesCallbackContext {3073 explicit RemoveAllIndexedDatabasesCallbackContext(TestController& controller)3074 struct StorageVoidCallbackContext { 3075 explicit StorageVoidCallbackContext(TestController& controller) 3074 3076 : testController(controller) 3075 3077 { … … 3080 3082 }; 3081 3083 3082 static void RemoveAllIndexedDatabasesCallback(void* userData)3083 { 3084 auto* context = static_cast< RemoveAllIndexedDatabasesCallbackContext*>(userData);3084 static void StorageVoidCallback(void* userData) 3085 { 3086 auto* context = static_cast<StorageVoidCallbackContext*>(userData); 3085 3087 context->done = true; 3086 3088 context->testController.notifyDone(); 3087 3089 } 3088 3090 3089 void TestController:: ClearIndexedDatabases()3091 void TestController::clearIndexedDatabases() 3090 3092 { 3091 3093 auto websiteDataStore = WKContextGetWebsiteDataStore(platformContext()); 3092 RemoveAllIndexedDatabasesCallbackContext context(*this); 3093 WKWebsiteDataStoreRemoveAllIndexedDatabases(websiteDataStore, &context, RemoveAllIndexedDatabasesCallback); 3094 StorageVoidCallbackContext context(*this); 3095 WKWebsiteDataStoreRemoveAllIndexedDatabases(websiteDataStore, &context, StorageVoidCallback); 3096 runUntil(context.done, noTimeout); 3097 } 3098 3099 void TestController::clearLocalStorage() 3100 { 3101 auto websiteDataStore = WKContextGetWebsiteDataStore(platformContext()); 3102 StorageVoidCallbackContext context(*this); 3103 WKWebsiteDataStoreRemoveLocalStorage(websiteDataStore, &context, StorageVoidCallback); 3104 runUntil(context.done, noTimeout); 3105 3106 StorageVoidCallbackContext legacyContext(*this); 3107 WKContextClearLegacyPrivateBrowsingLocalStorage(platformContext(), &legacyContext, StorageVoidCallback); 3108 runUntil(legacyContext.done, noTimeout); 3109 } 3110 3111 void TestController::syncLocalStorage() 3112 { 3113 StorageVoidCallbackContext context(*this); 3114 WKContextSyncLocalStorage(platformContext(), &context, StorageVoidCallback); 3094 3115 runUntil(context.done, noTimeout); 3095 3116 } -
trunk/Tools/WebKitTestRunner/TestController.h
r248699 r248734 263 263 void removeAllSessionCredentials(); 264 264 265 void ClearIndexedDatabases(); 265 void clearIndexedDatabases(); 266 void clearLocalStorage(); 267 void syncLocalStorage(); 266 268 267 269 void clearServiceWorkerRegistrations(); -
trunk/Tools/WebKitTestRunner/TestInvocation.cpp
r248699 r248734 1667 1667 } 1668 1668 1669 if (WKStringIsEqualToUTF8CString(messageName, "SyncLocalStorage")) { 1670 TestController::singleton().syncLocalStorage(); 1671 return nullptr; 1672 } 1673 1669 1674 ASSERT_NOT_REACHED(); 1670 1675 return nullptr;
Note:
See TracChangeset
for help on using the changeset viewer.