Changeset 164947 in webkit


Ignore:
Timestamp:
Mar 2, 2014 12:34:51 PM (10 years ago)
Author:
BJ Burg
Message:

DocumentLoader should keep maps of ResourceLoaders instead of sets
https://bugs.webkit.org/show_bug.cgi?id=129388

Reviewed by Darin Adler.

For web replay, we need to be able to pull a ResourceLoader instance by
identifier from the DocumentLoader. This is easy to do if we convert
ResourceLoaderSet to ResourceLoaderMap, keyed by the loader's identifier.

Added assertions whenever adding or removing from the map to ensure
that we don't try to add duplicates or resources with zero identifiers.

No new tests required. No functionality was added.

  • loader/DocumentLoader.cpp:

(WebCore::cancelAll):
(WebCore::setAllDefersLoading):
(WebCore::areAllLoadersPageCacheAcceptable):
(WebCore::DocumentLoader::addSubresourceLoader):
(WebCore::DocumentLoader::removeSubresourceLoader):
(WebCore::DocumentLoader::addPlugInStreamLoader):
(WebCore::DocumentLoader::removePlugInStreamLoader):
(WebCore::DocumentLoader::subresourceLoaderFinishedLoadingOnePart):

  • loader/DocumentLoader.h:
  • loader/NetscapePlugInStreamLoader.cpp:

(WebCore::NetscapePlugInStreamLoader::create): Only add the loader
to the document loader's map if it initialized successfully.
The old code was probably leaking resource loaders that failed to
initialize.

  • loader/mac/DocumentLoaderMac.cpp:

(WebCore::scheduleAll):
(WebCore::unscheduleAll):

