| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 * Copyright (C) 2009 Google 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 are | |
| 6 * met: | |
| 7 * | |
| 8 * * Redistributions of source code must retain the above copyright | |
| 9 * notice, this list of conditions and the following disclaimer. | |
| 10 * * Redistributions in binary form must reproduce the above | |
| 11 * copyright notice, this list of conditions and the following disclaimer | |
| 12 * in the documentation and/or other materials provided with the | |
| 13 * distribution. | |
| 14 * * Neither the name of Google Inc. nor the names of its | |
| 15 * contributors may be used to endorse or promote products derived from | |
| 16 * this software without specific prior written permission. | |
| 17 * | |
| 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
| 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
| 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
| 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
| 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
| 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
| 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
| 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
| 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
| 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
| 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| 29 */ | |
| 30 | |
| 31 #include "config.h" | |
| 32 #include "ResourceHandle.h" | |
| 33 | |
| 34 #include "ResourceHandleClient.h" | |
| 35 #include "ResourceRequest.h" | |
| 36 | |
| 37 #include "WebKit.h" | |
| 38 #include "WebKitClient.h" | |
| 39 #include "WebURLError.h" | |
| 40 #include "WebURLLoader.h" | |
| 41 #include "WebURLLoaderClient.h" | |
| 42 #include "WebURLRequest.h" | |
| 43 #include "WebURLResponse.h" | |
| 44 #include "WrappedResourceRequest.h" | |
| 45 #include "WrappedResourceResponse.h" | |
| 46 | |
| 47 using namespace WebKit; | |
| 48 | |
| 49 namespace WebCore { | |
| 50 | |
| 51 // ResourceHandleInternal ----------------------------------------------------- | |
| 52 | |
| 53 class ResourceHandleInternal : public WebURLLoaderClient { | |
| 54 public: | |
| 55 ResourceHandleInternal(const ResourceRequest& request, ResourceHandleClient* client) | |
| 56 : m_request(request) | |
| 57 , m_owner(0) | |
| 58 , m_client(client) | |
| 59 { | |
| 60 } | |
| 61 | |
| 62 void start(); | |
| 63 void cancel(); | |
| 64 void setDefersLoading(bool); | |
| 65 bool allowStoredCredentials() const; | |
| 66 | |
| 67 // WebURLLoaderClient methods: | |
| 68 virtual void willSendRequest(WebURLLoader*, WebURLRequest&, const WebURLResponse&); | |
| 69 virtual void didSendData( | |
| 70 WebURLLoader*, unsigned long long bytesSent, unsigned long long totalBytesToBeSent); | |
| 71 virtual void didReceiveResponse(WebURLLoader*, const WebURLResponse&); | |
| 72 virtual void didReceiveData(WebURLLoader*, const char* data, int dataLength); | |
| 73 virtual void didFinishLoading(WebURLLoader*); | |
| 74 virtual void didFail(WebURLLoader*, const WebURLError&); | |
| 75 | |
| 76 ResourceRequest m_request; | |
| 77 ResourceHandle* m_owner; | |
| 78 ResourceHandleClient* m_client; | |
| 79 OwnPtr<WebURLLoader> m_loader; | |
| 80 }; | |
| 81 | |
| 82 void ResourceHandleInternal::start() | |
| 83 { | |
| 84 m_loader.set(webKitClient()->createURLLoader()); | |
| 85 ASSERT(m_loader.get()); | |
| 86 | |
| 87 WrappedResourceRequest wrappedRequest(m_request); | |
| 88 wrappedRequest.setAllowStoredCredentials(allowStoredCredentials()); | |
| 89 m_loader->loadAsynchronously(wrappedRequest, this); | |
| 90 } | |
| 91 | |
| 92 void ResourceHandleInternal::cancel() | |
| 93 { | |
| 94 m_loader->cancel(); | |
| 95 | |
| 96 // Do not make any further calls to the client. | |
| 97 m_client = 0; | |
| 98 } | |
| 99 | |
| 100 void ResourceHandleInternal::setDefersLoading(bool value) | |
| 101 { | |
| 102 m_loader->setDefersLoading(value); | |
| 103 } | |
| 104 | |
| 105 bool ResourceHandleInternal::allowStoredCredentials() const | |
| 106 { | |
| 107 return m_client && m_client->shouldUseCredentialStorage(m_owner); | |
| 108 } | |
| 109 | |
| 110 void ResourceHandleInternal::willSendRequest( | |
| 111 WebURLLoader*, WebURLRequest& request, const WebURLResponse& response) | |
| 112 { | |
| 113 ASSERT(m_client); | |
| 114 ASSERT(!request.isNull()); | |
| 115 ASSERT(!response.isNull()); | |
| 116 m_client->willSendRequest(m_owner, request.toMutableResourceRequest(), response.toResourceResponse()); | |
| 117 } | |
| 118 | |
| 119 void ResourceHandleInternal::didSendData( | |
| 120 WebURLLoader*, unsigned long long bytesSent, unsigned long long totalBytesToBeSent) | |
| 121 { | |
| 122 ASSERT(m_client); | |
| 123 m_client->didSendData(m_owner, bytesSent, totalBytesToBeSent); | |
| 124 } | |
| 125 | |
| 126 void ResourceHandleInternal::didReceiveResponse(WebURLLoader*, const WebURLResponse& response) | |
| 127 { | |
| 128 ASSERT(m_client); | |
| 129 ASSERT(!response.isNull()); | |
| 130 m_client->didReceiveResponse(m_owner, response.toResourceResponse()); | |
| 131 } | |
| 132 | |
| 133 void ResourceHandleInternal::didReceiveData( | |
| 134 WebURLLoader*, const char* data, int dataLength) | |
| 135 { | |
| 136 ASSERT(m_client); | |
| 137 | |
| 138 // FIXME(yurys): it looks like lengthReceived is always the same as | |
| 139 // dataLength and that the latter parameter can be eliminated. | |
| 140 // See WebKit bug: https://bugs.webkit.org/show_bug.cgi?id=31019 | |
| 141 m_client->didReceiveData(m_owner, data, dataLength, dataLength); | |
| 142 } | |
| 143 | |
| 144 void ResourceHandleInternal::didFinishLoading(WebURLLoader*) | |
| 145 { | |
| 146 ASSERT(m_client); | |
| 147 m_client->didFinishLoading(m_owner); | |
| 148 } | |
| 149 | |
| 150 void ResourceHandleInternal::didFail(WebURLLoader*, const WebURLError& error) | |
| 151 { | |
| 152 ASSERT(m_client); | |
| 153 m_client->didFail(m_owner, error); | |
| 154 } | |
| 155 | |
| 156 // ResourceHandle ------------------------------------------------------------- | |
| 157 | |
| 158 ResourceHandle::ResourceHandle(const ResourceRequest& request, | |
| 159 ResourceHandleClient* client, | |
| 160 bool defersLoading, | |
| 161 bool shouldContentSniff, | |
| 162 bool mightDownloadFromHandle) | |
| 163 : d(new ResourceHandleInternal(request, client)) | |
| 164 { | |
| 165 d->m_owner = this; | |
| 166 | |
| 167 // FIXME: Figure out what to do with the bool params. | |
| 168 } | |
| 169 | |
| 170 PassRefPtr<ResourceHandle> ResourceHandle::create(const ResourceRequest& request, | |
| 171 ResourceHandleClient* client, | |
| 172 Frame* deprecated, | |
| 173 bool defersLoading, | |
| 174 bool shouldContentSniff, | |
| 175 bool mightDownloadFromHandle) | |
| 176 { | |
| 177 RefPtr<ResourceHandle> newHandle = adoptRef(new ResourceHandle( | |
| 178 request, client, defersLoading, shouldContentSniff, mightDownloadFromHandle)); | |
| 179 | |
| 180 if (newHandle->start(deprecated)) | |
| 181 return newHandle.release(); | |
| 182 | |
| 183 return 0; | |
| 184 } | |
| 185 | |
| 186 const ResourceRequest& ResourceHandle::request() const | |
| 187 { | |
| 188 return d->m_request; | |
| 189 } | |
| 190 | |
| 191 ResourceHandleClient* ResourceHandle::client() const | |
| 192 { | |
| 193 return d->m_client; | |
| 194 } | |
| 195 | |
| 196 void ResourceHandle::setClient(ResourceHandleClient* client) | |
| 197 { | |
| 198 d->m_client = client; | |
| 199 } | |
| 200 | |
| 201 void ResourceHandle::setDefersLoading(bool value) | |
| 202 { | |
| 203 d->setDefersLoading(value); | |
| 204 } | |
| 205 | |
| 206 bool ResourceHandle::start(Frame* deprecated) | |
| 207 { | |
| 208 d->start(); | |
| 209 return true; | |
| 210 } | |
| 211 | |
| 212 void ResourceHandle::clearAuthentication() | |
| 213 { | |
| 214 } | |
| 215 | |
| 216 void ResourceHandle::cancel() | |
| 217 { | |
| 218 d->cancel(); | |
| 219 } | |
| 220 | |
| 221 ResourceHandle::~ResourceHandle() | |
| 222 { | |
| 223 d->m_owner = 0; | |
| 224 } | |
| 225 | |
| 226 PassRefPtr<SharedBuffer> ResourceHandle::bufferedData() | |
| 227 { | |
| 228 return 0; | |
| 229 } | |
| 230 | |
| 231 bool ResourceHandle::loadsBlocked() | |
| 232 { | |
| 233 return false; // This seems to be related to sync XMLHttpRequest... | |
| 234 } | |
| 235 | |
| 236 // static | |
| 237 bool ResourceHandle::supportsBufferedData() | |
| 238 { | |
| 239 return false; // The loader will buffer manually if it needs to. | |
| 240 } | |
| 241 | |
| 242 // static | |
| 243 void ResourceHandle::loadResourceSynchronously(const ResourceRequest& request, | |
| 244 StoredCredentials storedCredentials, | |
| 245 ResourceError& error, | |
| 246 ResourceResponse& response, | |
| 247 Vector<char>& data, | |
| 248 Frame* deprecated) | |
| 249 { | |
| 250 OwnPtr<WebURLLoader> loader(webKitClient()->createURLLoader()); | |
| 251 ASSERT(loader.get()); | |
| 252 | |
| 253 WrappedResourceRequest requestIn(request); | |
| 254 requestIn.setAllowStoredCredentials(storedCredentials == AllowStoredCredentials); | |
| 255 WrappedResourceResponse responseOut(response); | |
| 256 WebURLError errorOut; | |
| 257 WebData dataOut; | |
| 258 | |
| 259 loader->loadSynchronously(requestIn, responseOut, errorOut, dataOut); | |
| 260 | |
| 261 error = errorOut; | |
| 262 data.clear(); | |
| 263 data.append(dataOut.data(), dataOut.size()); | |
| 264 } | |
| 265 | |
| 266 // static | |
| 267 bool ResourceHandle::willLoadFromCache(ResourceRequest& request, Frame*) | |
| 268 { | |
| 269 // This method is used to determine if a POST request can be repeated from | |
| 270 // cache, but you cannot really know until you actually try to read from the | |
| 271 // cache. Even if we checked now, something else could come along and wipe | |
| 272 // out the cache entry by the time we fetch it. | |
| 273 // | |
| 274 // So, we always say yes here, which allows us to generate an ERR_CACHE_MISS | |
| 275 // if the request cannot be serviced from cache. We force the 'DontLoad' | |
| 276 // cache policy at this point to ensure that we never hit the network for | |
| 277 // this request. | |
| 278 // | |
| 279 ASSERT(request.httpMethod() == "POST"); | |
| 280 request.setCachePolicy(ReturnCacheDataDontLoad); | |
| 281 return true; | |
| 282 } | |
| 283 | |
| 284 } // namespace WebCore | |
| OLD | NEW |