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 #if PLATFORM(ANDROID) 69 // TODO: This needs upstreaming to WebKit. 70 virtual void pauseLoad(bool); 71 #endif 72 setIdentifier(unsigned long identifier)73 void setIdentifier(unsigned long identifier) { m_identifier = identifier; } identifier()74 unsigned long identifier() const { return m_identifier; } 75 76 virtual void releaseResources(); 77 const ResourceResponse& response() const; 78 79 virtual void addData(const char*, int, bool allAtOnce); 80 virtual PassRefPtr<SharedBuffer> resourceData(); 81 void clearResourceData(); 82 83 virtual void willSendRequest(ResourceRequest&, const ResourceResponse& redirectResponse); 84 virtual void didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent); 85 virtual void didReceiveResponse(const ResourceResponse&); 86 virtual void didReceiveData(const char*, int, long long encodedDataLength, bool allAtOnce); didReceiveCachedMetadata(const char *,int)87 virtual void didReceiveCachedMetadata(const char*, int) { } 88 void willStopBufferingData(const char*, int); 89 virtual void didFinishLoading(double finishTime); 90 virtual void didFail(const ResourceError&); 91 #if HAVE(CFNETWORK_DATA_ARRAY_CALLBACK) 92 virtual void didReceiveDataArray(CFArrayRef dataArray); 93 #endif 94 95 virtual bool shouldUseCredentialStorage(); 96 virtual void didReceiveAuthenticationChallenge(const AuthenticationChallenge&); 97 void didCancelAuthenticationChallenge(const AuthenticationChallenge&); 98 #if USE(PROTECTION_SPACE_AUTH_CALLBACK) 99 virtual bool canAuthenticateAgainstProtectionSpace(const ProtectionSpace&); 100 #endif 101 virtual void receivedCancellation(const AuthenticationChallenge&); 102 103 // ResourceHandleClient 104 virtual void willSendRequest(ResourceHandle*, ResourceRequest&, const ResourceResponse& redirectResponse); 105 virtual void didSendData(ResourceHandle*, unsigned long long bytesSent, unsigned long long totalBytesToBeSent); 106 virtual void didReceiveResponse(ResourceHandle*, const ResourceResponse&); 107 virtual void didReceiveData(ResourceHandle*, const char*, int, int encodedDataLength); didReceiveCachedMetadata(ResourceHandle *,const char * data,int length)108 virtual void didReceiveCachedMetadata(ResourceHandle*, const char* data, int length) { didReceiveCachedMetadata(data, length); } 109 virtual void didFinishLoading(ResourceHandle*, double finishTime); 110 virtual void didFail(ResourceHandle*, const ResourceError&); 111 virtual void wasBlocked(ResourceHandle*); 112 virtual void cannotShowURL(ResourceHandle*); willStopBufferingData(ResourceHandle *,const char * data,int length)113 virtual void willStopBufferingData(ResourceHandle*, const char* data, int length) { willStopBufferingData(data, length); } shouldUseCredentialStorage(ResourceHandle *)114 virtual bool shouldUseCredentialStorage(ResourceHandle*) { return shouldUseCredentialStorage(); } didReceiveAuthenticationChallenge(ResourceHandle *,const AuthenticationChallenge & challenge)115 virtual void didReceiveAuthenticationChallenge(ResourceHandle*, const AuthenticationChallenge& challenge) { didReceiveAuthenticationChallenge(challenge); } didCancelAuthenticationChallenge(ResourceHandle *,const AuthenticationChallenge & challenge)116 virtual void didCancelAuthenticationChallenge(ResourceHandle*, const AuthenticationChallenge& challenge) { didCancelAuthenticationChallenge(challenge); } 117 #if HAVE(CFNETWORK_DATA_ARRAY_CALLBACK) 118 virtual void didReceiveDataArray(ResourceHandle*, CFArrayRef dataArray); 119 #endif 120 #if USE(PROTECTION_SPACE_AUTH_CALLBACK) canAuthenticateAgainstProtectionSpace(ResourceHandle *,const ProtectionSpace & protectionSpace)121 virtual bool canAuthenticateAgainstProtectionSpace(ResourceHandle*, const ProtectionSpace& protectionSpace) { return canAuthenticateAgainstProtectionSpace(protectionSpace); } 122 #endif receivedCancellation(ResourceHandle *,const AuthenticationChallenge & challenge)123 virtual void receivedCancellation(ResourceHandle*, const AuthenticationChallenge& challenge) { receivedCancellation(challenge); } 124 virtual void willCacheResponse(ResourceHandle*, CacheStoragePolicy&); 125 #if PLATFORM(MAC) 126 virtual NSCachedURLResponse* willCacheResponse(ResourceHandle*, NSCachedURLResponse*); 127 #endif 128 #if USE(CFNETWORK) 129 virtual bool shouldCacheResponse(ResourceHandle*, CFCachedURLResponseRef); 130 #endif 131 #if ENABLE(BLOB) 132 virtual AsyncFileStream* createAsyncFileStream(FileStreamClient*); 133 #endif 134 url()135 const KURL& url() const { return m_request.url(); } handle()136 ResourceHandle* handle() const { return m_handle.get(); } sendResourceLoadCallbacks()137 bool sendResourceLoadCallbacks() const { return m_sendResourceLoadCallbacks; } 138 reachedTerminalState()139 bool reachedTerminalState() const { return m_reachedTerminalState; } 140 141 void setShouldBufferData(bool shouldBufferData); 142 143 protected: 144 ResourceLoader(Frame*, bool sendResourceLoadCallbacks, bool shouldContentSniff); 145 146 #if ENABLE(OFFLINE_WEB_APPLICATIONS) 147 friend class ApplicationCacheHost; // for access to request() 148 #endif 149 friend class ResourceLoadScheduler; // for access to start() 150 // start() actually sends the load to the network (unless the load is being 151 // deferred) and should only be called by ResourceLoadScheduler or setDefersLoading(). 152 void start(); 153 154 virtual void didCancel(const ResourceError&); 155 void didFinishLoadingOnePart(double finishTime); 156 request()157 const ResourceRequest& request() const { return m_request; } cancelled()158 bool cancelled() const { return m_cancelled; } defersLoading()159 bool defersLoading() const { return m_defersLoading; } 160 161 RefPtr<ResourceHandle> m_handle; 162 RefPtr<Frame> m_frame; 163 RefPtr<DocumentLoader> m_documentLoader; 164 ResourceResponse m_response; 165 166 private: 167 ResourceRequest m_request; 168 RefPtr<SharedBuffer> m_resourceData; 169 170 unsigned long m_identifier; 171 172 bool m_reachedTerminalState; 173 bool m_cancelled; 174 bool m_calledDidFinishLoad; 175 176 bool m_sendResourceLoadCallbacks; 177 bool m_shouldContentSniff; 178 bool m_shouldBufferData; 179 bool m_defersLoading; 180 ResourceRequest m_deferredRequest; 181 }; 182 183 } 184 185 #endif 186