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