Location:
trunk/Source/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r164943 r164947  
     12014-03-02  Brian Burg  <bburg@apple.com>
     2
     3        DocumentLoader should keep maps of ResourceLoaders instead of sets
     4        https://bugs.webkit.org/show_bug.cgi?id=129388
     5
     6        Reviewed by Darin Adler.
     7
     8        For web replay, we need to be able to pull a ResourceLoader instance by
     9        identifier from the DocumentLoader. This is easy to do if we convert
     10        ResourceLoaderSet to ResourceLoaderMap, keyed by the loader's identifier.
     11
     12        Added assertions whenever adding or removing from the map to ensure
     13        that we don't try to add duplicates or resources with zero identifiers.
     14
     15        No new tests required. No functionality was added.
     16
     17        * loader/DocumentLoader.cpp:
     18        (WebCore::cancelAll):
     19        (WebCore::setAllDefersLoading):
     20        (WebCore::areAllLoadersPageCacheAcceptable):
     21        (WebCore::DocumentLoader::addSubresourceLoader):
     22        (WebCore::DocumentLoader::removeSubresourceLoader):
     23        (WebCore::DocumentLoader::addPlugInStreamLoader):
     24        (WebCore::DocumentLoader::removePlugInStreamLoader):
     25        (WebCore::DocumentLoader::subresourceLoaderFinishedLoadingOnePart):
     26        * loader/DocumentLoader.h:
     27        * loader/NetscapePlugInStreamLoader.cpp:
     28        (WebCore::NetscapePlugInStreamLoader::create): Only add the loader
     29        to the document loader's map if it initialized successfully.
     30        The old code was probably leaking resource loaders that failed to
     31        initialize.
     32
     33        * loader/mac/DocumentLoaderMac.cpp:
     34        (WebCore::scheduleAll):
     35        (WebCore::unscheduleAll):
     36
    1372014-03-02  Dirkjan Ochtman  <d.ochtman@activevideo.com>
    238
  • trunk/Source/WebCore/loader/DocumentLoader.cpp

    r164822 r164947  
    7979namespace WebCore {
    8080
    81 static void cancelAll(const ResourceLoaderSet& loaders)
     81static void cancelAll(const ResourceLoaderMap& loaders)
    8282{
    8383    Vector<RefPtr<ResourceLoader>> loadersCopy;
    84     copyToVector(loaders, loadersCopy);
    85     size_t size = loadersCopy.size();
    86     for (size_t i = 0; i < size; ++i)
    87         loadersCopy[i]->cancel();
    88 }
    89 
    90 static void setAllDefersLoading(const ResourceLoaderSet& loaders, bool defers)
     84    copyValuesToVector(loaders, loadersCopy);
     85    for (auto& loader : loadersCopy)
     86        loader->cancel();
     87}
     88
     89static void setAllDefersLoading(const ResourceLoaderMap& loaders, bool defers)
    9190{
    9291    Vector<RefPtr<ResourceLoader>> loadersCopy;
    93     copyToVector(loaders, loadersCopy);
    94     size_t size = loadersCopy.size();
    95     for (size_t i = 0; i < size; ++i)
    96         loadersCopy[i]->setDefersLoading(defers);
    97 }
    98 
    99 static bool areAllLoadersPageCacheAcceptable(const ResourceLoaderSet& loaders)
     92    copyValuesToVector(loaders, loadersCopy);
     93    for (auto& loader : loadersCopy)
     94        loader->setDefersLoading(defers);
     95}
     96
     97static bool areAllLoadersPageCacheAcceptable(const ResourceLoaderMap& loaders)
    10098{
    10199    Vector<RefPtr<ResourceLoader>> loadersCopy;
    102     copyToVector(loaders, loadersCopy);
     100    copyValuesToVector(loaders, loadersCopy);
    103101    for (auto& loader : loadersCopy) {
    104102        ResourceHandle* handle = loader->handle();
     
    13391337    if (!m_gotFirstByte)
    13401338        return;
    1341     ASSERT(!m_subresourceLoaders.contains(loader));
     1339    ASSERT(loader->identifier());
     1340    ASSERT(!m_subresourceLoaders.contains(loader->identifier()));
    13421341    ASSERT(!mainResourceLoader() || mainResourceLoader() != loader);
    1343     m_subresourceLoaders.add(loader);
     1342
     1343    m_subresourceLoaders.add(loader->identifier(), loader);
    13441344}
    13451345
    13461346void DocumentLoader::removeSubresourceLoader(ResourceLoader* loader)
    13471347{
    1348     if (!m_subresourceLoaders.remove(loader))
     1348    ASSERT(loader->identifier());
     1349
     1350    if (!m_subresourceLoaders.remove(loader->identifier()))
    13491351        return;
    13501352    checkLoadComplete();
     
    13551357void DocumentLoader::addPlugInStreamLoader(ResourceLoader* loader)
    13561358{
    1357     m_plugInStreamLoaders.add(loader);
     1359    ASSERT(loader->identifier());
     1360    ASSERT(!m_plugInStreamLoaders.contains(loader->identifier()));
     1361
     1362    m_plugInStreamLoaders.add(loader->identifier(), loader);
    13581363}
    13591364
    13601365void DocumentLoader::removePlugInStreamLoader(ResourceLoader* loader)
    13611366{
    1362     m_plugInStreamLoaders.remove(loader);
     1367    ASSERT(loader->identifier());
     1368    ASSERT(loader == m_plugInStreamLoaders.get(loader->identifier()));
     1369
     1370    m_plugInStreamLoaders.remove(loader->identifier());
    13631371    checkLoadComplete();
    13641372}
     
    14851493void DocumentLoader::subresourceLoaderFinishedLoadingOnePart(ResourceLoader* loader)
    14861494{
    1487     m_multipartSubresourceLoaders.add(loader);
    1488     m_subresourceLoaders.remove(loader);
     1495    ASSERT(loader->identifier());
     1496    ASSERT(!m_multipartSubresourceLoaders.contains(loader->identifier()));
     1497    ASSERT(m_subresourceLoaders.contains(loader->identifier()));
     1498
     1499    m_multipartSubresourceLoaders.add(loader->identifier(), loader);
     1500    m_subresourceLoaders.remove(loader->identifier());
    14891501    checkLoadComplete();
    14901502    if (Frame* frame = m_frame)
  • trunk/Source/WebCore/loader/DocumentLoader.h

    r163725 r164947  
    7575    class SubstituteResource;
    7676
    77     typedef HashSet<RefPtr<ResourceLoader>> ResourceLoaderSet;
     77    typedef HashMap<unsigned long, RefPtr<ResourceLoader>> ResourceLoaderMap;
    7878    typedef Vector<ResourceResponse> ResponseVector;
    7979
     
    332332
    333333        CachedResourceHandle<CachedRawResource> m_mainResource;
    334         ResourceLoaderSet m_subresourceLoaders;
    335         ResourceLoaderSet m_multipartSubresourceLoaders;
    336         ResourceLoaderSet m_plugInStreamLoaders;
     334        ResourceLoaderMap m_subresourceLoaders;
     335        ResourceLoaderMap m_multipartSubresourceLoaders;
     336        ResourceLoaderMap m_plugInStreamLoaders;
    337337       
    338338        mutable DocumentWriter m_writer;
  • trunk/Source/WebCore/loader/NetscapePlugInStreamLoader.cpp

    r161338 r164947  
    5050{
    5151    RefPtr<NetscapePlugInStreamLoader> loader(adoptRef(new NetscapePlugInStreamLoader(frame, client)));
    52     loader->documentLoader()->addPlugInStreamLoader(loader.get());
    5352    if (!loader->init(request))
    5453        return 0;
    5554
     55    loader->documentLoader()->addPlugInStreamLoader(loader.get());
    5656    return loader.release();
    5757}
  • trunk/Source/WebCore/loader/mac/DocumentLoaderMac.cpp

    r160841 r164947  
    3636
    3737#if !PLATFORM(IOS)
    38 static void scheduleAll(const ResourceLoaderSet& loaders, SchedulePair* pair)
     38static void scheduleAll(const ResourceLoaderMap& loaders, SchedulePair* pair)
    3939{
    40     const ResourceLoaderSet copy = loaders;
    41     ResourceLoaderSet::const_iterator end = copy.end();
    42     for (ResourceLoaderSet::const_iterator it = copy.begin(); it != end; ++it)
    43         if (ResourceHandle* handle = (*it)->handle())
     40    Vector<RefPtr<ResourceLoader>> loadersCopy;
     41    copyValuesToVector(loaders, loadersCopy);
     42    for (auto& loader : loadersCopy) {
     43        if (ResourceHandle* handle = loader->handle())
    4444            handle->schedule(pair);
     45    }
    4546}
    4647
    47 static void unscheduleAll(const ResourceLoaderSet& loaders, SchedulePair* pair)
     48static void unscheduleAll(const ResourceLoaderMap& loaders, SchedulePair* pair)
    4849{
    49     const ResourceLoaderSet copy = loaders;
    50     ResourceLoaderSet::const_iterator end = copy.end();
    51     for (ResourceLoaderSet::const_iterator it = copy.begin(); it != end; ++it)
    52         if (ResourceHandle* handle = (*it)->handle())
     50    Vector<RefPtr<ResourceLoader>> loadersCopy;
     51    copyValuesToVector(loaders, loadersCopy);
     52    for (auto& loader : loadersCopy) {
     53        if (ResourceHandle* handle = loader->handle())
    5354            handle->unschedule(pair);
     55    }
    5456}
    5557#endif
Note: See TracChangeset for help on using the changeset viewer.