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 352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
548 referrerURL = document->outgoingReferrer(); | 550 referrerURL = document->outgoingReferrer(); |
549 } else if (executionContext()->isWorkerGlobalScope()) { | 551 } else if (executionContext()->isWorkerGlobalScope()) { |
550 referrerURL = executionContext()->url().strippedForUseAsReferrer(); | 552 referrerURL = executionContext()->url().strippedForUseAsReferrer(); |
551 } | 553 } |
552 request.setHTTPReferrer(SecurityPolicy::generateReferrer(policy, m_reque st->url(), referrerURL)); | 554 request.setHTTPReferrer(SecurityPolicy::generateReferrer(policy, m_reque st->url(), referrerURL)); |
553 } else { | 555 } else { |
554 // Note that generateReferrer generates |no-referrer| from |no-referrer| | 556 // Note that generateReferrer generates |no-referrer| from |no-referrer| |
555 // referrer string (i.e. String()). | 557 // referrer string (i.e. String()). |
556 request.setHTTPReferrer(SecurityPolicy::generateReferrer(policy, m_reque st->url(), m_request->referrerString())); | 558 request.setHTTPReferrer(SecurityPolicy::generateReferrer(policy, m_reque st->url(), m_request->referrerString())); |
557 } | 559 } |
560 request.setSkipServiceWorker(m_isIsolatedWorld); | |
Mike West
2015/11/05 08:27:27
Doesn't this override the setting in cases where w
horo
2015/11/05 08:47:10
No.
DocumentThreadableLoader calls createAccessCon
| |
558 | 561 |
559 // "3. Append `Host`, ..." | 562 // "3. Append `Host`, ..." |
560 // FIXME: Implement this when the spec is fixed. | 563 // FIXME: Implement this when the spec is fixed. |
561 | 564 |
562 // "4.If |HTTPRequest|'s force Origin header flag is set, append `Origin`/ | 565 // "4.If |HTTPRequest|'s force Origin header flag is set, append `Origin`/ |
563 // |HTTPRequest|'s origin, serialized and utf-8 encoded, to |HTTPRequest|'s | 566 // |HTTPRequest|'s origin, serialized and utf-8 encoded, to |HTTPRequest|'s |
564 // header list." | 567 // header list." |
565 // We set Origin header in updateRequestForAccessControl() called from | 568 // We set Origin header in updateRequestForAccessControl() called from |
566 // DocumentThreadableLoader::makeCrossOriginAccessRequest | 569 // DocumentThreadableLoader::makeCrossOriginAccessRequest |
567 | 570 |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
673 #endif | 676 #endif |
674 } | 677 } |
675 | 678 |
676 ScriptPromise FetchManager::fetch(ScriptState* scriptState, FetchRequestData* re quest) | 679 ScriptPromise FetchManager::fetch(ScriptState* scriptState, FetchRequestData* re quest) |
677 { | 680 { |
678 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; | 681 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; |
679 ScriptPromise promise = resolver->promise(); | 682 ScriptPromise promise = resolver->promise(); |
680 | 683 |
681 request->setContext(WebURLRequest::RequestContextFetch); | 684 request->setContext(WebURLRequest::RequestContextFetch); |
682 | 685 |
683 Loader* loader = Loader::create(m_executionContext, this, resolver, request) ; | 686 Loader* loader = Loader::create(m_executionContext, this, resolver, request, scriptState->world().isIsolatedWorld()); |
684 m_loaders.add(loader); | 687 m_loaders.add(loader); |
685 loader->start(); | 688 loader->start(); |
686 return promise; | 689 return promise; |
687 } | 690 } |
688 | 691 |
689 void FetchManager::stop() | 692 void FetchManager::stop() |
690 { | 693 { |
691 ASSERT(!m_isStopped); | 694 ASSERT(!m_isStopped); |
692 m_isStopped = true; | 695 m_isStopped = true; |
693 for (auto& loader : m_loaders) | 696 for (auto& loader : m_loaders) |
694 loader->dispose(); | 697 loader->dispose(); |
695 } | 698 } |
696 | 699 |
697 void FetchManager::onLoaderFinished(Loader* loader) | 700 void FetchManager::onLoaderFinished(Loader* loader) |
698 { | 701 { |
699 m_loaders.remove(loader); | 702 m_loaders.remove(loader); |
700 loader->dispose(); | 703 loader->dispose(); |
701 } | 704 } |
702 | 705 |
703 DEFINE_TRACE(FetchManager) | 706 DEFINE_TRACE(FetchManager) |
704 { | 707 { |
705 visitor->trace(m_executionContext); | 708 visitor->trace(m_executionContext); |
706 visitor->trace(m_loaders); | 709 visitor->trace(m_loaders); |
707 } | 710 } |
708 | 711 |
709 } // namespace blink | 712 } // namespace blink |
OLD | NEW |