| 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 "config.h" | 5 #include "config.h" |
| 6 #include "modules/fetch/FetchManager.h" | 6 #include "modules/fetch/FetchManager.h" |
| 7 | 7 |
| 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 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 49 bool IsRedirectStatusCode(int statusCode) | 49 bool IsRedirectStatusCode(int statusCode) |
| 50 { | 50 { |
| 51 return (statusCode == 301 || statusCode == 302 || statusCode == 303 || statu
sCode == 307 || statusCode == 308); | 51 return (statusCode == 301 || statusCode == 302 || statusCode == 303 || statu
sCode == 307 || statusCode == 308); |
| 52 } | 52 } |
| 53 | 53 |
| 54 } // namespace | 54 } // namespace |
| 55 | 55 |
| 56 class FetchManager::Loader final : public GarbageCollectedFinalized<FetchManager
::Loader>, public ThreadableLoaderClient, public ContextLifecycleObserver { | 56 class FetchManager::Loader final : public GarbageCollectedFinalized<FetchManager
::Loader>, public ThreadableLoaderClient, public ContextLifecycleObserver { |
| 57 WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(FetchManager::Loader); | 57 WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(FetchManager::Loader); |
| 58 public: | 58 public: |
| 59 static Loader* create(ExecutionContext* executionContext, FetchManager* fetc
hManager, ScriptPromiseResolver* resolver, FetchRequestData* request) | 59 static Loader* create(ExecutionContext* executionContext, FetchManager* fetc
hManager, ScriptPromiseResolver* resolver, FetchRequestData* request, bool isIso
latedWorld) |
| 60 { | 60 { |
| 61 return new Loader(executionContext, fetchManager, resolver, request); | 61 return new Loader(executionContext, fetchManager, resolver, request, isI
solatedWorld); |
| 62 } | 62 } |
| 63 | 63 |
| 64 ~Loader() override; | 64 ~Loader() override; |
| 65 DECLARE_VIRTUAL_TRACE(); | 65 DECLARE_VIRTUAL_TRACE(); |
| 66 | 66 |
| 67 void didReceiveResponse(unsigned long, const ResourceResponse&, PassOwnPtr<W
ebDataConsumerHandle>) override; | 67 void didReceiveResponse(unsigned long, const ResourceResponse&, PassOwnPtr<W
ebDataConsumerHandle>) override; |
| 68 void didFinishLoading(unsigned long, double) override; | 68 void didFinishLoading(unsigned long, double) override; |
| 69 void didFail(const ResourceError&) override; | 69 void didFail(const ResourceError&) override; |
| 70 void didFailAccessControlCheck(const ResourceError&) override; | 70 void didFailAccessControlCheck(const ResourceError&) override; |
| 71 void didFailRedirectCheck() override; | 71 void didFailRedirectCheck() override; |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 144 Member<Response> m_response; | 144 Member<Response> m_response; |
| 145 Member<FetchManager::Loader> m_loader; | 145 Member<FetchManager::Loader> m_loader; |
| 146 String m_integrityMetadata; | 146 String m_integrityMetadata; |
| 147 KURL m_url; | 147 KURL m_url; |
| 148 OwnPtr<WebDataConsumerHandle::Reader> m_reader; | 148 OwnPtr<WebDataConsumerHandle::Reader> m_reader; |
| 149 Vector<char> m_buffer; | 149 Vector<char> m_buffer; |
| 150 bool m_finished; | 150 bool m_finished; |
| 151 }; | 151 }; |
| 152 | 152 |
| 153 private: | 153 private: |
| 154 Loader(ExecutionContext*, FetchManager*, ScriptPromiseResolver*, FetchReques
tData*); | 154 Loader(ExecutionContext*, FetchManager*, ScriptPromiseResolver*, FetchReques
tData*, bool isIsolatedWorld); |
| 155 | 155 |
| 156 void performBasicFetch(); | 156 void performBasicFetch(); |
| 157 void performNetworkError(const String& message); | 157 void performNetworkError(const String& message); |
| 158 void performHTTPFetch(bool corsFlag, bool corsPreflightFlag); | 158 void performHTTPFetch(bool corsFlag, bool corsPreflightFlag); |
| 159 void performDataFetch(); | 159 void performDataFetch(); |
| 160 void failed(const String& message); | 160 void failed(const String& message); |
| 161 void notifyFinished(); | 161 void notifyFinished(); |
| 162 Document* document() const; | 162 Document* document() const; |
| 163 void loadSucceeded(); | 163 void loadSucceeded(); |
| 164 | 164 |
| 165 Member<FetchManager> m_fetchManager; | 165 Member<FetchManager> m_fetchManager; |
| 166 Member<ScriptPromiseResolver> m_resolver; | 166 Member<ScriptPromiseResolver> m_resolver; |
| 167 Member<FetchRequestData> m_request; | 167 Member<FetchRequestData> m_request; |
| 168 RefPtr<ThreadableLoader> m_loader; | 168 RefPtr<ThreadableLoader> m_loader; |
| 169 bool m_failed; | 169 bool m_failed; |
| 170 bool m_finished; | 170 bool m_finished; |
| 171 int m_responseHttpStatusCode; | 171 int m_responseHttpStatusCode; |
| 172 Member<SRIVerifier> m_integrityVerifier; | 172 Member<SRIVerifier> m_integrityVerifier; |
| 173 bool m_didFinishLoading; | 173 bool m_didFinishLoading; |
| 174 bool m_isIsolatedWorld; |
| 174 }; | 175 }; |
| 175 | 176 |
| 176 FetchManager::Loader::Loader(ExecutionContext* executionContext, FetchManager* f
etchManager, ScriptPromiseResolver* resolver, FetchRequestData* request) | 177 FetchManager::Loader::Loader(ExecutionContext* executionContext, FetchManager* f
etchManager, ScriptPromiseResolver* resolver, FetchRequestData* request, bool is
IsolatedWorld) |
| 177 : ContextLifecycleObserver(executionContext) | 178 : ContextLifecycleObserver(executionContext) |
| 178 , m_fetchManager(fetchManager) | 179 , m_fetchManager(fetchManager) |
| 179 , m_resolver(resolver) | 180 , m_resolver(resolver) |
| 180 , m_request(request) | 181 , m_request(request) |
| 181 , m_failed(false) | 182 , m_failed(false) |
| 182 , m_finished(false) | 183 , m_finished(false) |
| 183 , m_responseHttpStatusCode(0) | 184 , m_responseHttpStatusCode(0) |
| 184 , m_integrityVerifier(nullptr) | 185 , m_integrityVerifier(nullptr) |
| 185 , m_didFinishLoading(false) | 186 , m_didFinishLoading(false) |
| 187 , m_isIsolatedWorld(isIsolatedWorld) |
| 186 { | 188 { |
| 187 } | 189 } |
| 188 | 190 |
| 189 FetchManager::Loader::~Loader() | 191 FetchManager::Loader::~Loader() |
| 190 { | 192 { |
| 191 ASSERT(!m_loader); | 193 ASSERT(!m_loader); |
| 192 } | 194 } |
| 193 | 195 |
| 194 DEFINE_TRACE(FetchManager::Loader) | 196 DEFINE_TRACE(FetchManager::Loader) |
| 195 { | 197 { |
| (...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 554 referrerURL = document->outgoingReferrer(); | 556 referrerURL = document->outgoingReferrer(); |
| 555 } else if (executionContext()->isWorkerGlobalScope()) { | 557 } else if (executionContext()->isWorkerGlobalScope()) { |
| 556 referrerURL = executionContext()->url().strippedForUseAsReferrer(); | 558 referrerURL = executionContext()->url().strippedForUseAsReferrer(); |
| 557 } | 559 } |
| 558 request.setHTTPReferrer(SecurityPolicy::generateReferrer(policy, m_reque
st->url(), referrerURL)); | 560 request.setHTTPReferrer(SecurityPolicy::generateReferrer(policy, m_reque
st->url(), referrerURL)); |
| 559 } else { | 561 } else { |
| 560 // Note that generateReferrer generates |no-referrer| from |no-referrer| | 562 // Note that generateReferrer generates |no-referrer| from |no-referrer| |
| 561 // referrer string (i.e. String()). | 563 // referrer string (i.e. String()). |
| 562 request.setHTTPReferrer(SecurityPolicy::generateReferrer(policy, m_reque
st->url(), m_request->referrerString())); | 564 request.setHTTPReferrer(SecurityPolicy::generateReferrer(policy, m_reque
st->url(), m_request->referrerString())); |
| 563 } | 565 } |
| 566 request.setSkipServiceWorker(m_isIsolatedWorld); |
| 564 | 567 |
| 565 // "3. Append `Host`, ..." | 568 // "3. Append `Host`, ..." |
| 566 // FIXME: Implement this when the spec is fixed. | 569 // FIXME: Implement this when the spec is fixed. |
| 567 | 570 |
| 568 // "4.If |HTTPRequest|'s force Origin header flag is set, append `Origin`/ | 571 // "4.If |HTTPRequest|'s force Origin header flag is set, append `Origin`/ |
| 569 // |HTTPRequest|'s origin, serialized and utf-8 encoded, to |HTTPRequest|'s | 572 // |HTTPRequest|'s origin, serialized and utf-8 encoded, to |HTTPRequest|'s |
| 570 // header list." | 573 // header list." |
| 571 // We set Origin header in updateRequestForAccessControl() called from | 574 // We set Origin header in updateRequestForAccessControl() called from |
| 572 // DocumentThreadableLoader::makeCrossOriginAccessRequest | 575 // DocumentThreadableLoader::makeCrossOriginAccessRequest |
| 573 | 576 |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 684 #endif | 687 #endif |
| 685 } | 688 } |
| 686 | 689 |
| 687 ScriptPromise FetchManager::fetch(ScriptState* scriptState, FetchRequestData* re
quest) | 690 ScriptPromise FetchManager::fetch(ScriptState* scriptState, FetchRequestData* re
quest) |
| 688 { | 691 { |
| 689 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 692 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 690 ScriptPromise promise = resolver->promise(); | 693 ScriptPromise promise = resolver->promise(); |
| 691 | 694 |
| 692 request->setContext(WebURLRequest::RequestContextFetch); | 695 request->setContext(WebURLRequest::RequestContextFetch); |
| 693 | 696 |
| 694 Loader* loader = Loader::create(m_executionContext, this, resolver, request)
; | 697 Loader* loader = Loader::create(m_executionContext, this, resolver, request,
scriptState->world().isIsolatedWorld()); |
| 695 m_loaders.add(loader); | 698 m_loaders.add(loader); |
| 696 loader->start(); | 699 loader->start(); |
| 697 return promise; | 700 return promise; |
| 698 } | 701 } |
| 699 | 702 |
| 700 void FetchManager::stop() | 703 void FetchManager::stop() |
| 701 { | 704 { |
| 702 ASSERT(!m_isStopped); | 705 ASSERT(!m_isStopped); |
| 703 m_isStopped = true; | 706 m_isStopped = true; |
| 704 for (auto& loader : m_loaders) | 707 for (auto& loader : m_loaders) |
| 705 loader->dispose(); | 708 loader->dispose(); |
| 706 } | 709 } |
| 707 | 710 |
| 708 void FetchManager::onLoaderFinished(Loader* loader) | 711 void FetchManager::onLoaderFinished(Loader* loader) |
| 709 { | 712 { |
| 710 m_loaders.remove(loader); | 713 m_loaders.remove(loader); |
| 711 loader->dispose(); | 714 loader->dispose(); |
| 712 } | 715 } |
| 713 | 716 |
| 714 DEFINE_TRACE(FetchManager) | 717 DEFINE_TRACE(FetchManager) |
| 715 { | 718 { |
| 716 visitor->trace(m_executionContext); | 719 visitor->trace(m_executionContext); |
| 717 visitor->trace(m_loaders); | 720 visitor->trace(m_loaders); |
| 718 } | 721 } |
| 719 | 722 |
| 720 } // namespace blink | 723 } // namespace blink |
| OLD | NEW |