1 /* 2 * Copyright (C) 2005, 2006 Apple Computer, Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 14 * its contributors may be used to endorse or promote products derived 15 * from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #ifndef ResourceLoader_h 30 #define ResourceLoader_h 31 32 #include "ResourceHandleClient.h" 33 #include "ResourceRequest.h" 34 #include "ResourceResponse.h" 35 #include <wtf/RefCounted.h> 36 #include "AuthenticationChallenge.h" 37 #include "KURL.h" 38 39 #include <wtf/Forward.h> 40 41 namespace WebCore { 42 43 class ApplicationCacheHost; 44 class DocumentLoader; 45 class Frame; 46 class FrameLoader; 47 class ProtectionSpace; 48 class ResourceHandle; 49 class SharedBuffer; 50 51 class ResourceLoader : public RefCounted<ResourceLoader>, protected ResourceHandleClient { 52 public: 53 virtual ~ResourceLoader(); 54 55 void cancel(); 56 57 virtual bool init(const ResourceRequest&); 58 59 FrameLoader* frameLoader() const; documentLoader()60 DocumentLoader* documentLoader() const { return m_documentLoader.get(); } 61 62 virtual void cancel(const ResourceError&); 63 ResourceError cancelledError(); 64 ResourceError blockedError(); 65 ResourceError cannotShowURLError(); 66 67 virtual void setDefersLoading(bool); 68 setIdentifier(unsigned long identifier)69 void setIdentifier(unsigned long identifier) { m_identifier = identifier; } identifier()70 unsigned long identifier() const { return m_identifier; } 71 72 virtual void releaseResources(); 73 const ResourceResponse& response() const; 74 75 virtual void addData(const char*, int, bool allAtOnce); 76 virtual PassRefPtr<SharedBuffer> resourceData(); 77 void clearResourceData(); 78 79 virtual void willSendRequest(ResourceRequest&, const ResourceResponse& redirectResponse); 80 virtual void didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent); 81 virtual void didReceiveResponse(const ResourceResponse&); 82 virtual void didReceiveData(const char*, int, long long encodedDataLength, bool allAtOnce); didReceiveCachedMetadata(const char *,int)83 virtual void didReceiveCachedMetadata(const char*, int) { } 84 void willStopBufferingData(const char*, int); 85 virtual void didFinishLoading(double finishTime); 86 virtual void didFail(const ResourceError&); 87 #if HAVE(CFNETWORK_DATA_ARRAY_CALLBACK) 88 virtual void didReceiveDataArray(CFArrayRef dataArray); 89 #endif 90 91 virtual bool shouldUseCredentialStorage(); 92 virtual void didReceiveAuthenticationChallenge(const AuthenticationChallenge&); 93 void didCancelAuthenticationChallenge(const AuthenticationChallenge&); 94 #if USE(PROTECTION_SPACE_AUTH_CALLBACK) 95 virtual bool canAuthenticateAgainstProtectionSpace(const ProtectionSpace&); 96 #endif 97 virtual void receivedCancellation(const AuthenticationChallenge&); 98 99 // ResourceHandleClient 100 virtual void willSendRequest(ResourceHandle*, ResourceRequest&, const ResourceResponse& redirectResponse); 101 virtual void didSendData(ResourceHandle*, unsigned long long bytesSent, unsigned long long totalBytesToBeSent); 102 virtual void didReceiveResponse(ResourceHandle*, const ResourceResponse&); 103 virtual void didReceiveData(ResourceHandle*, const char*, int, int encodedDataLength); didReceiveCachedMetadata(ResourceHandle *,const char * data,int length)104 virtual void didReceiveCachedMetadata(ResourceHandle*, const char* data, int length) { didReceiveCachedMetadata(data, length); } 105 virtual void didFinishLoading(ResourceHandle*, double finishTime); 106 virtual void didFail(ResourceHandle*, const ResourceError&); 107 virtual void wasBlocked(ResourceHandle*); 108 virtual void cannotShowURL(ResourceHandle*); willStopBufferingData(ResourceHandle *,const char * data,int length)109 virtual void willStopBufferingData(ResourceHandle*, const char* data, int length) { willStopBufferingData(data, length); } shouldUseCredentialStorage(ResourceHandle *)110 virtual bool shouldUseCredentialStorage(ResourceHandle*) { return shouldUseCredentialStorage(); } didReceiveAuthenticationChallenge(ResourceHandle *,const AuthenticationChallenge & challenge)111 virtual void didReceiveAuthenticationChallenge(ResourceHandle*, const AuthenticationChallenge& challenge) { didReceiveAuthenticationChallenge(challenge); } didCancelAuthenticationChallenge(ResourceHandle *,const AuthenticationChallenge & challenge)112 virtual void didCancelAuthenticationChallenge(ResourceHandle*, const AuthenticationChallenge& challenge) { didCancelAuthenticationChallenge(challenge); } 113 #if HAVE(CFNETWORK_DATA_ARRAY_CALLBACK) 114 virtual void didReceiveDataArray(ResourceHandle*, CFArrayRef dataArray); 115 #endif 116 #if USE(PROTECTION_SPACE_AUTH_CALLBACK) canAuthenticateAgainstProtectionSpace(ResourceHandle *,const ProtectionSpace & protectionSpace)117 virtual bool canAuthenticateAgainstProtectionSpace(ResourceHandle*, const ProtectionSpace& protectionSpace) { return canAuthenticateAgainstProtectionSpace(protectionSpace); } 118 #endif receivedCancellation(ResourceHandle *,const AuthenticationChallenge & challenge)119 virtual void receivedCancellation(ResourceHandle*, const AuthenticationChallenge& challenge) { receivedCancellation(challenge); } 120 virtual void willCacheResponse(ResourceHandle*, CacheStoragePolicy&); 121 #if PLATFORM(MAC) 122 #if USE(CFNETWORK) 123 virtual CFCachedURLResponseRef willCacheResponse(ResourceHandle*, CFCachedURLResponseRef); 124 #else 125 virtual NSCachedURLResponse* willCacheResponse(ResourceHandle*, NSCachedURLResponse*); 126 #endif 127 #endif // PLATFORM(MAC) 128 #if PLATFORM(WIN) && USE(CFNETWORK) 129 // FIXME: Windows should use willCacheResponse - <https://bugs.webkit.org/show_bug.cgi?id=57257>. 130 virtual bool shouldCacheResponse(ResourceHandle*, CFCachedURLResponseRef); 131 #endif 132 #if ENABLE(BLOB) 133 virtual AsyncFileStream* createAsyncFileStream(FileStreamClient*); 134 #endif 135 url()136 const KURL& url() const { return m_request.url(); } handle()137 ResourceHandle* handle() const { return m_handle.get(); } sendResourceLoadCallbacks()138 bool sendResourceLoadCallbacks() const { return m_sendResourceLoadCallbacks; } 139 reachedTerminalState()140 bool reachedTerminalState() const { return m_reachedTerminalState; } 141 142 void setShouldBufferData(bool shouldBufferData); 143 144 protected: 145 ResourceLoader(Frame*, bool sendResourceLoadCallbacks, bool shouldContentSniff); 146 147 #if ENABLE(OFFLINE_WEB_APPLICATIONS) 148 friend class ApplicationCacheHost; // for access to request() 149 #endif 150 friend class ResourceLoadScheduler; // for access to start() 151 // start() actually sends the load to the network (unless the load is being 152 // deferred) and should only be called by ResourceLoadScheduler or setDefersLoading(). 153 void start(); 154 155 virtual void didCancel(const ResourceError&); 156 void didFinishLoadingOnePart(double finishTime); 157 request()158 const ResourceRequest& request() const { return m_request; } cancelled()159 bool cancelled() const { return m_cancelled; } defersLoading()160 bool defersLoading() const { return m_defersLoading; } 161 162 RefPtr<ResourceHandle> m_handle; 163 RefPtr<Frame> m_frame; 164 RefPtr<DocumentLoader> m_documentLoader; 165 ResourceResponse m_response; 166 167 private: 168 ResourceRequest m_request; 169 RefPtr<SharedBuffer> m_resourceData; 170 171 unsigned long m_identifier; 172 173 bool m_reachedTerminalState; 174 bool m_cancelled; 175 bool m_calledDidFinishLoad; 176 177 bool m_sendResourceLoadCallbacks; 178 bool m_shouldContentSniff; 179 bool m_shouldBufferData; 180 bool m_defersLoading; 181 ResourceRequest m_deferredRequest; 182 }; 183 184 } 185 186 #endif 187