OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "modules/fetch/FetchManager.h" | 5 #include "modules/fetch/FetchManager.h" |
6 | 6 |
7 #include "bindings/core/v8/ExceptionState.h" | 7 #include "bindings/core/v8/ExceptionState.h" |
8 #include "bindings/core/v8/ScriptPromiseResolver.h" | 8 #include "bindings/core/v8/ScriptPromiseResolver.h" |
9 #include "bindings/core/v8/ScriptState.h" | 9 #include "bindings/core/v8/ScriptState.h" |
10 #include "bindings/core/v8/V8ThrowException.h" | 10 #include "bindings/core/v8/V8ThrowException.h" |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
136 | 136 |
137 DEFINE_INLINE_TRACE() | 137 DEFINE_INLINE_TRACE() |
138 { | 138 { |
139 visitor->trace(m_updater); | 139 visitor->trace(m_updater); |
140 visitor->trace(m_response); | 140 visitor->trace(m_response); |
141 visitor->trace(m_loader); | 141 visitor->trace(m_loader); |
142 } | 142 } |
143 private: | 143 private: |
144 std::unique_ptr<WebDataConsumerHandle> m_handle; | 144 std::unique_ptr<WebDataConsumerHandle> m_handle; |
145 Member<CompositeDataConsumerHandle::Updater> m_updater; | 145 Member<CompositeDataConsumerHandle::Updater> m_updater; |
| 146 // We cannot store a Response because its JS wrapper can be collected. |
| 147 // TODO(yhirano): Fix this. |
146 Member<Response> m_response; | 148 Member<Response> m_response; |
147 Member<FetchManager::Loader> m_loader; | 149 Member<FetchManager::Loader> m_loader; |
148 String m_integrityMetadata; | 150 String m_integrityMetadata; |
149 KURL m_url; | 151 KURL m_url; |
150 std::unique_ptr<WebDataConsumerHandle::Reader> m_reader; | 152 std::unique_ptr<WebDataConsumerHandle::Reader> m_reader; |
151 Vector<char> m_buffer; | 153 Vector<char> m_buffer; |
152 bool m_finished; | 154 bool m_finished; |
153 }; | 155 }; |
154 | 156 |
155 private: | 157 private: |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
202 visitor->trace(m_fetchManager); | 204 visitor->trace(m_fetchManager); |
203 visitor->trace(m_resolver); | 205 visitor->trace(m_resolver); |
204 visitor->trace(m_request); | 206 visitor->trace(m_request); |
205 visitor->trace(m_integrityVerifier); | 207 visitor->trace(m_integrityVerifier); |
206 visitor->trace(m_executionContext); | 208 visitor->trace(m_executionContext); |
207 } | 209 } |
208 | 210 |
209 void FetchManager::Loader::didReceiveResponse(unsigned long, const ResourceRespo
nse& response, std::unique_ptr<WebDataConsumerHandle> handle) | 211 void FetchManager::Loader::didReceiveResponse(unsigned long, const ResourceRespo
nse& response, std::unique_ptr<WebDataConsumerHandle> handle) |
210 { | 212 { |
211 ASSERT(handle); | 213 ASSERT(handle); |
| 214 ScriptState* scriptState = m_resolver->getScriptState(); |
| 215 ScriptState::Scope scope(scriptState); |
212 | 216 |
213 if (response.url().protocolIs("blob") && response.httpStatusCode() == 404) { | 217 if (response.url().protocolIs("blob") && response.httpStatusCode() == 404) { |
214 // "If |blob| is null, return a network error." | 218 // "If |blob| is null, return a network error." |
215 // https://fetch.spec.whatwg.org/#concept-basic-fetch | 219 // https://fetch.spec.whatwg.org/#concept-basic-fetch |
216 performNetworkError("Blob not found."); | 220 performNetworkError("Blob not found."); |
217 return; | 221 return; |
218 } | 222 } |
219 | 223 |
220 if (response.url().protocolIs("blob") && response.httpStatusCode() == 405) { | 224 if (response.url().protocolIs("blob") && response.httpStatusCode() == 405) { |
221 performNetworkError("Only 'GET' method is allowed for blob URLs."); | 225 performNetworkError("Only 'GET' method is allowed for blob URLs."); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
283 // opaque redirect response. | 287 // opaque redirect response. |
284 case WebServiceWorkerResponseTypeError: | 288 case WebServiceWorkerResponseTypeError: |
285 // When ServiceWorker respond to the request from fetch() with an | 289 // When ServiceWorker respond to the request from fetch() with an |
286 // error response, FetchManager::Loader::didFail() must be called | 290 // error response, FetchManager::Loader::didFail() must be called |
287 // instead. | 291 // instead. |
288 RELEASE_NOTREACHED(); | 292 RELEASE_NOTREACHED(); |
289 break; | 293 break; |
290 } | 294 } |
291 } | 295 } |
292 | 296 |
293 ScriptState* scriptState = m_resolver->getScriptState(); | |
294 FetchResponseData* responseData = nullptr; | 297 FetchResponseData* responseData = nullptr; |
295 CompositeDataConsumerHandle::Updater* updater = nullptr; | 298 CompositeDataConsumerHandle::Updater* updater = nullptr; |
296 if (m_request->integrity().isEmpty()) | 299 if (m_request->integrity().isEmpty()) |
297 responseData = FetchResponseData::createWithBuffer(new BodyStreamBuffer(
scriptState, createFetchDataConsumerHandleFromWebHandle(std::move(handle)))); | 300 responseData = FetchResponseData::createWithBuffer(new BodyStreamBuffer(
scriptState, createFetchDataConsumerHandleFromWebHandle(std::move(handle)))); |
298 else | 301 else |
299 responseData = FetchResponseData::createWithBuffer(new BodyStreamBuffer(
scriptState, createFetchDataConsumerHandleFromWebHandle(CompositeDataConsumerHan
dle::create(createWaitingDataConsumerHandle(), &updater)))); | 302 responseData = FetchResponseData::createWithBuffer(new BodyStreamBuffer(
scriptState, createFetchDataConsumerHandleFromWebHandle(CompositeDataConsumerHan
dle::create(createWaitingDataConsumerHandle(), &updater)))); |
300 responseData->setStatus(response.httpStatusCode()); | 303 responseData->setStatus(response.httpStatusCode()); |
301 responseData->setStatusMessage(response.httpStatusText()); | 304 responseData->setStatusMessage(response.httpStatusText()); |
302 for (auto& it : response.httpHeaderFields()) | 305 for (auto& it : response.httpHeaderFields()) |
303 responseData->headerList()->append(it.key, it.value); | 306 responseData->headerList()->append(it.key, it.value); |
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
738 loader->dispose(); | 741 loader->dispose(); |
739 } | 742 } |
740 | 743 |
741 DEFINE_TRACE(FetchManager) | 744 DEFINE_TRACE(FetchManager) |
742 { | 745 { |
743 visitor->trace(m_loaders); | 746 visitor->trace(m_loaders); |
744 ContextLifecycleObserver::trace(visitor); | 747 ContextLifecycleObserver::trace(visitor); |
745 } | 748 } |
746 | 749 |
747 } // namespace blink | 750 } // namespace blink |
OLD | NEW |