Changeset 246079 in webkit
- Timestamp:
- Jun 4, 2019, 1:54:31 PM (7 years ago)
- Location:
- trunk
- Files:
-
- 9 edited
-
Source/WebKit/ChangeLog (modified) (1 diff)
-
Source/WebKit/NetworkProcess/WebStorage/StorageManager.cpp (modified) (27 diffs)
-
Source/WebKit/NetworkProcess/WebStorage/StorageManager.h (modified) (2 diffs)
-
Source/WebKit/WebProcess/WebStorage/StorageAreaMap.cpp (modified) (4 diffs)
-
Source/WebKit/WebProcess/WebStorage/StorageNamespaceImpl.cpp (modified) (1 diff)
-
Source/WebKit/WebProcess/WebStorage/StorageNamespaceImpl.h (modified) (1 diff)
-
Source/WebKit/WebProcess/WebStorage/WebStorageNamespaceProvider.cpp (modified) (1 diff)
-
Tools/ChangeLog (modified) (1 diff)
-
Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebsiteDatastore.mm (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r246077 r246079 1 2019-06-04 Sihui Liu <sihui_liu@apple.com> 2 3 WKWebsiteDataStore API fails to fetch web storage data for non-persistent data store 4 https://bugs.webkit.org/show_bug.cgi?id=198317 5 <rdar://problem/51244662> 6 7 Reviewed by Alex Christensen. 8 9 Use LocalStorageNameSpace instead of SessionStorageNameSpace for localStorage in ephemeral session or 10 websiteDataStore. 11 12 Reland r245943 as test has been fixed in r246012. 13 14 * NetworkProcess/WebStorage/StorageManager.cpp: 15 (WebKit::StorageManager::StorageArea::isEphemeral const): 16 (WebKit::StorageManager::StorageArea::removeListener): 17 (WebKit::StorageManager::StorageArea::setItems): 18 (WebKit::StorageManager::StorageArea::openDatabaseAndImportItemsIfNeeded const): 19 (WebKit::StorageManager::LocalStorageNamespace::~LocalStorageNamespace): 20 (WebKit::StorageManager::LocalStorageNamespace::getOrCreateStorageArea): 21 (WebKit::StorageManager::LocalStorageNamespace::clearAllStorageAreas): 22 (WebKit::StorageManager::LocalStorageNamespace::ephemeralOrigins const): 23 (WebKit::StorageManager::LocalStorageNamespace::cloneTo): 24 (WebKit::StorageManager::StorageManager): 25 (WebKit::StorageManager::cloneSessionStorageNamespace): 26 (WebKit::StorageManager::getLocalStorageOrigins): 27 (WebKit::StorageManager::getLocalStorageOriginDetails): 28 (WebKit::StorageManager::deleteLocalStorageEntriesForOrigin): 29 (WebKit::StorageManager::deleteLocalStorageOriginsModifiedSince): 30 (WebKit::StorageManager::deleteLocalStorageEntriesForOrigins): 31 (WebKit::StorageManager::createLocalStorageMap): 32 (WebKit::StorageManager::createTransientLocalStorageMap): 33 (WebKit::StorageManager::createSessionStorageMap): 34 (WebKit::StorageManager::destroyStorageMap): 35 (WebKit::StorageManager::getValues): 36 (WebKit::StorageManager::setItem): 37 (WebKit::StorageManager::removeItem): 38 (WebKit::StorageManager::clear): 39 (WebKit::StorageManager::suspend): 40 (WebKit::StorageManager::resume): 41 (WebKit::StorageManager::StorageArea::isSessionStorage const): Deleted. 42 * NetworkProcess/WebStorage/StorageManager.h: 43 (): Deleted. 44 * WebProcess/WebStorage/StorageAreaMap.cpp: 45 (WebKit::StorageAreaMap::dispatchStorageEvent): 46 (WebKit::StorageAreaMap::dispatchSessionStorageEvent): 47 (WebKit::StorageAreaMap::connect): 48 * WebProcess/WebStorage/StorageNamespaceImpl.cpp: 49 (WebKit::StorageNamespaceImpl::createEphemeralLocalStorageNamespace): 50 (WebKit::StorageNamespaceImpl::createLocalStorageNamespace): 51 * WebProcess/WebStorage/StorageNamespaceImpl.h: 52 * WebProcess/WebStorage/WebStorageNamespaceProvider.cpp: 53 (WebKit::WebStorageNamespaceProvider::createLocalStorageNamespace): 54 1 55 2019-06-04 Alex Christensen <achristensen@apple.com> 2 56 -
trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManager.cpp
r246011 r246079 64 64 void clear(); 65 65 66 bool is SessionStorage() const { return !m_localStorageNamespace; }66 bool isEphemeral() const { return !m_localStorageNamespace; } 67 67 68 68 private: … … 73 73 void dispatchEvents(IPC::Connection::UniqueID sourceConnection, uint64_t sourceStorageAreaID, const String& key, const String& oldValue, const String& newValue, const String& urlString) const; 74 74 75 // Will be null if the storage area belongs to a session storage namespace .75 // Will be null if the storage area belongs to a session storage namespace or the storage area is in an ephemeral session. 76 76 LocalStorageNamespace* m_localStorageNamespace; 77 77 mutable RefPtr<LocalStorageDatabase> m_localStorageDatabase; … … 92 92 StorageManager* storageManager() const { return &m_storageManager; } 93 93 94 Ref<StorageArea> getOrCreateStorageArea(SecurityOriginData&&); 94 enum class IsEphemeral : bool { No, Yes }; 95 Ref<StorageArea> getOrCreateStorageArea(SecurityOriginData&&, IsEphemeral); 95 96 void didDestroyStorageArea(StorageArea*); 96 97 97 98 void clearStorageAreasMatchingOrigin(const SecurityOriginData&); 98 99 void clearAllStorageAreas(); 100 101 Vector<SecurityOriginData> ephemeralOrigins() const; 102 void cloneTo(LocalStorageNamespace& newLocalStorageNamespace); 99 103 100 104 private: … … 105 109 unsigned m_quotaInBytes; 106 110 107 // We don't hold an explicit reference to the StorageAreas; they are kept alive by the m_storageAreasByConnection map in StorageManager. 108 HashMap<SecurityOriginData, StorageArea*> m_storageAreaMap; 111 HashMap<SecurityOriginData, RefPtr<StorageArea>> m_storageAreaMap; 109 112 }; 110 113 … … 197 200 void StorageManager::StorageArea::removeListener(IPC::Connection::UniqueID connectionID, uint64_t storageMapID) 198 201 { 199 ASSERT(is SessionStorage() || m_eventListeners.contains(std::make_pair(connectionID, storageMapID)));202 ASSERT(isEphemeral() || m_eventListeners.contains(std::make_pair(connectionID, storageMapID))); 200 203 m_eventListeners.remove(std::make_pair(connectionID, storageMapID)); 201 204 } … … 237 240 void StorageManager::StorageArea::setItems(const HashMap<String, String>& items) 238 241 { 239 ASSERT(!m_localStorageDatabase); 242 // Import items from web process if items are not stored on disk. 243 if (!isEphemeral()) 244 return; 245 240 246 for (auto& item : items) { 241 247 String oldValue; … … 312 318 return; 313 319 320 ASSERT(m_localStorageNamespace->storageManager()->m_localStorageDatabaseTracker); 314 321 // 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. 315 322 if (!m_localStorageDatabase) 316 m_localStorageDatabase = LocalStorageDatabase::create(m_localStorageNamespace->storageManager()->m_queue.copyRef(), m_localStorageNamespace->storageManager()->m_localStorageDatabaseTracker.copyRef(), m_securityOrigin);323 m_localStorageDatabase = LocalStorageDatabase::create(m_localStorageNamespace->storageManager()->m_queue.copyRef(), *m_localStorageNamespace->storageManager()->m_localStorageDatabaseTracker, m_securityOrigin); 317 324 318 325 if (m_didImportItemsFromDatabase) … … 351 358 StorageManager::LocalStorageNamespace::~LocalStorageNamespace() 352 359 { 353 ASSERT(m_storageAreaMap.isEmpty()); 354 } 355 356 auto StorageManager::LocalStorageNamespace::getOrCreateStorageArea(SecurityOriginData&& securityOrigin) -> Ref<StorageArea> 360 } 361 362 auto StorageManager::LocalStorageNamespace::getOrCreateStorageArea(SecurityOriginData&& securityOrigin, IsEphemeral isEphemeral) -> Ref<StorageArea> 357 363 { 358 364 RefPtr<StorageArea> protectedStorageArea; 359 365 return *m_storageAreaMap.ensure(securityOrigin, [&]() mutable { 360 protectedStorageArea = StorageArea::create( this, WTFMove(securityOrigin), m_quotaInBytes);366 protectedStorageArea = StorageArea::create(isEphemeral == IsEphemeral::Yes ? nullptr : this, WTFMove(securityOrigin), m_quotaInBytes); 361 367 return protectedStorageArea.get(); 362 368 }).iterator->value; … … 384 390 void StorageManager::LocalStorageNamespace::clearAllStorageAreas() 385 391 { 386 for (auto *storageArea : m_storageAreaMap.values())392 for (auto storageArea : m_storageAreaMap.values()) 387 393 storageArea->clear(); 394 } 395 396 Vector<SecurityOriginData> StorageManager::LocalStorageNamespace::ephemeralOrigins() const 397 { 398 Vector<SecurityOriginData> origins; 399 for (const auto& storageArea : m_storageAreaMap.values()) { 400 if (!storageArea->items().isEmpty()) 401 origins.append(storageArea->securityOrigin()); 402 } 403 return origins; 404 } 405 406 void StorageManager::LocalStorageNamespace::cloneTo(LocalStorageNamespace& newLocalStorageNamespace) 407 { 408 for (auto& pair : m_storageAreaMap) 409 newLocalStorageNamespace.m_storageAreaMap.add(pair.key, pair.value->clone()); 388 410 } 389 411 … … 484 506 StorageManager::StorageManager(const String& localStorageDirectory) 485 507 : m_queue(WorkQueue::create("com.apple.WebKit.StorageManager")) 486 , m_localStorageDatabaseTracker(LocalStorageDatabaseTracker::create(m_queue.copyRef(), localStorageDirectory))487 , m_isEphemeral(localStorageDirectory.isNull())488 508 { 489 509 // Make sure the encoding is initialized before we start dispatching things to the queue. 490 510 UTF8Encoding(); 511 if (!localStorageDirectory.isNull()) 512 m_localStorageDatabaseTracker = LocalStorageDatabaseTracker::create(m_queue.copyRef(), localStorageDirectory); 491 513 } 492 514 … … 549 571 550 572 sessionStorageNamespace->cloneTo(*newSessionStorageNamespace); 573 574 if (!m_localStorageDatabaseTracker) { 575 if (auto* localStorageNamespace = m_localStorageNamespaces.get(storageNamespaceID)) { 576 LocalStorageNamespace* newlocalStorageNamespace = getOrCreateLocalStorageNamespace(newStorageNamespaceID); 577 localStorageNamespace->cloneTo(*newlocalStorageNamespace); 578 } 579 } 551 580 }); 552 581 } … … 630 659 HashSet<SecurityOriginData> origins; 631 660 632 for (auto& origin : m_localStorageDatabaseTracker->origins()) 633 origins.add(origin); 661 if (m_localStorageDatabaseTracker) { 662 for (auto& origin : m_localStorageDatabaseTracker->origins()) 663 origins.add(origin); 664 } else { 665 for (const auto& localStorageNameSpace : m_localStorageNamespaces.values()) { 666 for (auto& origin : localStorageNameSpace->ephemeralOrigins()) 667 origins.add(origin); 668 } 669 } 634 670 635 671 for (auto& transientLocalStorageNamespace : m_transientLocalStorageNamespaces.values()) { … … 647 683 { 648 684 m_queue->dispatch([this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)]() mutable { 649 auto originDetails = m_localStorageDatabaseTracker->originDetails(); 685 Vector<LocalStorageDatabaseTracker::OriginDetails> originDetails; 686 if (m_localStorageDatabaseTracker) 687 originDetails = m_localStorageDatabaseTracker->originDetails(); 650 688 651 689 RunLoop::main().dispatch([originDetails = WTFMove(originDetails), completionHandler = WTFMove(completionHandler)]() mutable { … … 664 702 transientLocalStorageNamespace->clearStorageAreasMatchingOrigin(copiedOrigin); 665 703 666 m_localStorageDatabaseTracker->deleteDatabaseWithOrigin(copiedOrigin); 704 if (m_localStorageDatabaseTracker) 705 m_localStorageDatabaseTracker->deleteDatabaseWithOrigin(copiedOrigin); 667 706 }); 668 707 } … … 671 710 { 672 711 m_queue->dispatch([this, protectedThis = makeRef(*this), time, completionHandler = WTFMove(completionHandler)]() mutable { 673 auto originsToDelete = m_localStorageDatabaseTracker->databasesModifiedSince(time); 674 675 for (auto& transientLocalStorageNamespace : m_transientLocalStorageNamespaces.values()) 676 transientLocalStorageNamespace->clearAllStorageAreas(); 677 678 for (const auto& origin : originsToDelete) { 712 if (m_localStorageDatabaseTracker) { 713 auto originsToDelete = m_localStorageDatabaseTracker->databasesModifiedSince(time); 714 715 for (auto& transientLocalStorageNamespace : m_transientLocalStorageNamespaces.values()) 716 transientLocalStorageNamespace->clearAllStorageAreas(); 717 718 for (const auto& origin : originsToDelete) { 719 for (auto& localStorageNamespace : m_localStorageNamespaces.values()) 720 localStorageNamespace->clearStorageAreasMatchingOrigin(origin); 721 722 m_localStorageDatabaseTracker->deleteDatabaseWithOrigin(origin); 723 } 724 } else { 679 725 for (auto& localStorageNamespace : m_localStorageNamespaces.values()) 680 localStorageNamespace->clearStorageAreasMatchingOrigin(origin); 681 682 m_localStorageDatabaseTracker->deleteDatabaseWithOrigin(origin); 726 localStorageNamespace->clearAllStorageAreas(); 683 727 } 684 728 … … 703 747 transientLocalStorageNamespace->clearStorageAreasMatchingOrigin(origin); 704 748 705 m_localStorageDatabaseTracker->deleteDatabaseWithOrigin(origin); 749 if (m_localStorageDatabaseTracker) 750 m_localStorageDatabaseTracker->deleteDatabaseWithOrigin(origin); 706 751 } 707 752 … … 713 758 { 714 759 m_queue->dispatch([this, protectedThis = makeRef(*this), connectionID = connection.uniqueID(), storageMapID, storageNamespaceID, securityOriginData = securityOriginData.isolatedCopy()]() mutable { 715 ASSERT(!m_isEphemeral);716 760 std::pair<IPC::Connection::UniqueID, uint64_t> connectionAndStorageMapIDPair(connectionID, storageMapID); 717 761 … … 725 769 ASSERT(localStorageNamespace); 726 770 727 auto storageArea = localStorageNamespace->getOrCreateStorageArea(WTFMove(securityOriginData) );771 auto storageArea = localStorageNamespace->getOrCreateStorageArea(WTFMove(securityOriginData), m_localStorageDatabaseTracker ? StorageManager::LocalStorageNamespace::IsEphemeral::No : StorageManager::LocalStorageNamespace::IsEphemeral::Yes); 728 772 storageArea->addListener(connectionID, storageMapID); 729 773 … … 743 787 continue; 744 788 Ref<StorageArea> area = *it->value; 745 if (!area->is SessionStorage())789 if (!area->isEphemeral()) 746 790 continue; 747 791 if (!origin.securityOrigin()->isSameSchemeHostPort(area->securityOrigin().securityOrigin().get())) … … 773 817 { 774 818 m_queue->dispatch([this, protectedThis = makeRef(*this), connectionID = connection.uniqueID(), storageMapID, storageNamespaceID, securityOriginData = securityOriginData.isolatedCopy()]() mutable { 775 if (m_isEphemeral) {776 m_ephemeralStorage.add(securityOriginData, WebCore::StorageMap::create(localStorageDatabaseQuotaInBytes));777 return;778 }779 780 819 ASSERT(m_sessionStorageNamespaces.isValidKey(storageNamespaceID)); 781 820 … … 815 854 816 855 // Don't remove session storage maps. The web process may reconnect and expect the data to still be around. 817 if (it->value->is SessionStorage())856 if (it->value->isEphemeral()) 818 857 return; 819 858 … … 833 872 m_queue->dispatch([this, protectedThis = makeRef(*this), connection = makeRef(connection), securityOriginData = securityOriginData.isolatedCopy(), storageMapID, storageMapSeed, completionHandler = WTFMove(completionHandler)]() mutable { 834 873 auto* storageArea = findStorageArea(connection.get(), storageMapID); 835 if (!storageArea) { 836 if (m_isEphemeral) { 837 if (auto storageMap = m_ephemeralStorage.get(securityOriginData)) 838 return didGetValues(connection.get(), storageMapID, storageMap->items(), WTFMove(completionHandler)); 839 } 840 // This is a session storage area for a page that has already been closed. Ignore it. 874 875 // This is a session storage area for a page that has already been closed. Ignore it. 876 if (!storageArea) 841 877 return didGetValues(connection.get(), storageMapID, { }, WTFMove(completionHandler)); 842 } 878 843 879 didGetValues(connection.get(), storageMapID, storageArea->items(), WTFMove(completionHandler)); 844 880 connection->send(Messages::StorageAreaMap::DidGetValues(storageMapSeed), storageMapID); … … 850 886 m_queue->dispatch([this, protectedThis = makeRef(*this), connection = makeRef(connection), securityOriginData = securityOriginData.isolatedCopy(), storageMapID, sourceStorageAreaID, storageMapSeed, key = key.isolatedCopy(), value = value.isolatedCopy(), urlString = urlString.isolatedCopy()]() mutable { 851 887 auto* storageArea = findStorageArea(connection.get(), storageMapID); 852 if (!storageArea) { 853 if (m_isEphemeral) { 854 if (auto storageMap = m_ephemeralStorage.get(securityOriginData)) { 855 String oldValue; 856 bool quotaException; 857 storageMap->setItem(key, value, oldValue, quotaException); 858 } 859 } 860 // This is a session storage area for a page that has already been closed. Ignore it. 888 889 // This is a session storage area for a page that has already been closed. Ignore it. 890 if (!storageArea) 861 891 return; 862 }863 892 864 893 bool quotaError; … … 880 909 m_queue->dispatch([this, protectedThis = makeRef(*this), connection = makeRef(connection), securityOriginData = securityOriginData.isolatedCopy(), storageMapID, sourceStorageAreaID, storageMapSeed, key = key.isolatedCopy(), urlString = urlString.isolatedCopy()]() mutable { 881 910 auto* storageArea = findStorageArea(connection.get(), storageMapID); 882 if (!storageArea) { 883 if (m_isEphemeral) { 884 if (auto storageMap = m_ephemeralStorage.get(securityOriginData)) { 885 String oldValue; 886 storageMap->removeItem(key, oldValue); 887 } 888 } 889 // This is a session storage area for a page that has already been closed. Ignore it. 911 912 // This is a session storage area for a page that has already been closed. Ignore it. 913 if (!storageArea) 890 914 return; 891 }892 915 893 916 storageArea->removeItem(connection->uniqueID(), sourceStorageAreaID, key, urlString); … … 900 923 m_queue->dispatch([this, protectedThis = makeRef(*this), connection = makeRef(connection), securityOriginData = securityOriginData.isolatedCopy(), storageMapID, sourceStorageAreaID, storageMapSeed, urlString = urlString.isolatedCopy()]() mutable { 901 924 auto* storageArea = findStorageArea(connection.get(), storageMapID); 902 if (!storageArea) { 903 if (m_isEphemeral) 904 m_ephemeralStorage.remove(securityOriginData); 905 // This is a session storage area for a page that has already been closed. Ignore it. 925 926 // This is a session storage area for a page that has already been closed. Ignore it. 927 if (!storageArea) 906 928 return; 907 }908 929 909 930 storageArea->clear(connection->uniqueID(), sourceStorageAreaID, urlString); … … 932 953 void StorageManager::suspend(CompletionHandler<void()>&& completionHandler) 933 954 { 934 if ( m_isEphemeral)955 if (!m_localStorageDatabaseTracker) 935 956 return; 936 957 … … 957 978 void StorageManager::resume() 958 979 { 959 if ( m_isEphemeral)980 if (!m_localStorageDatabaseTracker) 960 981 return; 961 982 -
trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManager.h
r245978 r246079 104 104 Ref<WorkQueue> m_queue; 105 105 106 Ref <LocalStorageDatabaseTracker> m_localStorageDatabaseTracker;106 RefPtr<LocalStorageDatabaseTracker> m_localStorageDatabaseTracker; 107 107 HashMap<uint64_t, RefPtr<LocalStorageNamespace>> m_localStorageNamespaces; 108 108 … … 113 113 114 114 HashMap<std::pair<IPC::Connection::UniqueID, uint64_t>, RefPtr<StorageArea>> m_storageAreasByConnection; 115 116 HashMap<WebCore::SecurityOriginData, Ref<WebCore::StorageMap>> m_ephemeralStorage;117 bool m_isEphemeral { false };118 115 119 116 enum class State { -
trunk/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.cpp
r245978 r246079 295 295 } 296 296 297 if (storageType() == StorageType::Session )297 if (storageType() == StorageType::Session || storageType() == StorageType::EphemeralLocal) 298 298 dispatchSessionStorageEvent(sourceStorageAreaID, key, oldValue, newValue, urlString); 299 299 else … … 308 308 void StorageAreaMap::dispatchSessionStorageEvent(uint64_t sourceStorageAreaID, const String& key, const String& oldValue, const String& newValue, const String& urlString) 309 309 { 310 ASSERT(storageType() == StorageType::Session); 311 312 // Namespace IDs for session storage namespaces are equivalent to web page IDs 310 // Namespace IDs for session storage namespaces and ephemeral local storage namespaces are equivalent to web page IDs 313 311 // so we can get the right page here. 314 312 WebPage* webPage = WebProcess::singleton().webPage(makeObjectIdentifier<PageIdentifierType>(m_storageNamespaceID)); … … 378 376 switch (m_storageType) { 379 377 case StorageType::Local: 378 case StorageType::EphemeralLocal: 380 379 case StorageType::TransientLocal: 381 380 if (SecurityOrigin* topLevelOrigin = m_storageNamespace->topLevelOrigin()) … … 386 385 case StorageType::Session: 387 386 WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::StorageManager::CreateSessionStorageMap(m_storageMapID, m_storageNamespace->storageNamespaceID(), m_securityOrigin->data()), 0); 388 if (m_storageMap) 389 WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::StorageManager::SetItems(m_storageMapID, m_storageMap->items()), 0); 390 break; 391 case StorageType::EphemeralLocal: 392 ASSERT_NOT_REACHED(); 393 return; 394 } 395 387 } 388 389 if (m_storageMap) 390 WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::StorageManager::SetItems(m_storageMapID, m_storageMap->items()), 0); 396 391 m_isDisconnected = false; 397 392 } -
trunk/Source/WebKit/WebProcess/WebStorage/StorageNamespaceImpl.cpp
r245978 r246079 48 48 Ref<StorageNamespaceImpl> StorageNamespaceImpl::createEphemeralLocalStorageNamespace(uint64_t identifier, unsigned quotaInBytes) 49 49 { 50 return create SessionStorageNamespace(identifier, quotaInBytes);50 return createLocalStorageNamespace(identifier, quotaInBytes, IsEphemeral::Yes); 51 51 } 52 52 53 Ref<StorageNamespaceImpl> StorageNamespaceImpl::createLocalStorageNamespace(uint64_t identifier, unsigned quotaInBytes )53 Ref<StorageNamespaceImpl> StorageNamespaceImpl::createLocalStorageNamespace(uint64_t identifier, unsigned quotaInBytes, IsEphemeral isEphemeral) 54 54 { 55 return adoptRef(*new StorageNamespaceImpl( StorageType::Local, identifier, nullptr, quotaInBytes));55 return adoptRef(*new StorageNamespaceImpl(isEphemeral == IsEphemeral::Yes ? StorageType::EphemeralLocal : StorageType::Local, identifier, nullptr, quotaInBytes)); 56 56 } 57 57 -
trunk/Source/WebKit/WebProcess/WebStorage/StorageNamespaceImpl.h
r245978 r246079 42 42 static Ref<StorageNamespaceImpl> createSessionStorageNamespace(uint64_t identifier, unsigned quotaInBytes); 43 43 static Ref<StorageNamespaceImpl> createEphemeralLocalStorageNamespace(uint64_t identifier, unsigned quotaInBytes); 44 static Ref<StorageNamespaceImpl> createLocalStorageNamespace(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); 45 47 static Ref<StorageNamespaceImpl> createTransientLocalStorageNamespace(uint64_t identifier, WebCore::SecurityOrigin& topLevelOrigin, uint64_t quotaInBytes); 46 48 -
trunk/Source/WebKit/WebProcess/WebStorage/WebStorageNamespaceProvider.cpp
r245978 r246079 78 78 Ref<WebCore::StorageNamespace> WebStorageNamespaceProvider::createLocalStorageNamespace(unsigned quota) 79 79 { 80 return StorageNamespaceImpl::createLocalStorageNamespace(m_identifier, quota );80 return StorageNamespaceImpl::createLocalStorageNamespace(m_identifier, quota, StorageNamespaceImpl::IsEphemeral::No); 81 81 } 82 82 -
trunk/Tools/ChangeLog
r246076 r246079 1 2019-06-04 Sihui Liu <sihui_liu@apple.com> 2 3 WKWebsiteDataStore API fails to fetch web storage data for non-persistent data store 4 https://bugs.webkit.org/show_bug.cgi?id=198317 5 6 Reviewed by Alex Christensen. 7 8 * TestWebKitAPI/Tests/WebKitCocoa/WKWebsiteDatastore.mm: 9 (TestWebKitAPI::TEST): 10 1 11 2019-06-04 Takashi Komori <Takashi.Komori@sony.com> 2 12 -
trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebsiteDatastore.mm
r245979 r246079 351 351 } 352 352 353 } 353 TEST(WKWebsiteDataStore, FetchNonPersistentWebStorage) 354 { 355 auto nonPersistentDataStore = [WKWebsiteDataStore nonPersistentDataStore]; 356 auto configuration = adoptNS([WKWebViewConfiguration new]); 357 [configuration setWebsiteDataStore:nonPersistentDataStore]; 358 auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]); 359 auto navigationDelegate = adoptNS([[NavigationTestDelegate alloc] init]); 360 [webView setNavigationDelegate:navigationDelegate.get()]; 361 [webView loadHTMLString:@"<script>sessionStorage.setItem('session', 'storage');localStorage.setItem('local', 'storage');</script>" baseURL:[NSURL URLWithString:@"http://localhost"]]; 362 [navigationDelegate waitForDidFinishNavigation]; 363 364 readyToContinue = false; 365 [webView evaluateJavaScript:@"window.sessionStorage.getItem('session')" completionHandler:^(id result, NSError *) { 366 EXPECT_TRUE([@"storage" isEqualToString:result]); 367 readyToContinue = true; 368 }]; 369 TestWebKitAPI::Util::run(&readyToContinue); 370 371 readyToContinue = false; 372 [webView evaluateJavaScript:@"window.localStorage.getItem('local')" completionHandler:^(id result, NSError *) { 373 EXPECT_TRUE([@"storage" isEqualToString:result]); 374 readyToContinue = true; 375 }]; 376 TestWebKitAPI::Util::run(&readyToContinue); 377 378 readyToContinue = false; 379 [nonPersistentDataStore fetchDataRecordsOfTypes:[NSSet setWithObject:WKWebsiteDataTypeSessionStorage] completionHandler:^(NSArray<WKWebsiteDataRecord *> *dataRecords) { 380 EXPECT_EQ((int)dataRecords.count, 1); 381 EXPECT_TRUE([[[dataRecords objectAtIndex:0] displayName] isEqualToString:@"localhost"]); 382 readyToContinue = true; 383 }]; 384 TestWebKitAPI::Util::run(&readyToContinue); 385 386 readyToContinue = false; 387 [nonPersistentDataStore fetchDataRecordsOfTypes:[NSSet setWithObject:WKWebsiteDataTypeLocalStorage] completionHandler:^(NSArray<WKWebsiteDataRecord *> *dataRecords) { 388 EXPECT_EQ((int)dataRecords.count, 1); 389 EXPECT_TRUE([[[dataRecords objectAtIndex:0] displayName] isEqualToString:@"localhost"]); 390 readyToContinue = true; 391 }]; 392 TestWebKitAPI::Util::run(&readyToContinue); 393 } 394 395 }
Note:
See TracChangeset
for help on using the changeset viewer.