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 <memory> | 7 #include <memory> |
8 #include "bindings/core/v8/ExceptionState.h" | 8 #include "bindings/core/v8/ExceptionState.h" |
9 #include "bindings/core/v8/ScriptPromiseResolver.h" | 9 #include "bindings/core/v8/ScriptPromiseResolver.h" |
10 #include "bindings/core/v8/ScriptState.h" | 10 #include "bindings/core/v8/ScriptState.h" |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
186 updater_(updater), | 186 updater_(updater), |
187 response_(response), | 187 response_(response), |
188 loader_(loader), | 188 loader_(loader), |
189 integrity_metadata_(integrity_metadata), | 189 integrity_metadata_(integrity_metadata), |
190 url_(url), | 190 url_(url), |
191 finished_(false) { | 191 finished_(false) { |
192 reader_ = handle_->ObtainReader(this); | 192 reader_ = handle_->ObtainReader(this); |
193 } | 193 } |
194 | 194 |
195 void DidGetReadable() override { | 195 void DidGetReadable() override { |
196 ASSERT(reader_); | 196 DCHECK(reader_); |
197 ASSERT(loader_); | 197 DCHECK(loader_); |
198 ASSERT(response_); | 198 DCHECK(response_); |
199 | 199 |
200 WebDataConsumerHandle::Result r = WebDataConsumerHandle::kOk; | 200 WebDataConsumerHandle::Result r = WebDataConsumerHandle::kOk; |
201 while (r == WebDataConsumerHandle::kOk) { | 201 while (r == WebDataConsumerHandle::kOk) { |
202 const void* buffer; | 202 const void* buffer; |
203 size_t size; | 203 size_t size; |
204 r = reader_->BeginRead(&buffer, WebDataConsumerHandle::kFlagNone, | 204 r = reader_->BeginRead(&buffer, WebDataConsumerHandle::kFlagNone, |
205 &size); | 205 &size); |
206 if (r == WebDataConsumerHandle::kOk) { | 206 if (r == WebDataConsumerHandle::kOk) { |
207 buffer_.Append(static_cast<const char*>(buffer), size); | 207 buffer_.Append(static_cast<const char*>(buffer), size); |
208 reader_->EndRead(size); | 208 reader_->EndRead(size); |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
302 finished_(false), | 302 finished_(false), |
303 response_http_status_code_(0), | 303 response_http_status_code_(0), |
304 integrity_verifier_(nullptr), | 304 integrity_verifier_(nullptr), |
305 did_finish_loading_(false), | 305 did_finish_loading_(false), |
306 is_isolated_world_(is_isolated_world), | 306 is_isolated_world_(is_isolated_world), |
307 execution_context_(execution_context) { | 307 execution_context_(execution_context) { |
308 url_list_.push_back(request->Url()); | 308 url_list_.push_back(request->Url()); |
309 } | 309 } |
310 | 310 |
311 FetchManager::Loader::~Loader() { | 311 FetchManager::Loader::~Loader() { |
312 ASSERT(!loader_); | 312 DCHECK(!loader_); |
313 } | 313 } |
314 | 314 |
315 DEFINE_TRACE(FetchManager::Loader) { | 315 DEFINE_TRACE(FetchManager::Loader) { |
316 visitor->Trace(fetch_manager_); | 316 visitor->Trace(fetch_manager_); |
317 visitor->Trace(resolver_); | 317 visitor->Trace(resolver_); |
318 visitor->Trace(request_); | 318 visitor->Trace(request_); |
319 visitor->Trace(loader_); | 319 visitor->Trace(loader_); |
320 visitor->Trace(integrity_verifier_); | 320 visitor->Trace(integrity_verifier_); |
321 visitor->Trace(execution_context_); | 321 visitor->Trace(execution_context_); |
322 } | 322 } |
323 | 323 |
324 void FetchManager::Loader::DidReceiveRedirectTo(const KURL& url) { | 324 void FetchManager::Loader::DidReceiveRedirectTo(const KURL& url) { |
325 url_list_.push_back(url); | 325 url_list_.push_back(url); |
326 } | 326 } |
327 | 327 |
328 void FetchManager::Loader::DidReceiveResponse( | 328 void FetchManager::Loader::DidReceiveResponse( |
329 unsigned long, | 329 unsigned long, |
330 const ResourceResponse& response, | 330 const ResourceResponse& response, |
331 std::unique_ptr<WebDataConsumerHandle> handle) { | 331 std::unique_ptr<WebDataConsumerHandle> handle) { |
332 ASSERT(handle); | 332 DCHECK(handle); |
333 // TODO(horo): This check could be false when we will use the response url | 333 // TODO(horo): This check could be false when we will use the response url |
334 // in service worker responses. (crbug.com/553535) | 334 // in service worker responses. (crbug.com/553535) |
335 DCHECK(response.Url() == url_list_.back()); | 335 DCHECK(response.Url() == url_list_.back()); |
336 ScriptState* script_state = resolver_->GetScriptState(); | 336 ScriptState* script_state = resolver_->GetScriptState(); |
337 ScriptState::Scope scope(script_state); | 337 ScriptState::Scope scope(script_state); |
338 | 338 |
339 if (response.Url().ProtocolIs("blob") && response.HttpStatusCode() == 404) { | 339 if (response.Url().ProtocolIs("blob") && response.HttpStatusCode() == 404) { |
340 // "If |blob| is null, return a network error." | 340 // "If |blob| is null, return a network error." |
341 // https://fetch.spec.whatwg.org/#concept-basic-fetch | 341 // https://fetch.spec.whatwg.org/#concept-basic-fetch |
342 PerformNetworkError("Blob not found."); | 342 PerformNetworkError("Blob not found."); |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
486 // whose name is `Content-Type` and value is the MIME type and | 486 // whose name is `Content-Type` and value is the MIME type and |
487 // parameters returned from obtaining a resource" | 487 // parameters returned from obtaining a resource" |
488 r->headers()->HeaderList()->Remove(HTTPNames::Access_Control_Allow_Origin); | 488 r->headers()->HeaderList()->Remove(HTTPNames::Access_Control_Allow_Origin); |
489 } | 489 } |
490 r->headers()->SetGuard(Headers::kImmutableGuard); | 490 r->headers()->SetGuard(Headers::kImmutableGuard); |
491 | 491 |
492 if (request_->Integrity().IsEmpty()) { | 492 if (request_->Integrity().IsEmpty()) { |
493 resolver_->Resolve(r); | 493 resolver_->Resolve(r); |
494 resolver_.Clear(); | 494 resolver_.Clear(); |
495 } else { | 495 } else { |
496 ASSERT(!integrity_verifier_); | 496 DCHECK(!integrity_verifier_); |
497 integrity_verifier_ = | 497 integrity_verifier_ = |
498 new SRIVerifier(std::move(handle), sri_consumer, r, this, | 498 new SRIVerifier(std::move(handle), sri_consumer, r, this, |
499 request_->Integrity(), response.Url()); | 499 request_->Integrity(), response.Url()); |
500 } | 500 } |
501 } | 501 } |
502 | 502 |
503 void FetchManager::Loader::DidFinishLoading(unsigned long, double) { | 503 void FetchManager::Loader::DidFinishLoading(unsigned long, double) { |
504 did_finish_loading_ = true; | 504 did_finish_loading_ = true; |
505 // If there is an integrity verifier, and it has not already finished, it | 505 // If there is an integrity verifier, and it has not already finished, it |
506 // will take care of finishing the load or performing a network error when | 506 // will take care of finishing the load or performing a network error when |
(...skipping 29 matching lines...) Expand all Loading... |
536 } | 536 } |
537 | 537 |
538 Document* FetchManager::Loader::GetDocument() const { | 538 Document* FetchManager::Loader::GetDocument() const { |
539 if (execution_context_->IsDocument()) { | 539 if (execution_context_->IsDocument()) { |
540 return ToDocument(execution_context_); | 540 return ToDocument(execution_context_); |
541 } | 541 } |
542 return nullptr; | 542 return nullptr; |
543 } | 543 } |
544 | 544 |
545 void FetchManager::Loader::LoadSucceeded() { | 545 void FetchManager::Loader::LoadSucceeded() { |
546 ASSERT(!failed_); | 546 DCHECK(!failed_); |
547 | 547 |
548 finished_ = true; | 548 finished_ = true; |
549 | 549 |
550 if (GetDocument() && GetDocument()->GetFrame() && | 550 if (GetDocument() && GetDocument()->GetFrame() && |
551 GetDocument()->GetFrame()->GetPage() && | 551 GetDocument()->GetFrame()->GetPage() && |
552 FetchUtils::IsOkStatus(response_http_status_code_)) { | 552 FetchUtils::IsOkStatus(response_http_status_code_)) { |
553 GetDocument()->GetFrame()->GetPage()->GetChromeClient().AjaxSucceeded( | 553 GetDocument()->GetFrame()->GetPage()->GetChromeClient().AjaxSucceeded( |
554 GetDocument()->GetFrame()); | 554 GetDocument()->GetFrame()); |
555 } | 555 } |
556 probe::didFinishFetch(execution_context_, this, request_->Method(), | 556 probe::didFinishFetch(execution_context_, this, request_->Method(), |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
693 "\" is not supported."); | 693 "\" is not supported."); |
694 } | 694 } |
695 } | 695 } |
696 | 696 |
697 void FetchManager::Loader::PerformNetworkError(const String& message) { | 697 void FetchManager::Loader::PerformNetworkError(const String& message) { |
698 Failed(message); | 698 Failed(message); |
699 } | 699 } |
700 | 700 |
701 void FetchManager::Loader::PerformHTTPFetch(bool cors_flag, | 701 void FetchManager::Loader::PerformHTTPFetch(bool cors_flag, |
702 bool cors_preflight_flag) { | 702 bool cors_preflight_flag) { |
703 ASSERT(SchemeRegistry::ShouldTreatURLSchemeAsSupportingFetchAPI( | 703 DCHECK(SchemeRegistry::ShouldTreatURLSchemeAsSupportingFetchAPI( |
704 request_->Url().Protocol()) || | 704 request_->Url().Protocol()) || |
705 (request_->Url().ProtocolIs("blob") && !cors_flag && | 705 (request_->Url().ProtocolIs("blob") && !cors_flag && |
706 !cors_preflight_flag)); | 706 !cors_preflight_flag)); |
707 // CORS preflight fetch procedure is implemented inside | 707 // CORS preflight fetch procedure is implemented inside |
708 // DocumentThreadableLoader. | 708 // DocumentThreadableLoader. |
709 | 709 |
710 // "1. Let |HTTPRequest| be a copy of |request|, except that |HTTPRequest|'s | 710 // "1. Let |HTTPRequest| be a copy of |request|, except that |HTTPRequest|'s |
711 // body is a tee of |request|'s body." | 711 // body is a tee of |request|'s body." |
712 // We use ResourceRequest class for HTTPRequest. | 712 // We use ResourceRequest class for HTTPRequest. |
713 // FIXME: Support body. | 713 // FIXME: Support body. |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
832 threadable_loader_options, | 832 threadable_loader_options, |
833 resource_loader_options); | 833 resource_loader_options); |
834 loader_->Start(request); | 834 loader_->Start(request); |
835 } | 835 } |
836 | 836 |
837 // performDataFetch() is almost the same as performHTTPFetch(), except for: | 837 // performDataFetch() is almost the same as performHTTPFetch(), except for: |
838 // - We set AllowCrossOriginRequests to allow requests to data: URLs in | 838 // - We set AllowCrossOriginRequests to allow requests to data: URLs in |
839 // 'same-origin' mode. | 839 // 'same-origin' mode. |
840 // - We reject non-GET method. | 840 // - We reject non-GET method. |
841 void FetchManager::Loader::PerformDataFetch() { | 841 void FetchManager::Loader::PerformDataFetch() { |
842 ASSERT(request_->Url().ProtocolIsData()); | 842 DCHECK(request_->Url().ProtocolIsData()); |
843 | 843 |
844 ResourceRequest request(request_->Url()); | 844 ResourceRequest request(request_->Url()); |
845 request.SetRequestContext(request_->Context()); | 845 request.SetRequestContext(request_->Context()); |
846 request.SetUseStreamOnResponse(true); | 846 request.SetUseStreamOnResponse(true); |
847 request.SetHTTPMethod(request_->Method()); | 847 request.SetHTTPMethod(request_->Method()); |
848 request.SetFetchRedirectMode(WebURLRequest::kFetchRedirectModeError); | 848 request.SetFetchRedirectMode(WebURLRequest::kFetchRedirectModeError); |
849 // We intentionally skip 'setExternalRequestStateFromRequestorAddressSpace', | 849 // We intentionally skip 'setExternalRequestStateFromRequestorAddressSpace', |
850 // as 'data:' can never be external. | 850 // as 'data:' can never be external. |
851 | 851 |
852 ResourceLoaderOptions resource_loader_options; | 852 ResourceLoaderOptions resource_loader_options; |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
923 loaders_.erase(loader); | 923 loaders_.erase(loader); |
924 loader->Dispose(); | 924 loader->Dispose(); |
925 } | 925 } |
926 | 926 |
927 DEFINE_TRACE(FetchManager) { | 927 DEFINE_TRACE(FetchManager) { |
928 visitor->Trace(loaders_); | 928 visitor->Trace(loaders_); |
929 ContextLifecycleObserver::Trace(visitor); | 929 ContextLifecycleObserver::Trace(visitor); |
930 } | 930 } |
931 | 931 |
932 } // namespace blink | 932 } // namespace blink |
OLD | NEW |