Chromium Code Reviews| 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 |