|
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 "WebURLResponse.h" |
|
33 |
|
34 #include "ResourceResponse.h" |
|
35 #include "ResourceLoadTiming.h" |
|
36 |
|
37 #include "WebHTTPHeaderVisitor.h" |
|
38 #include "WebString.h" |
|
39 #include "WebURL.h" |
|
40 #include "WebURLLoadTiming.h" |
|
41 #include "WebURLResponsePrivate.h" |
|
42 |
|
43 #include <wtf/RefPtr.h> |
|
44 |
|
45 using namespace WebCore; |
|
46 |
|
47 namespace WebKit { |
|
48 |
|
49 // The standard implementation of WebURLResponsePrivate, which maintains |
|
50 // ownership of a ResourceResponse instance. |
|
51 class WebURLResponsePrivateImpl : public WebURLResponsePrivate { |
|
52 public: |
|
53 WebURLResponsePrivateImpl() |
|
54 { |
|
55 m_resourceResponse = &m_resourceResponseAllocation; |
|
56 } |
|
57 |
|
58 WebURLResponsePrivateImpl(const WebURLResponsePrivate* p) |
|
59 : m_resourceResponseAllocation(*p->m_resourceResponse) |
|
60 { |
|
61 m_resourceResponse = &m_resourceResponseAllocation; |
|
62 } |
|
63 |
|
64 virtual void dispose() { delete this; } |
|
65 |
|
66 ResourceResponse m_resourceResponseAllocation; |
|
67 }; |
|
68 |
|
69 void WebURLResponse::initialize() |
|
70 { |
|
71 assign(new WebURLResponsePrivateImpl()); |
|
72 } |
|
73 |
|
74 void WebURLResponse::reset() |
|
75 { |
|
76 assign(0); |
|
77 } |
|
78 |
|
79 void WebURLResponse::assign(const WebURLResponse& r) |
|
80 { |
|
81 if (&r != this) |
|
82 assign(r.m_private ? new WebURLResponsePrivateImpl(r.m_private) : 0); |
|
83 } |
|
84 |
|
85 bool WebURLResponse::isNull() const |
|
86 { |
|
87 return !m_private || m_private->m_resourceResponse->isNull(); |
|
88 } |
|
89 |
|
90 WebURL WebURLResponse::url() const |
|
91 { |
|
92 return m_private->m_resourceResponse->url(); |
|
93 } |
|
94 |
|
95 void WebURLResponse::setURL(const WebURL& url) |
|
96 { |
|
97 m_private->m_resourceResponse->setURL(url); |
|
98 } |
|
99 |
|
100 unsigned WebURLResponse::connectionID() const |
|
101 { |
|
102 return m_private->m_resourceResponse->connectionID(); |
|
103 } |
|
104 |
|
105 void WebURLResponse::setConnectionID(unsigned connectionID) |
|
106 { |
|
107 m_private->m_resourceResponse->setConnectionID(connectionID); |
|
108 } |
|
109 |
|
110 bool WebURLResponse::connectionReused() const |
|
111 { |
|
112 return m_private->m_resourceResponse->connectionReused(); |
|
113 } |
|
114 |
|
115 void WebURLResponse::setConnectionReused(bool connectionReused) |
|
116 { |
|
117 m_private->m_resourceResponse->setConnectionReused(connectionReused); |
|
118 } |
|
119 |
|
120 WebURLLoadTiming WebURLResponse::loadTiming() |
|
121 { |
|
122 return WebURLLoadTiming(m_private->m_resourceResponse->resourceLoadTiming()); |
|
123 } |
|
124 |
|
125 void WebURLResponse::setLoadTiming(const WebURLLoadTiming& timing) |
|
126 { |
|
127 RefPtr<ResourceLoadTiming> loadTiming = PassRefPtr<ResourceLoadTiming>(timing); |
|
128 m_private->m_resourceResponse->setResourceLoadTiming(loadTiming.release()); |
|
129 } |
|
130 |
|
131 double WebURLResponse::responseTime() const |
|
132 { |
|
133 return m_private->m_resourceResponse->responseTime(); |
|
134 } |
|
135 |
|
136 void WebURLResponse::setResponseTime(double responseTime) |
|
137 { |
|
138 m_private->m_resourceResponse->setResponseTime(responseTime); |
|
139 } |
|
140 |
|
141 WebString WebURLResponse::mimeType() const |
|
142 { |
|
143 return m_private->m_resourceResponse->mimeType(); |
|
144 } |
|
145 |
|
146 void WebURLResponse::setMIMEType(const WebString& mimeType) |
|
147 { |
|
148 m_private->m_resourceResponse->setMimeType(mimeType); |
|
149 } |
|
150 |
|
151 long long WebURLResponse::expectedContentLength() const |
|
152 { |
|
153 return m_private->m_resourceResponse->expectedContentLength(); |
|
154 } |
|
155 |
|
156 void WebURLResponse::setExpectedContentLength(long long expectedContentLength) |
|
157 { |
|
158 m_private->m_resourceResponse->setExpectedContentLength(expectedContentLength); |
|
159 } |
|
160 |
|
161 WebString WebURLResponse::textEncodingName() const |
|
162 { |
|
163 return m_private->m_resourceResponse->textEncodingName(); |
|
164 } |
|
165 |
|
166 void WebURLResponse::setTextEncodingName(const WebString& textEncodingName) |
|
167 { |
|
168 m_private->m_resourceResponse->setTextEncodingName(textEncodingName); |
|
169 } |
|
170 |
|
171 WebString WebURLResponse::suggestedFileName() const |
|
172 { |
|
173 return m_private->m_resourceResponse->suggestedFilename(); |
|
174 } |
|
175 |
|
176 void WebURLResponse::setSuggestedFileName(const WebString& suggestedFileName) |
|
177 { |
|
178 m_private->m_resourceResponse->setSuggestedFilename(suggestedFileName); |
|
179 } |
|
180 |
|
181 int WebURLResponse::httpStatusCode() const |
|
182 { |
|
183 return m_private->m_resourceResponse->httpStatusCode(); |
|
184 } |
|
185 |
|
186 void WebURLResponse::setHTTPStatusCode(int httpStatusCode) |
|
187 { |
|
188 m_private->m_resourceResponse->setHTTPStatusCode(httpStatusCode); |
|
189 } |
|
190 |
|
191 WebString WebURLResponse::httpStatusText() const |
|
192 { |
|
193 return m_private->m_resourceResponse->httpStatusText(); |
|
194 } |
|
195 |
|
196 void WebURLResponse::setHTTPStatusText(const WebString& httpStatusText) |
|
197 { |
|
198 m_private->m_resourceResponse->setHTTPStatusText(httpStatusText); |
|
199 } |
|
200 |
|
201 WebString WebURLResponse::httpHeaderField(const WebString& name) const |
|
202 { |
|
203 return m_private->m_resourceResponse->httpHeaderField(name); |
|
204 } |
|
205 |
|
206 void WebURLResponse::setHTTPHeaderField(const WebString& name, const WebString& value) |
|
207 { |
|
208 m_private->m_resourceResponse->setHTTPHeaderField(name, value); |
|
209 } |
|
210 |
|
211 void WebURLResponse::addHTTPHeaderField(const WebString& name, const WebString& value) |
|
212 { |
|
213 if (name.isNull() || value.isNull()) |
|
214 return; |
|
215 // FIXME: Add an addHTTPHeaderField method to ResourceResponse. |
|
216 const HTTPHeaderMap& map = m_private->m_resourceResponse->httpHeaderFields(); |
|
217 String valueStr(value); |
|
218 pair<HTTPHeaderMap::iterator, bool> result = |
|
219 const_cast<HTTPHeaderMap*>(&map)->add(name, valueStr); |
|
220 if (!result.second) |
|
221 result.first->second += ", " + valueStr; |
|
222 } |
|
223 |
|
224 void WebURLResponse::clearHTTPHeaderField(const WebString& name) |
|
225 { |
|
226 // FIXME: Add a clearHTTPHeaderField method to ResourceResponse. |
|
227 const HTTPHeaderMap& map = m_private->m_resourceResponse->httpHeaderFields(); |
|
228 const_cast<HTTPHeaderMap*>(&map)->remove(name); |
|
229 } |
|
230 |
|
231 void WebURLResponse::visitHTTPHeaderFields(WebHTTPHeaderVisitor* visitor) const |
|
232 { |
|
233 const HTTPHeaderMap& map = m_private->m_resourceResponse->httpHeaderFields(); |
|
234 for (HTTPHeaderMap::const_iterator it = map.begin(); it != map.end(); ++it) |
|
235 visitor->visitHeader(it->first, it->second); |
|
236 } |
|
237 |
|
238 double WebURLResponse::lastModifiedDate() const |
|
239 { |
|
240 return static_cast<double>(m_private->m_resourceResponse->lastModifiedDate()); |
|
241 } |
|
242 |
|
243 void WebURLResponse::setLastModifiedDate(double lastModifiedDate) |
|
244 { |
|
245 m_private->m_resourceResponse->setLastModifiedDate(static_cast<time_t>(lastModifiedDate)); |
|
246 } |
|
247 |
|
248 bool WebURLResponse::isContentFiltered() const |
|
249 { |
|
250 return m_private->m_resourceResponse->isContentFiltered(); |
|
251 } |
|
252 |
|
253 void WebURLResponse::setIsContentFiltered(bool isContentFiltered) |
|
254 { |
|
255 m_private->m_resourceResponse->setIsContentFiltered(isContentFiltered); |
|
256 } |
|
257 |
|
258 long long WebURLResponse::appCacheID() const |
|
259 { |
|
260 return m_private->m_resourceResponse->appCacheID(); |
|
261 } |
|
262 |
|
263 void WebURLResponse::setAppCacheID(long long appCacheID) |
|
264 { |
|
265 m_private->m_resourceResponse->setAppCacheID(appCacheID); |
|
266 } |
|
267 |
|
268 WebURL WebURLResponse::appCacheManifestURL() const |
|
269 { |
|
270 return m_private->m_resourceResponse->appCacheManifestURL(); |
|
271 } |
|
272 |
|
273 void WebURLResponse::setAppCacheManifestURL(const WebURL& url) |
|
274 { |
|
275 m_private->m_resourceResponse->setAppCacheManifestURL(url); |
|
276 } |
|
277 |
|
278 WebCString WebURLResponse::securityInfo() const |
|
279 { |
|
280 // FIXME: getSecurityInfo is misnamed. |
|
281 return m_private->m_resourceResponse->getSecurityInfo(); |
|
282 } |
|
283 |
|
284 void WebURLResponse::setSecurityInfo(const WebCString& securityInfo) |
|
285 { |
|
286 m_private->m_resourceResponse->setSecurityInfo(securityInfo); |
|
287 } |
|
288 |
|
289 ResourceResponse& WebURLResponse::toMutableResourceResponse() |
|
290 { |
|
291 ASSERT(m_private); |
|
292 ASSERT(m_private->m_resourceResponse); |
|
293 |
|
294 return *m_private->m_resourceResponse; |
|
295 } |
|
296 |
|
297 const ResourceResponse& WebURLResponse::toResourceResponse() const |
|
298 { |
|
299 ASSERT(m_private); |
|
300 ASSERT(m_private->m_resourceResponse); |
|
301 |
|
302 return *m_private->m_resourceResponse; |
|
303 } |
|
304 |
|
305 bool WebURLResponse::wasCached() const |
|
306 { |
|
307 return m_private->m_resourceResponse->wasCached(); |
|
308 } |
|
309 |
|
310 void WebURLResponse::setWasCached(bool value) |
|
311 { |
|
312 m_private->m_resourceResponse->setWasCached(value); |
|
313 } |
|
314 |
|
315 bool WebURLResponse::wasFetchedViaSPDY() const |
|
316 { |
|
317 return m_private->m_resourceResponse->wasFetchedViaSPDY(); |
|
318 } |
|
319 |
|
320 void WebURLResponse::setWasFetchedViaSPDY(bool value) |
|
321 { |
|
322 m_private->m_resourceResponse->setWasFetchedViaSPDY(value); |
|
323 } |
|
324 |
|
325 bool WebURLResponse::wasNpnNegotiated() const |
|
326 { |
|
327 return m_private->m_resourceResponse->wasNpnNegotiated(); |
|
328 } |
|
329 |
|
330 void WebURLResponse::setWasNpnNegotiated(bool value) |
|
331 { |
|
332 m_private->m_resourceResponse->setWasNpnNegotiated(value); |
|
333 } |
|
334 |
|
335 bool WebURLResponse::wasAlternateProtocolAvailable() const |
|
336 { |
|
337 return m_private->m_resourceResponse->wasAlternateProtocolAvailable(); |
|
338 } |
|
339 |
|
340 void WebURLResponse::setWasAlternateProtocolAvailable(bool value) |
|
341 { |
|
342 m_private->m_resourceResponse->setWasAlternateProtocolAvailable(value); |
|
343 } |
|
344 |
|
345 bool WebURLResponse::wasFetchedViaProxy() const |
|
346 { |
|
347 return m_private->m_resourceResponse->wasFetchedViaProxy(); |
|
348 } |
|
349 |
|
350 void WebURLResponse::setWasFetchedViaProxy(bool value) |
|
351 { |
|
352 m_private->m_resourceResponse->setWasFetchedViaProxy(value); |
|
353 } |
|
354 |
|
355 bool WebURLResponse::isMultipartPayload() const |
|
356 { |
|
357 return m_private->m_resourceResponse->isMultipartPayload(); |
|
358 } |
|
359 |
|
360 void WebURLResponse::setIsMultipartPayload(bool value) |
|
361 { |
|
362 m_private->m_resourceResponse->setIsMultipartPayload(value); |
|
363 } |
|
364 |
|
365 WebString WebURLResponse::downloadFilePath() const |
|
366 { |
|
367 return m_private->m_downloadFilePath; |
|
368 } |
|
369 |
|
370 void WebURLResponse::setDownloadFilePath(const WebString& downloadFilePath) |
|
371 { |
|
372 m_private->m_downloadFilePath = downloadFilePath; |
|
373 } |
|
374 |
|
375 void WebURLResponse::assign(WebURLResponsePrivate* p) |
|
376 { |
|
377 // Subclasses may call this directly so a self-assignment check is needed |
|
378 // here as well as in the public assign method. |
|
379 if (m_private == p) |
|
380 return; |
|
381 if (m_private) |
|
382 m_private->dispose(); |
|
383 m_private = p; |
|
384 } |
|
385 |
|
386 } // namespace WebKit |