1643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/* 2643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Copyright (C) 2009 Google Inc. All rights reserved. 3643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * 4643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Redistribution and use in source and binary forms, with or without 5643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * modification, are permitted provided that the following conditions are 6643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * met: 7643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * 8643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * * Redistributions of source code must retain the above copyright 9643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * notice, this list of conditions and the following disclaimer. 10643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * * Redistributions in binary form must reproduce the above 11643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * copyright notice, this list of conditions and the following disclaimer 12643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * in the documentation and/or other materials provided with the 13643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * distribution. 14643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * * Neither the name of Google Inc. nor the names of its 15643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * contributors may be used to endorse or promote products derived from 16643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * this software without specific prior written permission. 17643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * 18643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29643ca7872b450ea4efacab6188849e5aac2ba161Steve Block */ 30643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 31643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "config.h" 32643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "ResourceHandle.h" 33643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 34ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#include "PlatformBridge.h" 35643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "ResourceHandleClient.h" 36643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "ResourceRequest.h" 37dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "SharedBuffer.h" 38643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 39643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebKit.h" 40643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebKitClient.h" 41643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebURLError.h" 42643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebURLLoader.h" 43643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebURLLoaderClient.h" 44643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebURLRequest.h" 45643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebURLResponse.h" 46643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WrappedResourceRequest.h" 47643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WrappedResourceResponse.h" 48643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 49643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockusing namespace WebKit; 50643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 51643ca7872b450ea4efacab6188849e5aac2ba161Steve Blocknamespace WebCore { 52643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 53643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// ResourceHandleInternal ----------------------------------------------------- 54643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 55643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockclass ResourceHandleInternal : public WebURLLoaderClient { 56643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockpublic: 57643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ResourceHandleInternal(const ResourceRequest& request, ResourceHandleClient* client) 58643ca7872b450ea4efacab6188849e5aac2ba161Steve Block : m_request(request) 59643ca7872b450ea4efacab6188849e5aac2ba161Steve Block , m_owner(0) 60643ca7872b450ea4efacab6188849e5aac2ba161Steve Block , m_client(client) 61dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block , m_state(ConnectionStateNew) 62643ca7872b450ea4efacab6188849e5aac2ba161Steve Block { 63643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 64643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 65643ca7872b450ea4efacab6188849e5aac2ba161Steve Block void start(); 66643ca7872b450ea4efacab6188849e5aac2ba161Steve Block void cancel(); 67643ca7872b450ea4efacab6188849e5aac2ba161Steve Block void setDefersLoading(bool); 68643ca7872b450ea4efacab6188849e5aac2ba161Steve Block bool allowStoredCredentials() const; 69643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 70643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // WebURLLoaderClient methods: 71643ca7872b450ea4efacab6188849e5aac2ba161Steve Block virtual void willSendRequest(WebURLLoader*, WebURLRequest&, const WebURLResponse&); 72643ca7872b450ea4efacab6188849e5aac2ba161Steve Block virtual void didSendData( 73643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WebURLLoader*, unsigned long long bytesSent, unsigned long long totalBytesToBeSent); 74643ca7872b450ea4efacab6188849e5aac2ba161Steve Block virtual void didReceiveResponse(WebURLLoader*, const WebURLResponse&); 752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch virtual void didReceiveData(WebURLLoader*, const char* data, int dataLength, int encodedDataLength); 762bde8e466a4451c7319e3a072d118917957d6554Steve Block 776c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen virtual void didReceiveCachedMetadata(WebURLLoader*, const char* data, int dataLength); 7868513a70bcd92384395513322f1b801e7bf9c729Steve Block virtual void didFinishLoading(WebURLLoader*, double finishTime); 79643ca7872b450ea4efacab6188849e5aac2ba161Steve Block virtual void didFail(WebURLLoader*, const WebURLError&); 80643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 81dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block enum ConnectionState { 82dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ConnectionStateNew, 83dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ConnectionStateStarted, 84dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ConnectionStateReceivedResponse, 85dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ConnectionStateReceivingData, 86dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ConnectionStateFinishedLoading, 87dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ConnectionStateCanceled, 88dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ConnectionStateFailed, 89dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block }; 90dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 91643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ResourceRequest m_request; 92643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ResourceHandle* m_owner; 93643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ResourceHandleClient* m_client; 94643ca7872b450ea4efacab6188849e5aac2ba161Steve Block OwnPtr<WebURLLoader> m_loader; 95dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 96dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Used for sanity checking to make sure we don't experience illegal state 97dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // transitions. 98dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ConnectionState m_state; 99643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}; 100643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 101643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ResourceHandleInternal::start() 102643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 103dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_state != ConnectionStateNew) 104dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block CRASH(); 105dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_state = ConnectionStateStarted; 106dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 107643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_loader.set(webKitClient()->createURLLoader()); 108643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(m_loader.get()); 109643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 110643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WrappedResourceRequest wrappedRequest(m_request); 111643ca7872b450ea4efacab6188849e5aac2ba161Steve Block wrappedRequest.setAllowStoredCredentials(allowStoredCredentials()); 112643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_loader->loadAsynchronously(wrappedRequest, this); 113643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 114643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 115643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ResourceHandleInternal::cancel() 116643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 117dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_state = ConnectionStateCanceled; 118643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_loader->cancel(); 119643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 120643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Do not make any further calls to the client. 121643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_client = 0; 122643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 123643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 124643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ResourceHandleInternal::setDefersLoading(bool value) 125643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 126643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_loader->setDefersLoading(value); 127643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 128643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 129643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool ResourceHandleInternal::allowStoredCredentials() const 130643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 131643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return m_client && m_client->shouldUseCredentialStorage(m_owner); 132643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 133643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 134643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ResourceHandleInternal::willSendRequest( 135643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WebURLLoader*, WebURLRequest& request, const WebURLResponse& response) 136643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 137643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(m_client); 138643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(!request.isNull()); 139643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(!response.isNull()); 140643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_client->willSendRequest(m_owner, request.toMutableResourceRequest(), response.toResourceResponse()); 141643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 142643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 143643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ResourceHandleInternal::didSendData( 144643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WebURLLoader*, unsigned long long bytesSent, unsigned long long totalBytesToBeSent) 145643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 146643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(m_client); 147643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_client->didSendData(m_owner, bytesSent, totalBytesToBeSent); 148643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 149643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 150643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ResourceHandleInternal::didReceiveResponse(WebURLLoader*, const WebURLResponse& response) 151643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 152643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(m_client); 153643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(!response.isNull()); 154dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block bool isMultipart = response.isMultipartPayload(); 155dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block bool isValidStateTransition = (m_state == ConnectionStateStarted || m_state == ConnectionStateReceivedResponse); 156dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // In the case of multipart loads, calls to didReceiveData & didReceiveResponse can be interleaved. 157dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!isMultipart && !isValidStateTransition) 158dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block CRASH(); 159dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_state = ConnectionStateReceivedResponse; 160643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_client->didReceiveResponse(m_owner, response.toResourceResponse()); 161643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 162643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid ResourceHandleInternal::didReceiveData(WebURLLoader*, const char* data, int dataLength, int encodedDataLength) 164643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 165643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(m_client); 166dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_state != ConnectionStateReceivedResponse && m_state != ConnectionStateReceivingData) 167dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block CRASH(); 168dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_state = ConnectionStateReceivingData; 169643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch m_client->didReceiveData(m_owner, data, dataLength, encodedDataLength); 171643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 172643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1736c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenvoid ResourceHandleInternal::didReceiveCachedMetadata(WebURLLoader*, const char* data, int dataLength) 1746c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 1756c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen ASSERT(m_client); 1766c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (m_state != ConnectionStateReceivedResponse && m_state != ConnectionStateReceivingData) 1776c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen CRASH(); 1786c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 1796c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_client->didReceiveCachedMetadata(m_owner, data, dataLength); 1806c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 1816c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 18268513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid ResourceHandleInternal::didFinishLoading(WebURLLoader*, double finishTime) 183643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 184643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(m_client); 185dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_state != ConnectionStateReceivedResponse && m_state != ConnectionStateReceivingData) 186dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block CRASH(); 187dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_state = ConnectionStateFinishedLoading; 18868513a70bcd92384395513322f1b801e7bf9c729Steve Block m_client->didFinishLoading(m_owner, finishTime); 189643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 190643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 191643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ResourceHandleInternal::didFail(WebURLLoader*, const WebURLError& error) 192643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 193643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(m_client); 194dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_state = ConnectionStateFailed; 195643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_client->didFail(m_owner, error); 196643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 197643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 198643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// ResourceHandle ------------------------------------------------------------- 199643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 200643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockResourceHandle::ResourceHandle(const ResourceRequest& request, 201643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ResourceHandleClient* client, 202643ca7872b450ea4efacab6188849e5aac2ba161Steve Block bool defersLoading, 203dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block bool shouldContentSniff) 204643ca7872b450ea4efacab6188849e5aac2ba161Steve Block : d(new ResourceHandleInternal(request, client)) 205643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 206643ca7872b450ea4efacab6188849e5aac2ba161Steve Block d->m_owner = this; 207643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 208643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME: Figure out what to do with the bool params. 209643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 210643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 21168513a70bcd92384395513322f1b801e7bf9c729Steve BlockPassRefPtr<ResourceHandle> ResourceHandle::create(NetworkingContext* context, 21268513a70bcd92384395513322f1b801e7bf9c729Steve Block const ResourceRequest& request, 213643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ResourceHandleClient* client, 214643ca7872b450ea4efacab6188849e5aac2ba161Steve Block bool defersLoading, 215dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block bool shouldContentSniff) 216643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 217643ca7872b450ea4efacab6188849e5aac2ba161Steve Block RefPtr<ResourceHandle> newHandle = adoptRef(new ResourceHandle( 218dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block request, client, defersLoading, shouldContentSniff)); 219643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 22068513a70bcd92384395513322f1b801e7bf9c729Steve Block if (newHandle->start(context)) 221643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return newHandle.release(); 222643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 223643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return 0; 224643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 225643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 226967717af5423377c967781471ee106e2bb4e11c8Ben MurdochResourceRequest& ResourceHandle::firstRequest() 227643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 228643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return d->m_request; 229643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 230643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 231643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockResourceHandleClient* ResourceHandle::client() const 232643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 233643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return d->m_client; 234643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 235643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 236643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ResourceHandle::setClient(ResourceHandleClient* client) 237643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 238643ca7872b450ea4efacab6188849e5aac2ba161Steve Block d->m_client = client; 239643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 240643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 241643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ResourceHandle::setDefersLoading(bool value) 242643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 243643ca7872b450ea4efacab6188849e5aac2ba161Steve Block d->setDefersLoading(value); 244643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 245643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 24668513a70bcd92384395513322f1b801e7bf9c729Steve Blockbool ResourceHandle::start(NetworkingContext* context) 247643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 248643ca7872b450ea4efacab6188849e5aac2ba161Steve Block d->start(); 249643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return true; 250643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 251643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 252967717af5423377c967781471ee106e2bb4e11c8Ben Murdochbool ResourceHandle::hasAuthenticationChallenge() const 253967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{ 254967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch return false; 255967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch} 256967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch 257643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ResourceHandle::clearAuthentication() 258643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 259643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 260643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 261643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ResourceHandle::cancel() 262643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 263643ca7872b450ea4efacab6188849e5aac2ba161Steve Block d->cancel(); 264643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 265643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 266643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockResourceHandle::~ResourceHandle() 267643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 268643ca7872b450ea4efacab6188849e5aac2ba161Steve Block d->m_owner = 0; 269643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 270643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 271643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockPassRefPtr<SharedBuffer> ResourceHandle::bufferedData() 272643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 273643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return 0; 274643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 275643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 276643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool ResourceHandle::loadsBlocked() 277643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 278643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return false; // This seems to be related to sync XMLHttpRequest... 279643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 280643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 281643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// static 282643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool ResourceHandle::supportsBufferedData() 283643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 284643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return false; // The loader will buffer manually if it needs to. 285643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 286643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 287643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// static 28868513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid ResourceHandle::loadResourceSynchronously(NetworkingContext* context, 28968513a70bcd92384395513322f1b801e7bf9c729Steve Block const ResourceRequest& request, 290643ca7872b450ea4efacab6188849e5aac2ba161Steve Block StoredCredentials storedCredentials, 291643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ResourceError& error, 292643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ResourceResponse& response, 29368513a70bcd92384395513322f1b801e7bf9c729Steve Block Vector<char>& data) 294643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 295643ca7872b450ea4efacab6188849e5aac2ba161Steve Block OwnPtr<WebURLLoader> loader(webKitClient()->createURLLoader()); 296643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(loader.get()); 297643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 298643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WrappedResourceRequest requestIn(request); 299643ca7872b450ea4efacab6188849e5aac2ba161Steve Block requestIn.setAllowStoredCredentials(storedCredentials == AllowStoredCredentials); 300643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WrappedResourceResponse responseOut(response); 301643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WebURLError errorOut; 302643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WebData dataOut; 303643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 304643ca7872b450ea4efacab6188849e5aac2ba161Steve Block loader->loadSynchronously(requestIn, responseOut, errorOut, dataOut); 305643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 306643ca7872b450ea4efacab6188849e5aac2ba161Steve Block error = errorOut; 307643ca7872b450ea4efacab6188849e5aac2ba161Steve Block data.clear(); 308643ca7872b450ea4efacab6188849e5aac2ba161Steve Block data.append(dataOut.data(), dataOut.size()); 309643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 310643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 311643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// static 312643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool ResourceHandle::willLoadFromCache(ResourceRequest& request, Frame*) 313643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 314643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // This method is used to determine if a POST request can be repeated from 315643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // cache, but you cannot really know until you actually try to read from the 316643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // cache. Even if we checked now, something else could come along and wipe 317643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // out the cache entry by the time we fetch it. 318643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // 319643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // So, we always say yes here, to prevent the FrameLoader from initiating a 320643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // reload. Then in FrameLoaderClientImpl::dispatchWillSendRequest, we 321643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // fix-up the cache policy of the request to force a load from the cache. 322643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // 323643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(request.httpMethod() == "POST"); 324643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return true; 325643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 326643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3276c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen// static 3286c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenvoid ResourceHandle::cacheMetadata(const ResourceResponse& response, const Vector<char>& data) 3296c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 330ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch PlatformBridge::cacheMetadata(response.url(), response.responseTime(), data); 3316c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 3326c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 333643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} // namespace WebCore 334