Home | History | Annotate | Download | only in web
      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 "WebDataSourceImpl.h"
     33 
     34 #include "ApplicationCacheHostInternal.h"
     35 #include "core/dom/Document.h"
     36 #include "core/loader/FrameLoader.h"
     37 #include "public/platform/WebURL.h"
     38 #include "public/platform/WebURLError.h"
     39 #include "public/platform/WebVector.h"
     40 
     41 using namespace WebCore;
     42 
     43 namespace blink {
     44 
     45 static OwnPtr<WebPluginLoadObserver>& nextPluginLoadObserver()
     46 {
     47     DEFINE_STATIC_LOCAL(OwnPtr<WebPluginLoadObserver>, nextPluginLoadObserver, ());
     48     return nextPluginLoadObserver;
     49 }
     50 
     51 PassRefPtr<WebDataSourceImpl> WebDataSourceImpl::create(const ResourceRequest& request, const SubstituteData& data)
     52 {
     53     return adoptRef(new WebDataSourceImpl(request, data));
     54 }
     55 
     56 const WebURLRequest& WebDataSourceImpl::originalRequest() const
     57 {
     58     m_originalRequestWrapper.bind(DocumentLoader::originalRequest());
     59     return m_originalRequestWrapper;
     60 }
     61 
     62 const WebURLRequest& WebDataSourceImpl::request() const
     63 {
     64     m_requestWrapper.bind(DocumentLoader::request());
     65     return m_requestWrapper;
     66 }
     67 
     68 const WebURLResponse& WebDataSourceImpl::response() const
     69 {
     70     m_responseWrapper.bind(DocumentLoader::response());
     71     return m_responseWrapper;
     72 }
     73 
     74 bool WebDataSourceImpl::hasUnreachableURL() const
     75 {
     76     return !DocumentLoader::unreachableURL().isEmpty();
     77 }
     78 
     79 WebURL WebDataSourceImpl::unreachableURL() const
     80 {
     81     return DocumentLoader::unreachableURL();
     82 }
     83 
     84 void WebDataSourceImpl::appendRedirect(const WebURL& url)
     85 {
     86     DocumentLoader::appendRedirect(url);
     87 }
     88 
     89 void WebDataSourceImpl::redirectChain(WebVector<WebURL>& result) const
     90 {
     91     result.assign(m_redirectChain);
     92 }
     93 
     94 bool WebDataSourceImpl::isClientRedirect() const
     95 {
     96     return DocumentLoader::isClientRedirect();
     97 }
     98 
     99 bool WebDataSourceImpl::replacesCurrentHistoryItem() const
    100 {
    101     return DocumentLoader::replacesCurrentHistoryItem();
    102 }
    103 
    104 WebNavigationType WebDataSourceImpl::navigationType() const
    105 {
    106     return toWebNavigationType(triggeringAction().type());
    107 }
    108 
    109 double WebDataSourceImpl::triggeringEventTime() const
    110 {
    111     if (!triggeringAction().event())
    112         return 0.0;
    113 
    114     // DOMTimeStamp uses units of milliseconds.
    115     return convertDOMTimeStampToSeconds(triggeringAction().event()->timeStamp());
    116 }
    117 
    118 WebDataSource::ExtraData* WebDataSourceImpl::extraData() const
    119 {
    120     return m_extraData.get();
    121 }
    122 
    123 void WebDataSourceImpl::setExtraData(ExtraData* extraData)
    124 {
    125     // extraData can't be a PassOwnPtr because setExtraData is a WebKit API function.
    126     m_extraData = adoptPtr(extraData);
    127 }
    128 
    129 WebApplicationCacheHost* WebDataSourceImpl::applicationCacheHost()
    130 {
    131     return ApplicationCacheHostInternal::toWebApplicationCacheHost(DocumentLoader::applicationCacheHost());
    132 }
    133 
    134 void WebDataSourceImpl::setDeferMainResourceDataLoad(bool defer)
    135 {
    136     DocumentLoader::setDeferMainResourceDataLoad(defer);
    137 }
    138 
    139 void WebDataSourceImpl::setNavigationStartTime(double navigationStart)
    140 {
    141     timing()->setNavigationStart(navigationStart);
    142 }
    143 
    144 WebNavigationType WebDataSourceImpl::toWebNavigationType(NavigationType type)
    145 {
    146     switch (type) {
    147     case NavigationTypeLinkClicked:
    148         return WebNavigationTypeLinkClicked;
    149     case NavigationTypeFormSubmitted:
    150         return WebNavigationTypeFormSubmitted;
    151     case NavigationTypeBackForward:
    152         return WebNavigationTypeBackForward;
    153     case NavigationTypeReload:
    154         return WebNavigationTypeReload;
    155     case NavigationTypeFormResubmitted:
    156         return WebNavigationTypeFormResubmitted;
    157     case NavigationTypeOther:
    158     default:
    159         return WebNavigationTypeOther;
    160     }
    161 }
    162 
    163 void WebDataSourceImpl::setNextPluginLoadObserver(PassOwnPtr<WebPluginLoadObserver> observer)
    164 {
    165     nextPluginLoadObserver() = observer;
    166 }
    167 
    168 WebDataSourceImpl::WebDataSourceImpl(const ResourceRequest& request, const SubstituteData& data)
    169     : DocumentLoader(request, data)
    170 {
    171     if (!nextPluginLoadObserver())
    172         return;
    173     // When a new frame is created, it initially gets a data source for an
    174     // empty document. Then it is navigated to the source URL of the
    175     // frame, which results in a second data source being created. We want
    176     // to wait to attach the WebPluginLoadObserver to that data source.
    177     if (request.url().isEmpty())
    178         return;
    179 
    180     ASSERT(nextPluginLoadObserver()->url() == WebURL(request.url()));
    181     m_pluginLoadObserver = nextPluginLoadObserver().release();
    182 }
    183 
    184 WebDataSourceImpl::~WebDataSourceImpl()
    185 {
    186 }
    187 
    188 } // namespace blink
    189