⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 245997 in webkit


Ignore:
Timestamp:
May 31, 2019, 4:25:04 PM (7 years ago)
Author:
Alan Coon
Message:

Revert r245943. rdar://problem/51244662

Location:
branches/safari-608.1.27-branch
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • branches/safari-608.1.27-branch/Source/WebKit/ChangeLog

    r245996 r245997  
     12019-05-31  Alan Coon  <alancoon@apple.com>
     2
     3        Revert r245943. rdar://problem/51244662
     4
    152019-05-31  Alan Coon  <alancoon@apple.com>
    26
  • branches/safari-608.1.27-branch/Source/WebKit/NetworkProcess/WebStorage/StorageManager.cpp

    r245943 r245997  
    6464    void clear();
    6565
    66     bool isEphemeral() const { return !m_localStorageNamespace; }
     66    bool isSessionStorage() const { return !m_localStorageNamespace; }
    6767
    6868private:
     
    7373    void dispatchEvents(IPC::Connection::UniqueID sourceConnection, uint64_t sourceStorageAreaID, const String& key, const String& oldValue, const String& newValue, const String& urlString) const;
    7474
    75     // Will be null if the storage area belongs to a session storage namespace or the storage area is in an ephemeral session.
     75    // Will be null if the storage area belongs to a session storage namespace.
    7676    LocalStorageNamespace* m_localStorageNamespace;
    7777    mutable RefPtr<LocalStorageDatabase> m_localStorageDatabase;
     
    9292    StorageManager* storageManager() const { return &m_storageManager; }
    9393
    94     enum class IsEphemeral : bool { No, Yes };
    95     Ref<StorageArea> getOrCreateStorageArea(SecurityOriginData&&, IsEphemeral);
     94    Ref<StorageArea> getOrCreateStorageArea(SecurityOriginData&&);
    9695    void didDestroyStorageArea(StorageArea*);
    9796
    9897    void clearStorageAreasMatchingOrigin(const SecurityOriginData&);
    9998    void clearAllStorageAreas();
    100 
    101     Vector<SecurityOriginData> ephemeralOrigins() const;
    102     void cloneTo(LocalStorageNamespace& newLocalStorageNamespace);
    10399
    104100private:
     
    109105    unsigned m_quotaInBytes;
    110106
    111     HashMap<SecurityOriginData, RefPtr<StorageArea>> m_storageAreaMap;
     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;
    112109};
    113110
     
    200197void StorageManager::StorageArea::removeListener(IPC::Connection::UniqueID connectionID, uint64_t storageMapID)
    201198{
    202     ASSERT(isEphemeral() || m_eventListeners.contains(std::make_pair(connectionID, storageMapID)));
     199    ASSERT(isSessionStorage() || m_eventListeners.contains(std::make_pair(connectionID, storageMapID)));
    203200    m_eventListeners.remove(std::make_pair(connectionID, storageMapID));
    204201}
     
    240237void StorageManager::StorageArea::setItems(const HashMap<String, String>& items)
    241238{
    242     // Import items from web process if items are not stored on disk.
    243     if (!isEphemeral())
    244         return;
    245 
     239    ASSERT(!m_localStorageDatabase);
    246240    for (auto& item : items) {
    247241        String oldValue;
     
    318312        return;
    319313
    320     ASSERT(m_localStorageNamespace->storageManager()->m_localStorageDatabaseTracker);
    321314    // 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.
    322315    if (!m_localStorageDatabase)
    323         m_localStorageDatabase = LocalStorageDatabase::create(m_localStorageNamespace->storageManager()->m_queue.copyRef(), *m_localStorageNamespace->storageManager()->m_localStorageDatabaseTracker, m_securityOrigin);
     316        m_localStorageDatabase = LocalStorageDatabase::create(m_localStorageNamespace->storageManager()->m_queue.copyRef(), m_localStorageNamespace->storageManager()->m_localStorageDatabaseTracker.copyRef(), m_securityOrigin);
    324317
    325318    if (m_didImportItemsFromDatabase)
     
    358351StorageManager::LocalStorageNamespace::~LocalStorageNamespace()
    359352{
    360 }
    361 
    362 auto StorageManager::LocalStorageNamespace::getOrCreateStorageArea(SecurityOriginData&& securityOrigin, IsEphemeral isEphemeral) -> Ref<StorageArea>
     353    ASSERT(m_storageAreaMap.isEmpty());
     354}
     355
     356auto StorageManager::LocalStorageNamespace::getOrCreateStorageArea(SecurityOriginData&& securityOrigin) -> Ref<StorageArea>
    363357{
    364358    RefPtr<StorageArea> protectedStorageArea;
    365359    return *m_storageAreaMap.ensure(securityOrigin, [&]() mutable {
    366         protectedStorageArea = StorageArea::create(isEphemeral == IsEphemeral::Yes ? nullptr : this, WTFMove(securityOrigin), m_quotaInBytes);
     360        protectedStorageArea = StorageArea::create(this, WTFMove(securityOrigin), m_quotaInBytes);
    367361        return protectedStorageArea.get();
    368362    }).iterator->value;
     
    390384void StorageManager::LocalStorageNamespace::clearAllStorageAreas()
    391385{
    392     for (auto storageArea : m_storageAreaMap.values())
     386    for (auto* storageArea : m_storageAreaMap.values())
    393387        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());
    410388}
    411389
     
    506484StorageManager::StorageManager(const String& localStorageDirectory)
    507485    : m_queue(WorkQueue::create("com.apple.WebKit.StorageManager"))
     486    , m_localStorageDatabaseTracker(LocalStorageDatabaseTracker::create(m_queue.copyRef(), localStorageDirectory))
     487    , m_isEphemeral(localStorageDirectory.isNull())
    508488{
    509489    // Make sure the encoding is initialized before we start dispatching things to the queue.
    510490    UTF8Encoding();
    511     if (!localStorageDirectory.isNull())
    512         m_localStorageDatabaseTracker = LocalStorageDatabaseTracker::create(m_queue.copyRef(), localStorageDirectory);
    513491}
    514492
     
    571549
    572550        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         }
    580551    });
    581552}
     
    659630        HashSet<SecurityOriginData> origins;
    660631
    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         }
     632        for (auto& origin : m_localStorageDatabaseTracker->origins())
     633            origins.add(origin);
    670634
    671635        for (auto& transientLocalStorageNamespace : m_transientLocalStorageNamespaces.values()) {
     
    683647{
    684648    m_queue->dispatch([this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)]() mutable {
    685         Vector<LocalStorageDatabaseTracker::OriginDetails> originDetails;
    686         if (m_localStorageDatabaseTracker)
    687             originDetails = m_localStorageDatabaseTracker->originDetails();
     649        auto originDetails = m_localStorageDatabaseTracker->originDetails();
    688650
    689651        RunLoop::main().dispatch([originDetails = WTFMove(originDetails), completionHandler = WTFMove(completionHandler)]() mutable {
     
    702664            transientLocalStorageNamespace->clearStorageAreasMatchingOrigin(copiedOrigin);
    703665
    704         if (m_localStorageDatabaseTracker)
    705             m_localStorageDatabaseTracker->deleteDatabaseWithOrigin(copiedOrigin);
     666        m_localStorageDatabaseTracker->deleteDatabaseWithOrigin(copiedOrigin);
    706667    });
    707668}
     
    710671{
    711672    m_queue->dispatch([this, protectedThis = makeRef(*this), time, completionHandler = WTFMove(completionHandler)]() mutable {
    712         if (m_localStorageDatabaseTracker) {
    713             auto originsToDelete = m_localStorageDatabaseTracker->databasesModifiedSince(time);
     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) {
     679            for (auto& localStorageNamespace : m_localStorageNamespaces.values())
     680                localStorageNamespace->clearStorageAreasMatchingOrigin(origin);
    714681           
    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 {
    725             for (auto& localStorageNamespace : m_localStorageNamespaces.values())
    726                 localStorageNamespace->clearAllStorageAreas();
     682            m_localStorageDatabaseTracker->deleteDatabaseWithOrigin(origin);
    727683        }
    728684
     
    747703                transientLocalStorageNamespace->clearStorageAreasMatchingOrigin(origin);
    748704
    749             if (m_localStorageDatabaseTracker)
    750                 m_localStorageDatabaseTracker->deleteDatabaseWithOrigin(origin);
     705            m_localStorageDatabaseTracker->deleteDatabaseWithOrigin(origin);
    751706        }
    752707
     
    758713{
    759714    m_queue->dispatch([this, protectedThis = makeRef(*this), connectionID = connection.uniqueID(), storageMapID, storageNamespaceID, securityOriginData = securityOriginData.isolatedCopy()]() mutable {
     715        ASSERT(!m_isEphemeral);
    760716        std::pair<IPC::Connection::UniqueID, uint64_t> connectionAndStorageMapIDPair(connectionID, storageMapID);
    761717
     
    774730        ASSERT(localStorageNamespace);
    775731
    776         auto storageArea = localStorageNamespace->getOrCreateStorageArea(WTFMove(securityOriginData), m_localStorageDatabaseTracker ? StorageManager::LocalStorageNamespace::IsEphemeral::No : StorageManager::LocalStorageNamespace::IsEphemeral::Yes);
     732        auto storageArea = localStorageNamespace->getOrCreateStorageArea(WTFMove(securityOriginData));
    777733        storageArea->addListener(connectionID, storageMapID);
    778734
     
    793749                continue;
    794750            Ref<StorageArea> area = *it->value;
    795             if (!area->isEphemeral())
     751            if (!area->isSessionStorage())
    796752                continue;
    797753            if (!origin.securityOrigin()->isSameSchemeHostPort(area->securityOrigin().securityOrigin().get()))
     
    825781{
    826782    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        }
    827787        // FIXME: This should be a message check.
    828788        ASSERT(m_sessionStorageNamespaces.isValidKey(storageNamespaceID));
     
    870830
    871831        // Don't remove session storage maps. The web process may reconnect and expect the data to still be around.
    872         if (it->value->isEphemeral())
     832        if (it->value->isSessionStorage())
    873833            return;
    874834
     
    888848    m_queue->dispatch([this, protectedThis = makeRef(*this), connection = makeRef(connection), securityOriginData = securityOriginData.isolatedCopy(), storageMapID, storageMapSeed, completionHandler = WTFMove(completionHandler)]() mutable {
    889849        auto* storageArea = findStorageArea(connection.get(), storageMapID);
    890 
    891         // This is a session storage area for a page that has already been closed. Ignore it.
    892         if (!storageArea)
     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.
    893856            return didGetValues(connection.get(), storageMapID, { }, WTFMove(completionHandler));
    894 
     857        }
    895858        didGetValues(connection.get(), storageMapID, storageArea->items(), WTFMove(completionHandler));
    896859        connection->send(Messages::StorageAreaMap::DidGetValues(storageMapSeed), storageMapID);
     
    902865    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 {
    903866        auto* storageArea = findStorageArea(connection.get(), storageMapID);
    904 
    905         // This is a session storage area for a page that has already been closed. Ignore it.
    906         if (!storageArea)
    907             return;
     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.
     876            return;
     877        }
    908878
    909879        bool quotaError;
     
    925895    m_queue->dispatch([this, protectedThis = makeRef(*this), connection = makeRef(connection), securityOriginData = securityOriginData.isolatedCopy(), storageMapID, sourceStorageAreaID, storageMapSeed, key = key.isolatedCopy(), urlString = urlString.isolatedCopy()]() mutable {
    926896        auto* storageArea = findStorageArea(connection.get(), storageMapID);
    927 
    928         // This is a session storage area for a page that has already been closed. Ignore it.
    929         if (!storageArea)
    930             return;
     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.
     905            return;
     906        }
    931907
    932908        storageArea->removeItem(connection->uniqueID(), sourceStorageAreaID, key, urlString);
     
    939915    m_queue->dispatch([this, protectedThis = makeRef(*this), connection = makeRef(connection), securityOriginData = securityOriginData.isolatedCopy(), storageMapID, sourceStorageAreaID, storageMapSeed, urlString = urlString.isolatedCopy()]() mutable {
    940916        auto* storageArea = findStorageArea(connection.get(), storageMapID);
    941 
    942         // This is a session storage area for a page that has already been closed. Ignore it.
    943         if (!storageArea)
    944             return;
     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.
     921            return;
     922        }
    945923
    946924        storageArea->clear(connection->uniqueID(), sourceStorageAreaID, urlString);
     
    969947void StorageManager::suspend(CompletionHandler<void()>&& completionHandler)
    970948{
    971     if (!m_localStorageDatabaseTracker)
     949    if (m_isEphemeral)
    972950        return;
    973951
     
    994972void StorageManager::resume()
    995973{
    996     if (!m_localStorageDatabaseTracker)
     974    if (m_isEphemeral)
    997975        return;
    998976
  • branches/safari-608.1.27-branch/Source/WebKit/NetworkProcess/WebStorage/StorageManager.h

    r245943 r245997  
    104104    Ref<WorkQueue> m_queue;
    105105
    106     RefPtr<LocalStorageDatabaseTracker> m_localStorageDatabaseTracker;
     106    Ref<LocalStorageDatabaseTracker> m_localStorageDatabaseTracker;
    107107    HashMap<uint64_t, RefPtr<LocalStorageNamespace>> m_localStorageNamespaces;
    108108
     
    113113
    114114    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 };
    115118
    116119    enum class State {
  • branches/safari-608.1.27-branch/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.cpp

    r245943 r245997  
    295295    }
    296296
    297     if (storageType() == StorageType::Session || storageType() == StorageType::EphemeralLocal)
     297    if (storageType() == StorageType::Session)
    298298        dispatchSessionStorageEvent(sourceStorageAreaID, key, oldValue, newValue, urlString);
    299299    else
     
    308308void StorageAreaMap::dispatchSessionStorageEvent(uint64_t sourceStorageAreaID, const String& key, const String& oldValue, const String& newValue, const String& urlString)
    309309{
    310     // Namespace IDs for session storage namespaces and ephemeral local storage namespaces are equivalent to web page IDs
     310    ASSERT(storageType() == StorageType::Session);
     311
     312    // Namespace IDs for session storage namespaces are equivalent to web page IDs
    311313    // so we can get the right page here.
    312314    WebPage* webPage = WebProcess::singleton().webPage(makeObjectIdentifier<PageIdentifierType>(m_storageNamespaceID));
     
    376378    switch (m_storageType) {
    377379    case StorageType::Local:
    378     case StorageType::EphemeralLocal:
    379380    case StorageType::TransientLocal:
    380381        if (SecurityOrigin* topLevelOrigin = m_storageNamespace->topLevelOrigin())
     
    385386    case StorageType::Session:
    386387        WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::StorageManager::CreateSessionStorageMap(m_storageMapID, m_storageNamespace->storageNamespaceID(), m_securityOrigin->data()), 0);
    387     }
    388 
    389     if (m_storageMap)
    390         WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::StorageManager::SetItems(m_storageMapID, m_storageMap->items()), 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
    391396    m_isDisconnected = false;
    392397}
  • branches/safari-608.1.27-branch/Source/WebKit/WebProcess/WebStorage/StorageNamespaceImpl.cpp

    r245943 r245997  
    4848Ref<StorageNamespaceImpl> StorageNamespaceImpl::createEphemeralLocalStorageNamespace(uint64_t identifier, unsigned quotaInBytes)
    4949{
    50     return createLocalStorageNamespace(identifier, quotaInBytes, IsEphemeral::Yes);
     50    return createSessionStorageNamespace(identifier, quotaInBytes);
    5151}
    5252
    53 Ref<StorageNamespaceImpl> StorageNamespaceImpl::createLocalStorageNamespace(uint64_t identifier, unsigned quotaInBytes, IsEphemeral isEphemeral)
     53Ref<StorageNamespaceImpl> StorageNamespaceImpl::createLocalStorageNamespace(uint64_t identifier, unsigned quotaInBytes)
    5454{
    55     return adoptRef(*new StorageNamespaceImpl(isEphemeral == IsEphemeral::Yes ? StorageType::EphemeralLocal : StorageType::Local, identifier, nullptr, quotaInBytes));
     55    return adoptRef(*new StorageNamespaceImpl(StorageType::Local, identifier, nullptr, quotaInBytes));
    5656}
    5757
  • branches/safari-608.1.27-branch/Source/WebKit/WebProcess/WebStorage/StorageNamespaceImpl.h

    r245943 r245997  
    4242    static Ref<StorageNamespaceImpl> createSessionStorageNamespace(uint64_t identifier, unsigned quotaInBytes);
    4343    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);
     44    static Ref<StorageNamespaceImpl> createLocalStorageNamespace(uint64_t identifier, unsigned quotaInBytes);
    4745    static Ref<StorageNamespaceImpl> createTransientLocalStorageNamespace(uint64_t identifier, WebCore::SecurityOrigin& topLevelOrigin, uint64_t quotaInBytes);
    4846
  • branches/safari-608.1.27-branch/Source/WebKit/WebProcess/WebStorage/WebStorageNamespaceProvider.cpp

    r245943 r245997  
    7878Ref<WebCore::StorageNamespace> WebStorageNamespaceProvider::createLocalStorageNamespace(unsigned quota)
    7979{
    80     return StorageNamespaceImpl::createLocalStorageNamespace(m_identifier, quota, StorageNamespaceImpl::IsEphemeral::No);
     80    return StorageNamespaceImpl::createLocalStorageNamespace(m_identifier, quota);
    8181}
    8282
  • branches/safari-608.1.27-branch/Tools/ChangeLog

    r245959 r245997  
     12019-05-31  Alan Coon  <alancoon@apple.com>
     2
     3        Revert r245943. rdar://problem/51244662
     4
    152019-05-31  Carlos Garcia Campos  <cgarcia@igalia.com>
    26
  • branches/safari-608.1.27-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebsiteDatastore.mm

    r245943 r245997  
    305305}
    306306
    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 }
     307}
Note: See TracChangeset for help on using the changeset viewer.