Changeset 143569 in webkit


Ignore:
Timestamp:
Feb 21, 2013, 12:27:10 AM (12 years ago)
Author:
ap@apple.com
Message:

Stop hardcoding knowledge about blob protocol in ResourceHandle
https://bugs.webkit.org/show_bug.cgi?id=110382

Reviewed by Anders Carlsson.

  • platform/network/BlobRegistry.h:
  • platform/network/chromium/BlobRegistryProxy.h: Removed loadResourceSynchronously(). Chromium did not even implement it, and cross-platform code doesn't need it any more either.
  • platform/network/BlobRegistryImpl.cpp: (WebCore::loadResourceSynchronously): A function to load a blob synchronously, suitable for being in a ResourceHandle map. (WebCore::registerBlobResourceHandleConstructor): Register loadResourceSynchronously too. (WebCore::BlobRegistryImpl::createResourceHandle): Don't make policy decisions here, it's just a registry. Moved code for checking request method down to BlobResourceHandle.
  • platform/network/BlobRegistryImpl.h: Removed BlobRegistryImpl::loadResourceSynchronously(). A registry shouldn't load resources, and it already has enough accessors to implement this externally.
  • platform/network/BlobResourceHandle.h:
  • platform/network/BlobResourceHandle.cpp: (WebCore::BlobResourceHandle::createAsync): Renamed from create(), to make it clear that it's not OK to call from synchronous loader. Moved method check here. (WebCore::BlobResourceHandle::loadResourceSynchronously): Moved method check here. We used to fall through to NSURLConnection based loader when method was not GET, which of course resulted in an error eventually, but was just wrong.
  • platform/network/ResourceHandle.cpp: (WebCore::builtinResourceHandleSynchronousLoaderMap): Added a map for synchronous case. (WebCore::ResourceHandle::registerBuiltinSynchronousLoader): Ditto. (WebCore::ResourceHandle::loadResourceSynchronously): We no longer need to hardcode knowledge about blobRegistry and blobs here.
  • platform/network/ResourceHandle.h: Added registerBuiltinSynchronousLoader().
  • platform/network/chromium/ResourceHandle.h: Removed loadResourceSynchronously(), which was not implemented for Chromium.
