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