Changeset 245943 in webkit
- Timestamp:
- May 30, 2019, 7:19:12 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
r245913 r245943 1 2019-05-30 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 * NetworkProcess/WebStorage/StorageManager.cpp: 13 (WebKit::StorageManager::StorageArea::isEphemeral const): 14 (WebKit::StorageManager::StorageArea::removeListener): 15 (WebKit::StorageManager::StorageArea::setItems): 16 (WebKit::StorageManager::StorageArea::openDatabaseAndImportItemsIfNeeded const): 17 (WebKit::StorageManager::LocalStorageNamespace::~LocalStorageNamespace): 18 (WebKit::StorageManager::LocalStorageNamespace::getOrCreateStorageArea): 19 (WebKit::StorageManager::LocalStorageNamespace::clearAllStorageAreas): 20 (WebKit::StorageManager::LocalStorageNamespace::ephemeralOrigins const): 21 (WebKit::StorageManager::LocalStorageNamespace::cloneTo): 22 (WebKit::StorageManager::StorageManager): 23 (WebKit::StorageManager::cloneSessionStorageNamespace): 24 (WebKit::StorageManager::getLocalStorageOrigins): 25 (WebKit::StorageManager::getLocalStorageOriginDetails): 26 (WebKit::StorageManager::deleteLocalStorageEntriesForOrigin): 27 (WebKit::StorageManager::deleteLocalStorageOriginsModifiedSince): 28 (WebKit::StorageManager::deleteLocalStorageEntriesForOrigins): 29 (WebKit::StorageManager::createLocalStorageMap): 30 (WebKit::StorageManager::createTransientLocalStorageMap): 31 (WebKit::StorageManager::createSessionStorageMap): 32 (WebKit::StorageManager::destroyStorageMap): 33 (WebKit::StorageManager::getValues): 34 (WebKit::StorageManager::setItem): 35 (WebKit::StorageManager::removeItem): 36 (WebKit::StorageManager::clear): 37 (WebKit::StorageManager::suspend): 38 (WebKit::StorageManager::resume): 39 (WebKit::StorageManager::StorageArea::isSessionStorage const): Deleted. 40 * NetworkProcess/WebStorage/StorageManager.h: 41 (): Deleted. 42 * WebProcess/WebStorage/StorageAreaMap.cpp: 43 (WebKit::StorageAreaMap::dispatchStorageEvent): 44 (WebKit::StorageAreaMap::dispatchSessionStorageEvent): 45 (WebKit::StorageAreaMap::connect): 46 * WebProcess/WebStorage/StorageNamespaceImpl.cpp: 47 (WebKit::StorageNamespaceImpl::createEphemeralLocalStorageNamespace): 48 (WebKit::StorageNamespaceImpl::createLocalStorageNamespace): 49 * WebProcess/WebStorage/StorageNamespaceImpl.h: 50 * WebProcess/WebStorage/WebStorageNamespaceProvider.cpp: 51 (WebKit::WebStorageNamespaceProvider::createLocalStorageNamespace): 52 1 53 2019-05-30 Youenn Fablet <youenn@apple.com> 2 54 -
trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManager.cpp
r245904 r245943 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 … … 730 774 ASSERT(localStorageNamespace); 731 775 732 auto storageArea = localStorageNamespace->getOrCreateStorageArea(WTFMove(securityOriginData) );776 auto storageArea = localStorageNamespace->getOrCreateStorageArea(WTFMove(securityOriginData), m_localStorageDatabaseTracker ? StorageManager::LocalStorageNamespace::IsEphemeral::No : StorageManager::LocalStorageNamespace::IsEphemeral::Yes); 733 777 storageArea->addListener(connectionID, storageMapID); 734 778 … … 749 793 continue; 750 794 Ref<StorageArea> area = *it->value; 751 if (!area->is SessionStorage())795 if (!area->isEphemeral()) 752 796 continue; 753 797 if (!origin.securityOrigin()->isSameSchemeHostPort(area->securityOrigin().securityOrigin().get())) … … 781 825 { 782 826 m_queue->dispatch([this, protectedThis = makeRef(*this), connectionID = connection.uniqueID(), storageMapID, storageNamespaceID, securityOriginData = securityOriginData.isolatedCopy()]() mutable { 783 if (m_isEphemeral) {784 m_ephemeralStorage.add(securityOriginData, WebCore::StorageMap::create(localStorageDatabaseQuotaInBytes));785 return;786 }787 827 // FIXME: This should be a message check. 788 828 ASSERT(m_sessionStorageNamespaces.isValidKey(storageNamespaceID)); … … 830 870 831 871 // Don't remove session storage maps. The web process may reconnect and expect the data to still be around. 832 if (it->value->is SessionStorage())872 if (it->value->isEphemeral()) 833 873 return; 834 874 … … 848 888 m_queue->dispatch([this, protectedThis = makeRef(*this), connection = makeRef(connection), securityOriginData = securityOriginData.isolatedCopy(), storageMapID, storageMapSeed, completionHandler = WTFMove(completionHandler)]() mutable { 849 889 auto* storageArea = findStorageArea(connection.get(), storageMapID); 850 if (!storageArea) { 851 if (m_isEphemeral) { 852 if (auto storageMap = m_ephemeralStorage.get(securityOriginData)) 853 return didGetValues(connection.get(), storageMapID, storageMap->items(), WTFMove(completionHandler)); 854 } 855 // This is a session storage area for a page that has already been closed. Ignore it. 890 891 // This is a session storage area for a page that has already been closed. Ignore it. 892 if (!storageArea) 856 893 return didGetValues(connection.get(), storageMapID, { }, WTFMove(completionHandler)); 857 } 894 858 895 didGetValues(connection.get(), storageMapID, storageArea->items(), WTFMove(completionHandler)); 859 896 connection->send(Messages::StorageAreaMap::DidGetValues(storageMapSeed), storageMapID); … … 865 902 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 { 866 903 auto* storageArea = findStorageArea(connection.get(), storageMapID); 867 if (!storageArea) { 868 if (m_isEphemeral) { 869 if (auto storageMap = m_ephemeralStorage.get(securityOriginData)) { 870 String oldValue; 871 bool quotaException; 872 storageMap->setItem(key, value, oldValue, quotaException); 873 } 874 } 875 // This is a session storage area for a page that has already been closed. Ignore it. 904 905 // This is a session storage area for a page that has already been closed. Ignore it. 906 if (!storageArea) 876 907 return; 877 }878 908 879 909 bool quotaError; … … 895 925 m_queue->dispatch([this, protectedThis = makeRef(*this), connection = makeRef(connection), securityOriginData = securityOriginData.isolatedCopy(), storageMapID, sourceStorageAreaID, storageMapSeed, key = key.isolatedCopy(), urlString = urlString.isolatedCopy()]() mutable { 896 926 auto* storageArea = findStorageArea(connection.get(), storageMapID); 897 if (!storageArea) { 898 if (m_isEphemeral) { 899 if (auto storageMap = m_ephemeralStorage.get(securityOriginData)) { 900 String oldValue; 901 storageMap->removeItem(key, oldValue); 902 } 903 } 904 // This is a session storage area for a page that has already been closed. Ignore it. 927 928 // This is a session storage area for a page that has already been closed. Ignore it. 929 if (!storageArea) 905 930 return; 906 }907 931 908 932 storageArea->removeItem(connection->uniqueID(), sourceStorageAreaID, key, urlString); … … 915 939 m_queue->dispatch([this, protectedThis = makeRef(*this), connection = makeRef(connection), securityOriginData = securityOriginData.isolatedCopy(), storageMapID, sourceStorageAreaID, storageMapSeed, urlString = urlString.isolatedCopy()]() mutable { 916 940 auto* storageArea = findStorageArea(connection.get(), storageMapID); 917 if (!storageArea) { 918 if (m_isEphemeral) 919 m_ephemeralStorage.remove(securityOriginData); 920 // This is a session storage area for a page that has already been closed. Ignore it. 941 942 // This is a session storage area for a page that has already been closed. Ignore it. 943 if (!storageArea) 921 944 return; 922 }923 945 924 946 storageArea->clear(connection->uniqueID(), sourceStorageAreaID, urlString); … … 947 969 void StorageManager::suspend(CompletionHandler<void()>&& completionHandler) 948 970 { 949 if ( m_isEphemeral)971 if (!m_localStorageDatabaseTracker) 950 972 return; 951 973 … … 972 994 void StorageManager::resume() 973 995 { 974 if ( m_isEphemeral)996 if (!m_localStorageDatabaseTracker) 975 997 return; 976 998 -
trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManager.h
r245904 r245943 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
r245891 r245943 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
r245891 r245943 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
r245891 r245943 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
r245891 r245943 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
r245912 r245943 1 2019-05-30 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-05-30 Andres Gonzalez <andresg_22@apple.com> 2 12 -
trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebsiteDatastore.mm
r245891 r245943 305 305 } 306 306 307 } 307 TEST(WKWebsiteDataStore, FetchNonPersistentWebStorage) 308 { 309 auto nonPersistentDataStore = [WKWebsiteDataStore nonPersistentDataStore]; 310 auto configuration = adoptNS([WKWebViewConfiguration new]); 311 [configuration setWebsiteDataStore:nonPersistentDataStore]; 312 auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]); 313 auto navigationDelegate = adoptNS([[NavigationTestDelegate alloc] init]); 314 [webView setNavigationDelegate:navigationDelegate.get()]; 315 [webView loadHTMLString:@"<script>sessionStorage.setItem('session', 'storage');localStorage.setItem('local', 'storage');</script>" baseURL:[NSURL URLWithString:@"http://localhost"]]; 316 [navigationDelegate waitForDidFinishNavigation]; 317 318 readyToContinue = false; 319 [webView evaluateJavaScript:@"window.sessionStorage.getItem('session')" completionHandler:^(id result, NSError *) { 320 EXPECT_TRUE([@"storage" isEqualToString:result]); 321 readyToContinue = true; 322 }]; 323 TestWebKitAPI::Util::run(&readyToContinue); 324 325 readyToContinue = false; 326 [webView evaluateJavaScript:@"window.localStorage.getItem('local')" completionHandler:^(id result, NSError *) { 327 EXPECT_TRUE([@"storage" isEqualToString:result]); 328 readyToContinue = true; 329 }]; 330 TestWebKitAPI::Util::run(&readyToContinue); 331 332 readyToContinue = false; 333 [nonPersistentDataStore fetchDataRecordsOfTypes:[NSSet setWithObject:WKWebsiteDataTypeSessionStorage] completionHandler:^(NSArray<WKWebsiteDataRecord *> *dataRecords) { 334 EXPECT_EQ((int)dataRecords.count, 1); 335 EXPECT_TRUE([[[dataRecords objectAtIndex:0] displayName] isEqualToString:@"localhost"]); 336 readyToContinue = true; 337 }]; 338 TestWebKitAPI::Util::run(&readyToContinue); 339 340 readyToContinue = false; 341 [nonPersistentDataStore fetchDataRecordsOfTypes:[NSSet setWithObject:WKWebsiteDataTypeLocalStorage] completionHandler:^(NSArray<WKWebsiteDataRecord *> *dataRecords) { 342 EXPECT_EQ((int)dataRecords.count, 1); 343 EXPECT_TRUE([[[dataRecords objectAtIndex:0] displayName] isEqualToString:@"localhost"]); 344 readyToContinue = true; 345 }]; 346 TestWebKitAPI::Util::run(&readyToContinue); 347 } 348 349 }
Note:
See TracChangeset
for help on using the changeset viewer.