Location:
trunk/Source/WebCore
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified trunk/Source/WebCore/ChangeLog

    r143568 r143569  
     12013-02-20  Alexey Proskuryakov  <ap@apple.com>
     2
     3        Stop hardcoding knowledge about blob protocol in ResourceHandle
     4        https://bugs.webkit.org/show_bug.cgi?id=110382
     5
     6        Reviewed by Anders Carlsson.
     7
     8        * platform/network/BlobRegistry.h:
     9        * platform/network/chromium/BlobRegistryProxy.h:
     10        Removed loadResourceSynchronously(). Chromium did not even implement it, and
     11        cross-platform code doesn't need it any more either.
     12
     13        * platform/network/BlobRegistryImpl.cpp:
     14        (WebCore::loadResourceSynchronously): A function to load a blob synchronously,
     15        suitable for being in a ResourceHandle map.
     16        (WebCore::registerBlobResourceHandleConstructor): Register loadResourceSynchronously too.
     17        (WebCore::BlobRegistryImpl::createResourceHandle): Don't make policy decisions here,
     18        it's just a registry. Moved code for checking request method down to BlobResourceHandle.
     19
     20        * platform/network/BlobRegistryImpl.h: Removed BlobRegistryImpl::loadResourceSynchronously().
     21        A registry shouldn't load resources, and it already has enough accessors to implement
     22        this externally.
     23
     24        * platform/network/BlobResourceHandle.h:
     25        * platform/network/BlobResourceHandle.cpp:
     26        (WebCore::BlobResourceHandle::createAsync): Renamed from create(), to make it clear
     27        that it's not OK to call from synchronous loader. Moved method check here.
     28        (WebCore::BlobResourceHandle::loadResourceSynchronously): Moved method check here.
     29        We used to fall through to NSURLConnection based loader when method was not GET,
     30        which of course resulted in an error eventually, but was just wrong.
     31
     32        * platform/network/ResourceHandle.cpp:
     33        (WebCore::builtinResourceHandleSynchronousLoaderMap): Added a map for synchronous case.
     34        (WebCore::ResourceHandle::registerBuiltinSynchronousLoader): Ditto.
     35        (WebCore::ResourceHandle::loadResourceSynchronously): We no longer need to hardcode
     36        knowledge about blobRegistry and blobs here.
     37
     38        * platform/network/ResourceHandle.h: Added registerBuiltinSynchronousLoader().
     39
     40        * platform/network/chromium/ResourceHandle.h: Removed loadResourceSynchronously(),
     41        which was not implemented for Chromium.
     42
    1432013-02-20  Vsevolod Vlasov  <vsevik@chromium.org>
    244
  • TabularUnified trunk/Source/WebCore/platform/network/BlobRegistry.h

    r110066 r143569  
    6060
    6161    virtual void unregisterBlobURL(const KURL&) = 0;
    62     virtual bool loadResourceSynchronously(const ResourceRequest&, ResourceError&, ResourceResponse&, Vector<char>& data) = 0;
    6362
    6463protected:
  • TabularUnified trunk/Source/WebCore/platform/network/BlobRegistryImpl.cpp

    r125391 r143569  
    11/*
    22 * Copyright (C) 2010 Google Inc. All rights reserved.
     3 * Copyright (C) 2013 Apple Inc. All rights reserved.
    34 *
    45 * Redistribution and use in source and binary forms, with or without
     
    5960}
    6061
     62static void loadResourceSynchronously(NetworkingContext*, const ResourceRequest& request, StoredCredentials, ResourceError& error, ResourceResponse& response, Vector<char>& data)
     63{
     64    RefPtr<BlobStorageData> blobData = static_cast<BlobRegistryImpl&>(blobRegistry()).getBlobDataFromURL(request.url());
     65    BlobResourceHandle::loadResourceSynchronously(blobData, request, error, response, data);
     66}
     67
    6168static void registerBlobResourceHandleConstructor()
    6269{
     
    6471    if (!didRegister) {
    6572        ResourceHandle::registerBuiltinConstructor("blob", createResourceHandle);
     73        ResourceHandle::registerBuiltinSynchronousLoader("blob", loadResourceSynchronously);
    6674        didRegister = true;
    6775    }
     
    7583#endif
    7684
    77 bool BlobRegistryImpl::shouldLoadResource(const ResourceRequest& request) const
    78 {
    79     // If the resource is not fetched using the GET method, bail out.
    80     if (!equalIgnoringCase(request.httpMethod(), "GET"))
    81         return false;
    82 
    83     return true;
    84 }
    85 
    8685PassRefPtr<ResourceHandle> BlobRegistryImpl::createResourceHandle(const ResourceRequest& request, ResourceHandleClient* client)
    8786{
    88     if (!shouldLoadResource(request))
     87    RefPtr<BlobResourceHandle> handle = BlobResourceHandle::createAsync(m_blobs.get(request.url().string()), request, client);
     88    if (!handle)
    8989        return 0;
    9090
    91     RefPtr<BlobResourceHandle> handle = BlobResourceHandle::create(m_blobs.get(request.url().string()), request, client);
    9291    handle->start();
    9392    return handle.release();
    94 }
    95 
    96 bool BlobRegistryImpl::loadResourceSynchronously(const ResourceRequest& request, ResourceError& error, ResourceResponse& response, Vector<char>& data)
    97 {
    98     if (!shouldLoadResource(request))
    99         return false;
    100 
    101     BlobResourceHandle::loadResourceSynchronously(m_blobs.get(request.url().string()), request, error, response, data);
    102     return true;
    10393}
    10494
  • TabularUnified trunk/Source/WebCore/platform/network/BlobRegistryImpl.h

    r128572 r143569  
    5858    virtual void registerBlobURL(const KURL&, const KURL& srcURL);
    5959    virtual void unregisterBlobURL(const KURL&);
    60     virtual bool loadResourceSynchronously(const ResourceRequest&, ResourceError&, ResourceResponse&, Vector<char>& data);
    6160
    6261    PassRefPtr<BlobStorageData> getBlobDataFromURL(const KURL&) const;
     
    6564
    6665private:
    67     bool shouldLoadResource(const ResourceRequest& request) const;
    6866    void appendStorageItems(BlobStorageData*, const BlobDataItemList&);
    6967    void appendStorageItems(BlobStorageData*, const BlobDataItemList&, long long offset, long long length);
  • TabularUnified trunk/Source/WebCore/platform/network/BlobResourceHandle.cpp

    r143349 r143569  
    7171    rangeError = 3,
    7272    notReadableError = 4,
     73    methodNotAllowed = 5
    7374};
    7475
     
    133134// BlobResourceHandle
    134135
    135 // static
     136PassRefPtr<BlobResourceHandle> BlobResourceHandle::createAsync(PassRefPtr<BlobStorageData> blobData, const ResourceRequest& request, ResourceHandleClient* client)
     137{
     138    // FIXME: Should probably call didFail() instead of blocking the load without explanation.
     139    if (!equalIgnoringCase(request.httpMethod(), "GET"))
     140        return 0;
     141
     142    return adoptRef(new BlobResourceHandle(blobData, request, client, true));
     143}
     144
    136145void BlobResourceHandle::loadResourceSynchronously(PassRefPtr<BlobStorageData> blobData, const ResourceRequest& request, ResourceError& error, ResourceResponse& response, Vector<char>& data)
    137146{
     147    if (!equalIgnoringCase(request.httpMethod(), "GET")) {
     148        error = ResourceError(webKitBlobResourceDomain, methodNotAllowed, response.url(), "Request method must be GET");
     149        return;
     150    }
     151
    138152    BlobResourceSynchronousLoader loader(error, response, data);
    139     RefPtr<BlobResourceHandle> handle = BlobResourceHandle::create(blobData, request, &loader, false);
     153    RefPtr<BlobResourceHandle> handle = adoptRef(new BlobResourceHandle(blobData, request, &loader, false));
    140154    handle->start();
    141155}
  • TabularUnified trunk/Source/WebCore/platform/network/BlobResourceHandle.h

    r127757 r143569  
    5151class BlobResourceHandle : public FileStreamClient, public ResourceHandle  {
    5252public:
    53     static PassRefPtr<BlobResourceHandle> create(PassRefPtr<BlobStorageData> blobData, const ResourceRequest& request, ResourceHandleClient* client, bool async = true)
    54     {
    55         return adoptRef(new BlobResourceHandle(blobData, request, client, async));
    56     }
     53    static PassRefPtr<BlobResourceHandle> createAsync(PassRefPtr<BlobStorageData>, const ResourceRequest&, ResourceHandleClient*);
    5754
    5855    static void loadResourceSynchronously(PassRefPtr<BlobStorageData> blobData, const ResourceRequest& request, ResourceError& error, ResourceResponse& response, Vector<char>& data);
  • TabularUnified trunk/Source/WebCore/platform/network/ResourceHandle.cpp

    r143487 r143569  
    5454}
    5555
     56typedef HashMap<AtomicString, ResourceHandle::BuiltinSynchronousLoader> BuiltinResourceHandleSynchronousLoaderMap;
     57static BuiltinResourceHandleSynchronousLoaderMap& builtinResourceHandleSynchronousLoaderMap()
     58{
     59    ASSERT(isMainThread());
     60    DEFINE_STATIC_LOCAL(BuiltinResourceHandleSynchronousLoaderMap, map, ());
     61    return map;
     62}
     63
     64void ResourceHandle::registerBuiltinSynchronousLoader(const AtomicString& protocol, ResourceHandle::BuiltinSynchronousLoader loader)
     65{
     66    builtinResourceHandleSynchronousLoaderMap().add(protocol, loader);
     67}
     68
    5669ResourceHandle::ResourceHandle(NetworkingContext* context, const ResourceRequest& request, ResourceHandleClient* client, bool defersLoading, bool shouldContentSniff)
    5770    : d(adoptPtr(new ResourceHandleInternal(this, context, request, client, defersLoading, shouldContentSniff && shouldContentSniffURL(request.url()))))
     
    116129void ResourceHandle::loadResourceSynchronously(NetworkingContext* context, const ResourceRequest& request, StoredCredentials storedCredentials, ResourceError& error, ResourceResponse& response, Vector<char>& data)
    117130{
    118 #if ENABLE(BLOB)
    119     // FIXME: This should use a more generic mechanism, like builtinResourceHandleConstructorMap we have for async requests.
    120     if (request.url().protocolIs("blob"))
    121         if (blobRegistry().loadResourceSynchronously(request, error, response, data))
    122             return;
    123 #endif
    124 
    125     ASSERT(builtinResourceHandleConstructorMap().find(request.url().protocol()) == builtinResourceHandleConstructorMap().end());
     131    BuiltinResourceHandleSynchronousLoaderMap::iterator protocolMapItem = builtinResourceHandleSynchronousLoaderMap().find(request.url().protocol());
     132
     133    if (protocolMapItem != builtinResourceHandleSynchronousLoaderMap().end()) {
     134        protocolMapItem->value(context, request, storedCredentials, error, response, data);
     135        return;
     136    }
    126137
    127138    platformLoadResourceSynchronously(context, request, storedCredentials, error, response, data);
  • TabularUnified trunk/Source/WebCore/platform/network/ResourceHandle.h

    r143487 r143569  
    216216    static void registerBuiltinConstructor(const AtomicString& protocol, BuiltinConstructor);
    217217
     218    typedef void (*BuiltinSynchronousLoader)(NetworkingContext*, const ResourceRequest&, StoredCredentials, ResourceError&, ResourceResponse&, Vector<char>& data);
     219    static void registerBuiltinSynchronousLoader(const AtomicString& protocol, BuiltinSynchronousLoader);
     220
    218221protected:
    219222    ResourceHandle(NetworkingContext*, const ResourceRequest&, ResourceHandleClient*, bool defersLoading, bool shouldContentSniff);
  • TabularUnified trunk/Source/WebCore/platform/network/chromium/BlobRegistryProxy.h

    r139698 r143569  
    4848    virtual void unregisterBlobURL(const KURL&);
    4949
    50     virtual bool loadResourceSynchronously(const ResourceRequest&, ResourceError&, ResourceResponse&, Vector<char>& data) { return false; }
    51 
    5250private:
    5351    virtual ~BlobRegistryProxy() { }
Note: See TracChangeset for help on using the changeset viewer.