Home | History | Annotate | Download | only in exported
      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