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