OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 2006, 2007, 2010, 2011 Apple Inc. All rights reserved. | 2 * Copyright (C) 2006, 2007, 2010, 2011 Apple Inc. All rights reserved. |
3 * (C) 2007 Graham Dennis (graham.dennis@gmail.com) | 3 * (C) 2007 Graham Dennis (graham.dennis@gmail.com) |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
7 * are met: | 7 * are met: |
8 * | 8 * |
9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
86 m_loader->setDefersLoading(defersLoading); | 86 m_loader->setDefersLoading(defersLoading); |
87 ASSERT(m_loader); | 87 ASSERT(m_loader); |
88 m_loader->setLoadingTaskRunner(loadingTaskRunner); | 88 m_loader->setLoadingTaskRunner(loadingTaskRunner); |
89 | 89 |
90 if (m_resource->options().synchronousPolicy == RequestSynchronously) | 90 if (m_resource->options().synchronousPolicy == RequestSynchronously) |
91 requestSynchronously(request); | 91 requestSynchronously(request); |
92 else | 92 else |
93 m_loader->loadAsynchronously(WrappedResourceRequest(request), this); | 93 m_loader->loadAsynchronously(WrappedResourceRequest(request), this); |
94 } | 94 } |
95 | 95 |
96 void ResourceLoader::restart(const ResourceRequest& request) | |
hiroshige
2016/07/28 09:56:42
I think the name of |restart| is too general, beca
Nate Chapin
2016/07/28 22:29:35
Renamed to restartForServiceWorkerFallback.
| |
97 { | |
98 m_loader.reset(); | |
99 m_loader = wrapUnique(Platform::current()->createURLLoader()); | |
100 DCHECK(m_loader); | |
101 m_loader->loadAsynchronously(WrappedResourceRequest(request), this); | |
102 } | |
103 | |
96 void ResourceLoader::setDefersLoading(bool defers) | 104 void ResourceLoader::setDefersLoading(bool defers) |
97 { | 105 { |
98 ASSERT(m_loader); | 106 ASSERT(m_loader); |
99 m_loader->setDefersLoading(defers); | 107 m_loader->setDefersLoading(defers); |
100 } | 108 } |
101 | 109 |
102 void ResourceLoader::didDownloadData(WebURLLoader*, int length, int encodedDataL ength) | 110 void ResourceLoader::didDownloadData(WebURLLoader*, int length, int encodedDataL ength) |
103 { | 111 { |
104 m_fetcher->didDownloadData(m_resource.get(), length, encodedDataLength); | 112 m_fetcher->didDownloadData(m_resource.get(), length, encodedDataLength); |
105 m_resource->didDownloadData(length); | 113 m_resource->didDownloadData(length); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
137 void ResourceLoader::didReceiveCachedMetadata(WebURLLoader*, const char* data, i nt length) | 145 void ResourceLoader::didReceiveCachedMetadata(WebURLLoader*, const char* data, i nt length) |
138 { | 146 { |
139 m_resource->setSerializedCachedMetadata(data, length); | 147 m_resource->setSerializedCachedMetadata(data, length); |
140 } | 148 } |
141 | 149 |
142 void ResourceLoader::didSendData(WebURLLoader*, unsigned long long bytesSent, un signed long long totalBytesToBeSent) | 150 void ResourceLoader::didSendData(WebURLLoader*, unsigned long long bytesSent, un signed long long totalBytesToBeSent) |
143 { | 151 { |
144 m_resource->didSendData(bytesSent, totalBytesToBeSent); | 152 m_resource->didSendData(bytesSent, totalBytesToBeSent); |
145 } | 153 } |
146 | 154 |
147 bool ResourceLoader::responseNeedsAccessControlCheck() const | |
148 { | |
149 // If the fetch was (potentially) CORS enabled, an access control check of t he response is required. | |
150 return m_resource->options().corsEnabled == IsCORSEnabled; | |
151 } | |
152 | |
153 void ResourceLoader::didReceiveResponse(WebURLLoader*, const WebURLResponse& res ponse, WebDataConsumerHandle* rawHandle) | 155 void ResourceLoader::didReceiveResponse(WebURLLoader*, const WebURLResponse& res ponse, WebDataConsumerHandle* rawHandle) |
154 { | 156 { |
155 DCHECK(!response.isNull()); | 157 DCHECK(!response.isNull()); |
156 // |rawHandle|'s ownership is transferred to the callee. | 158 // |rawHandle|'s ownership is transferred to the callee. |
157 std::unique_ptr<WebDataConsumerHandle> handle = wrapUnique(rawHandle); | 159 std::unique_ptr<WebDataConsumerHandle> handle = wrapUnique(rawHandle); |
158 const ResourceResponse& resourceResponse = response.toResourceResponse(); | 160 const ResourceResponse& resourceResponse = response.toResourceResponse(); |
159 | 161 if (!m_fetcher->didReceiveResponse(m_resource.get(), resourceResponse)) |
160 if (responseNeedsAccessControlCheck()) { | 162 return; |
161 if (response.wasFetchedViaServiceWorker()) { | |
162 if (response.wasFallbackRequiredByServiceWorker()) { | |
163 m_loader.reset(); | |
164 m_loader = wrapUnique(Platform::current()->createURLLoader()); | |
165 DCHECK(m_loader); | |
166 ResourceRequest request = m_resource->lastResourceRequest(); | |
167 DCHECK_EQ(request.skipServiceWorker(), WebURLRequest::SkipServic eWorker::None); | |
168 // This code handles the case when a regular controlling service worker | |
169 // doesn't handle a cross origin request. When this happens we s till | |
170 // want to give foreign fetch a chance to handle the request, so | |
171 // only skip the controlling service worker for the fallback req uest. | |
172 // This is currently safe because of http://crbug.com/604084 the | |
173 // wasFallbackRequiredByServiceWorker flag is never set when for eign fetch | |
174 // handled a request. | |
175 request.setSkipServiceWorker(WebURLRequest::SkipServiceWorker::C ontrolling); | |
176 m_loader->loadAsynchronously(WrappedResourceRequest(request), th is); | |
177 return; | |
178 } | |
179 } else { | |
180 if (!m_resource->isCacheValidator() || resourceResponse.httpStatusCo de() != 304) | |
181 m_resource->setResponse(resourceResponse); | |
hiroshige
2016/07/28 09:56:42
This CL removes this setResponse(). It's probably
Nate Chapin
2016/07/28 22:29:35
Mostly correct. The only reason it needed to be he
| |
182 if (!m_fetcher->canAccessResource(m_resource.get(), m_resource->opti ons().securityOrigin.get(), response.url(), ResourceFetcher::ShouldLogAccessCont rolErrors)) { | |
183 m_fetcher->didReceiveResponse(m_resource.get(), resourceResponse ); | |
184 didFail(nullptr, ResourceError::cancelledDueToAccessCheckError(K URL(response.url()))); | |
185 return; | |
186 } | |
187 } | |
188 } | |
189 | |
190 m_resource->responseReceived(resourceResponse, std::move(handle)); | 163 m_resource->responseReceived(resourceResponse, std::move(handle)); |
191 if (!m_loader) | 164 if (response.httpStatusCode() >= 400 && !m_resource->shouldIgnoreHTTPStatusC odeErrors()) |
hiroshige
2016/07/28 09:56:42
Do we need |if (!m_loader) return;| before this?
Nate Chapin
2016/07/28 22:29:35
This moved to ResourceFetcher, but add a resource-
| |
192 return; | 165 didFail(nullptr, ResourceError::cancelledError(resourceResponse.url())); |
193 | |
194 m_fetcher->didReceiveResponse(m_resource.get(), resourceResponse); | |
195 if (!m_loader) | |
196 return; | |
197 | |
198 if (m_resource->response().httpStatusCode() < 400 || m_resource->shouldIgnor eHTTPStatusCodeErrors()) | |
199 return; | |
200 didFail(nullptr, ResourceError::cancelledError(resourceResponse.url())); | |
201 } | 166 } |
202 | 167 |
203 void ResourceLoader::didReceiveResponse(WebURLLoader* loader, const WebURLRespon se& response) | 168 void ResourceLoader::didReceiveResponse(WebURLLoader* loader, const WebURLRespon se& response) |
204 { | 169 { |
205 didReceiveResponse(loader, response, nullptr); | 170 didReceiveResponse(loader, response, nullptr); |
206 } | 171 } |
207 | 172 |
208 void ResourceLoader::didReceiveData(WebURLLoader*, const char* data, int length, int encodedDataLength, int encodedBodyLength) | 173 void ResourceLoader::didReceiveData(WebURLLoader*, const char* data, int length, int encodedDataLength, int encodedBodyLength) |
209 { | 174 { |
210 RELEASE_ASSERT(length >= 0); | 175 RELEASE_ASSERT(length >= 0); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
264 // empty buffer is a noop in most cases, but is destructive in the case of | 229 // empty buffer is a noop in most cases, but is destructive in the case of |
265 // a 304, where it will overwrite the cached data we should be reusing. | 230 // a 304, where it will overwrite the cached data we should be reusing. |
266 if (dataOut.size()) { | 231 if (dataOut.size()) { |
267 m_fetcher->didReceiveData(m_resource.get(), dataOut.data(), dataOut.size (), encodedDataLength); | 232 m_fetcher->didReceiveData(m_resource.get(), dataOut.data(), dataOut.size (), encodedDataLength); |
268 m_resource->setResourceBuffer(dataOut); | 233 m_resource->setResourceBuffer(dataOut); |
269 } | 234 } |
270 didFinishLoading(0, monotonicallyIncreasingTime(), encodedDataLength); | 235 didFinishLoading(0, monotonicallyIncreasingTime(), encodedDataLength); |
271 } | 236 } |
272 | 237 |
273 } // namespace blink | 238 } // namespace blink |
OLD | NEW |