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 "public/platform/WebURLRequest.h" 33 34 #include "platform/exported/WebURLRequestPrivate.h" 35 #include "platform/network/ResourceRequest.h" 36 #include "public/platform/WebHTTPBody.h" 37 #include "public/platform/WebHTTPHeaderVisitor.h" 38 #include "public/platform/WebURL.h" 39 40 using namespace WebCore; 41 42 namespace blink { 43 44 namespace { 45 46 class ExtraDataContainer : public ResourceRequest::ExtraData { 47 public: 48 static PassRefPtr<ExtraDataContainer> create(WebURLRequest::ExtraData* extraData) { return adoptRef(new ExtraDataContainer(extraData)); } 49 50 virtual ~ExtraDataContainer() { } 51 52 WebURLRequest::ExtraData* extraData() const { return m_extraData.get(); } 53 54 private: 55 explicit ExtraDataContainer(WebURLRequest::ExtraData* extraData) 56 : m_extraData(adoptPtr(extraData)) 57 { 58 } 59 60 OwnPtr<WebURLRequest::ExtraData> m_extraData; 61 }; 62 63 } // namespace 64 65 // The standard implementation of WebURLRequestPrivate, which maintains 66 // ownership of a ResourceRequest instance. 67 class WebURLRequestPrivateImpl : public WebURLRequestPrivate { 68 public: 69 WebURLRequestPrivateImpl() 70 { 71 m_resourceRequest = &m_resourceRequestAllocation; 72 } 73 74 WebURLRequestPrivateImpl(const WebURLRequestPrivate* p) 75 : m_resourceRequestAllocation(*p->m_resourceRequest) 76 { 77 m_resourceRequest = &m_resourceRequestAllocation; 78 } 79 80 virtual void dispose() { delete this; } 81 82 private: 83 virtual ~WebURLRequestPrivateImpl() { } 84 85 ResourceRequest m_resourceRequestAllocation; 86 }; 87 88 void WebURLRequest::initialize() 89 { 90 assign(new WebURLRequestPrivateImpl()); 91 } 92 93 void WebURLRequest::reset() 94 { 95 assign(0); 96 } 97 98 void WebURLRequest::assign(const WebURLRequest& r) 99 { 100 if (&r != this) 101 assign(r.m_private ? new WebURLRequestPrivateImpl(r.m_private) : 0); 102 } 103 104 bool WebURLRequest::isNull() const 105 { 106 return !m_private || m_private->m_resourceRequest->isNull(); 107 } 108 109 WebURL WebURLRequest::url() const 110 { 111 return m_private->m_resourceRequest->url(); 112 } 113 114 void WebURLRequest::setURL(const WebURL& url) 115 { 116 m_private->m_resourceRequest->setURL(url); 117 } 118 119 WebURL WebURLRequest::firstPartyForCookies() const 120 { 121 return m_private->m_resourceRequest->firstPartyForCookies(); 122 } 123 124 void WebURLRequest::setFirstPartyForCookies(const WebURL& firstPartyForCookies) 125 { 126 m_private->m_resourceRequest->setFirstPartyForCookies(firstPartyForCookies); 127 } 128 129 bool WebURLRequest::allowStoredCredentials() const 130 { 131 return m_private->m_resourceRequest->allowStoredCredentials(); 132 } 133 134 void WebURLRequest::setAllowStoredCredentials(bool allowStoredCredentials) 135 { 136 m_private->m_resourceRequest->setAllowStoredCredentials(allowStoredCredentials); 137 } 138 139 WebURLRequest::CachePolicy WebURLRequest::cachePolicy() const 140 { 141 return static_cast<WebURLRequest::CachePolicy>( 142 m_private->m_resourceRequest->cachePolicy()); 143 } 144 145 void WebURLRequest::setCachePolicy(CachePolicy cachePolicy) 146 { 147 m_private->m_resourceRequest->setCachePolicy( 148 static_cast<ResourceRequestCachePolicy>(cachePolicy)); 149 } 150 151 WebString WebURLRequest::httpMethod() const 152 { 153 return m_private->m_resourceRequest->httpMethod(); 154 } 155 156 void WebURLRequest::setHTTPMethod(const WebString& httpMethod) 157 { 158 m_private->m_resourceRequest->setHTTPMethod(httpMethod); 159 } 160 161 WebString WebURLRequest::httpHeaderField(const WebString& name) const 162 { 163 return m_private->m_resourceRequest->httpHeaderField(name); 164 } 165 166 void WebURLRequest::setHTTPHeaderField(const WebString& name, const WebString& value) 167 { 168 RELEASE_ASSERT(!equalIgnoringCase(name, "referer")); 169 m_private->m_resourceRequest->setHTTPHeaderField(name, value); 170 } 171 172 void WebURLRequest::setHTTPReferrer(const WebString& referrer, WebReferrerPolicy referrerPolicy) 173 { 174 if (referrer.isEmpty()) 175 m_private->m_resourceRequest->clearHTTPReferrer(); 176 else 177 m_private->m_resourceRequest->setHTTPReferrer(Referrer(referrer, static_cast<ReferrerPolicy>(referrerPolicy))); 178 } 179 180 void WebURLRequest::addHTTPHeaderField(const WebString& name, const WebString& value) 181 { 182 m_private->m_resourceRequest->addHTTPHeaderField(name, value); 183 } 184 185 void WebURLRequest::clearHTTPHeaderField(const WebString& name) 186 { 187 m_private->m_resourceRequest->clearHTTPHeaderField(name); 188 } 189 190 void WebURLRequest::visitHTTPHeaderFields(WebHTTPHeaderVisitor* visitor) const 191 { 192 const HTTPHeaderMap& map = m_private->m_resourceRequest->httpHeaderFields(); 193 for (HTTPHeaderMap::const_iterator it = map.begin(); it != map.end(); ++it) 194 visitor->visitHeader(it->key, it->value); 195 } 196 197 WebHTTPBody WebURLRequest::httpBody() const 198 { 199 return WebHTTPBody(m_private->m_resourceRequest->httpBody()); 200 } 201 202 void WebURLRequest::setHTTPBody(const WebHTTPBody& httpBody) 203 { 204 m_private->m_resourceRequest->setHTTPBody(httpBody); 205 } 206 207 bool WebURLRequest::reportUploadProgress() const 208 { 209 return m_private->m_resourceRequest->reportUploadProgress(); 210 } 211 212 void WebURLRequest::setReportUploadProgress(bool reportUploadProgress) 213 { 214 m_private->m_resourceRequest->setReportUploadProgress(reportUploadProgress); 215 } 216 217 void WebURLRequest::setReportRawHeaders(bool reportRawHeaders) 218 { 219 m_private->m_resourceRequest->setReportRawHeaders(reportRawHeaders); 220 } 221 222 bool WebURLRequest::reportRawHeaders() const 223 { 224 return m_private->m_resourceRequest->reportRawHeaders(); 225 } 226 227 WebURLRequest::TargetType WebURLRequest::targetType() const 228 { 229 // FIXME: Temporary special case until downstream chromium.org knows of the new TargetTypes. 230 TargetType targetType = static_cast<TargetType>(m_private->m_resourceRequest->targetType()); 231 if (targetType == TargetIsTextTrack || targetType == TargetIsUnspecified) 232 return TargetIsSubresource; 233 return targetType; 234 } 235 236 WebReferrerPolicy WebURLRequest::referrerPolicy() const 237 { 238 return static_cast<WebReferrerPolicy>(m_private->m_resourceRequest->referrerPolicy()); 239 } 240 241 bool WebURLRequest::hasUserGesture() const 242 { 243 return m_private->m_resourceRequest->hasUserGesture(); 244 } 245 246 void WebURLRequest::setHasUserGesture(bool hasUserGesture) 247 { 248 m_private->m_resourceRequest->setHasUserGesture(hasUserGesture); 249 } 250 251 void WebURLRequest::setTargetType(TargetType targetType) 252 { 253 m_private->m_resourceRequest->setTargetType( 254 static_cast<ResourceRequest::TargetType>(targetType)); 255 } 256 257 int WebURLRequest::requestorID() const 258 { 259 return m_private->m_resourceRequest->requestorID(); 260 } 261 262 void WebURLRequest::setRequestorID(int requestorID) 263 { 264 m_private->m_resourceRequest->setRequestorID(requestorID); 265 } 266 267 int WebURLRequest::requestorProcessID() const 268 { 269 return m_private->m_resourceRequest->requestorProcessID(); 270 } 271 272 void WebURLRequest::setRequestorProcessID(int requestorProcessID) 273 { 274 m_private->m_resourceRequest->setRequestorProcessID(requestorProcessID); 275 } 276 277 int WebURLRequest::appCacheHostID() const 278 { 279 return m_private->m_resourceRequest->appCacheHostID(); 280 } 281 282 void WebURLRequest::setAppCacheHostID(int appCacheHostID) 283 { 284 m_private->m_resourceRequest->setAppCacheHostID(appCacheHostID); 285 } 286 287 bool WebURLRequest::downloadToFile() const 288 { 289 return m_private->m_resourceRequest->downloadToFile(); 290 } 291 292 void WebURLRequest::setDownloadToFile(bool downloadToFile) 293 { 294 m_private->m_resourceRequest->setDownloadToFile(downloadToFile); 295 } 296 297 WebURLRequest::ExtraData* WebURLRequest::extraData() const 298 { 299 RefPtr<ResourceRequest::ExtraData> data = m_private->m_resourceRequest->extraData(); 300 if (!data) 301 return 0; 302 return static_cast<ExtraDataContainer*>(data.get())->extraData(); 303 } 304 305 void WebURLRequest::setExtraData(WebURLRequest::ExtraData* extraData) 306 { 307 m_private->m_resourceRequest->setExtraData(ExtraDataContainer::create(extraData)); 308 } 309 310 ResourceRequest& WebURLRequest::toMutableResourceRequest() 311 { 312 ASSERT(m_private); 313 ASSERT(m_private->m_resourceRequest); 314 315 return *m_private->m_resourceRequest; 316 } 317 318 WebURLRequest::Priority WebURLRequest::priority() const 319 { 320 return static_cast<WebURLRequest::Priority>( 321 m_private->m_resourceRequest->priority()); 322 } 323 324 void WebURLRequest::setPriority(WebURLRequest::Priority priority) 325 { 326 m_private->m_resourceRequest->setPriority( 327 static_cast<ResourceLoadPriority>(priority)); 328 } 329 330 const ResourceRequest& WebURLRequest::toResourceRequest() const 331 { 332 ASSERT(m_private); 333 ASSERT(m_private->m_resourceRequest); 334 335 return *m_private->m_resourceRequest; 336 } 337 338 void WebURLRequest::assign(WebURLRequestPrivate* p) 339 { 340 // Subclasses may call this directly so a self-assignment check is needed 341 // here as well as in the public assign method. 342 if (m_private == p) 343 return; 344 if (m_private) 345 m_private->dispose(); 346 m_private = p; 347 } 348 349 } // namespace blink 350