Move testRunner.setTouchDragDropEnabled to internals.settings
[WebKit-https.git] / Source / WebCore / loader / MainResourceLoader.cpp
1 /*
2  * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
3  * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1.  Redistributions of source code must retain the above copyright
10  *     notice, this list of conditions and the following disclaimer. 
11  * 2.  Redistributions in binary form must reproduce the above copyright
12  *     notice, this list of conditions and the following disclaimer in the
13  *     documentation and/or other materials provided with the distribution. 
14  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
15  *     its contributors may be used to endorse or promote products derived
16  *     from this software without specific prior written permission. 
17  *
18  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
19  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
22  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29
30 #include "config.h"
31 #include "MainResourceLoader.h"
32
33 #include "ApplicationCacheHost.h"
34 #include "BackForwardController.h"
35 #include "CachedRawResource.h"
36 #include "CachedResourceLoader.h"
37 #include "CachedResourceRequest.h"
38 #include "Console.h"
39 #include "DOMWindow.h"
40 #include "Document.h"
41 #include "DocumentLoadTiming.h"
42 #include "DocumentLoader.h"
43 #include "FeatureObserver.h"
44 #include "Frame.h"
45 #include "FrameLoader.h"
46 #include "FrameLoaderClient.h"
47 #include "HTMLFormElement.h"
48 #include "HistoryItem.h"
49 #include "InspectorInstrumentation.h"
50 #include "MemoryCache.h"
51 #include "Page.h"
52 #include "ProgressTracker.h"
53 #include "ResourceBuffer.h"
54 #include "ResourceError.h"
55 #include "ResourceHandle.h"
56 #include "SchemeRegistry.h"
57 #include "SecurityOrigin.h"
58 #include "Settings.h"
59 #include "SubresourceLoader.h"
60 #include <wtf/CurrentTime.h>
61
62 #if PLATFORM(QT)
63 #include "PluginDatabase.h"
64 #endif
65
66 namespace WebCore {
67
68 MainResourceLoader::MainResourceLoader(DocumentLoader* documentLoader)
69     : m_documentLoader(documentLoader)
70 {
71 }
72
73 MainResourceLoader::~MainResourceLoader()
74 {
75     clearResource();
76 }
77
78 PassRefPtr<MainResourceLoader> MainResourceLoader::create(DocumentLoader* documentLoader)
79 {
80     return adoptRef(new MainResourceLoader(documentLoader));
81 }
82
83 void MainResourceLoader::clearResource()
84 {
85     if (m_resource) {
86         m_resource->removeClient(this);
87         m_resource = 0;
88     }
89 }
90
91 FrameLoader* MainResourceLoader::frameLoader() const
92 {
93     return m_documentLoader->frameLoader();
94 }
95
96 const ResourceRequest& MainResourceLoader::request() const
97 {
98     return m_resource ? m_resource->resourceRequest() : m_initialRequest;
99 }
100
101 PassRefPtr<ResourceBuffer> MainResourceLoader::resourceData()
102 {
103     if (m_resource)
104         return m_resource->resourceBuffer();
105     return 0;
106 }
107
108 void MainResourceLoader::redirectReceived(CachedResource* resource, ResourceRequest& request, const ResourceResponse& redirectResponse)
109 {
110     ASSERT_UNUSED(resource, resource == m_resource);
111     m_documentLoader->willSendRequest(request, redirectResponse);
112 }
113
114 void MainResourceLoader::responseReceived(CachedResource* resource, const ResourceResponse& r)
115 {
116     ASSERT_UNUSED(resource, m_resource == resource);
117     m_documentLoader->responseReceived(r);
118 }
119
120 void MainResourceLoader::dataReceived(CachedResource* resource, const char* data, int length)
121 {
122     ASSERT_UNUSED(resource, resource == m_resource);
123     documentLoader()->receivedData(data, length);
124 }
125
126 void MainResourceLoader::notifyFinished(CachedResource* resource)
127 {
128     ASSERT_UNUSED(resource, m_resource == resource);
129     ASSERT(m_resource);
130     if (!m_resource->errorOccurred() && !m_resource->wasCanceled()) {
131         documentLoader()->finishedLoading(m_resource->loadFinishTime());
132         return;
133     }
134
135     // FIXME: we should fix the design to eliminate the need for a platform ifdef here
136 #if !PLATFORM(CHROMIUM)
137     if (m_documentLoader->request().cachePolicy() == ReturnCacheDataDontLoad && !m_resource->wasCanceled()) {
138         frameLoader()->retryAfterFailedCacheOnlyMainResourceLoad();
139         return;
140     }
141 #endif
142     m_documentLoader->mainReceivedError(m_resource->resourceError());
143 }
144
145 void MainResourceLoader::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const
146 {
147     MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::Loader);
148     info.addMember(m_resource, "resource");
149     info.addMember(m_initialRequest, "initialRequest");
150     info.addMember(m_documentLoader, "documentLoader");
151 }
152
153 void MainResourceLoader::load(const ResourceRequest& initialRequest)
154 {
155     ResourceRequest request(initialRequest);
156
157     DEFINE_STATIC_LOCAL(ResourceLoaderOptions, mainResourceLoadOptions,
158         (SendCallbacks, SniffContent, BufferData, AllowStoredCredentials, AskClientForCrossOriginCredentials, SkipSecurityCheck));
159     CachedResourceRequest cachedResourceRequest(request, mainResourceLoadOptions);
160     m_resource = documentLoader()->cachedResourceLoader()->requestMainResource(cachedResourceRequest);
161     if (!m_resource) {
162         documentLoader()->setRequest(ResourceRequest());
163         return;
164     }
165     m_resource->addClient(this);
166 }
167
168 void MainResourceLoader::setDefersLoading(bool defers)
169 {
170     if (loader())
171         loader()->setDefersLoading(defers);
172 }
173
174 bool MainResourceLoader::defersLoading() const
175 {
176     return loader() ? loader()->defersLoading() : false;
177 }
178
179 void MainResourceLoader::setDataBufferingPolicy(DataBufferingPolicy dataBufferingPolicy)
180 {
181     if (m_resource)
182         m_resource->setDataBufferingPolicy(dataBufferingPolicy);
183 }
184
185 ResourceLoader* MainResourceLoader::loader() const
186
187     return m_resource ? m_resource->loader() : 0;
188 }
189
190 unsigned long MainResourceLoader::identifier() const
191 {
192     if (ResourceLoader* resourceLoader = loader())
193         return resourceLoader->identifier();
194     return 0;
195 }
196
197 }