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 |