| 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 "bindings/core/v8/ExceptionState.h" | 7 #include "bindings/core/v8/ExceptionState.h" |
| 8 #include "bindings/core/v8/ScriptPromiseResolver.h" | 8 #include "bindings/core/v8/ScriptPromiseResolver.h" |
| 9 #include "bindings/core/v8/ScriptState.h" | 9 #include "bindings/core/v8/ScriptState.h" |
| 10 #include "bindings/core/v8/V8ThrowException.h" | 10 #include "bindings/core/v8/V8ThrowException.h" |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 #include "modules/fetch/ResponseInit.h" | 31 #include "modules/fetch/ResponseInit.h" |
| 32 #include "platform/HTTPNames.h" | 32 #include "platform/HTTPNames.h" |
| 33 #include "platform/network/ResourceError.h" | 33 #include "platform/network/ResourceError.h" |
| 34 #include "platform/network/ResourceRequest.h" | 34 #include "platform/network/ResourceRequest.h" |
| 35 #include "platform/network/ResourceResponse.h" | 35 #include "platform/network/ResourceResponse.h" |
| 36 #include "platform/weborigin/SchemeRegistry.h" | 36 #include "platform/weborigin/SchemeRegistry.h" |
| 37 #include "platform/weborigin/SecurityOrigin.h" | 37 #include "platform/weborigin/SecurityOrigin.h" |
| 38 #include "platform/weborigin/SecurityPolicy.h" | 38 #include "platform/weborigin/SecurityPolicy.h" |
| 39 #include "public/platform/WebURLRequest.h" | 39 #include "public/platform/WebURLRequest.h" |
| 40 #include "wtf/HashSet.h" | 40 #include "wtf/HashSet.h" |
| 41 #include "wtf/OwnPtr.h" | |
| 42 #include "wtf/Vector.h" | 41 #include "wtf/Vector.h" |
| 43 #include "wtf/text/WTFString.h" | 42 #include "wtf/text/WTFString.h" |
| 43 #include <memory> |
| 44 | 44 |
| 45 namespace blink { | 45 namespace blink { |
| 46 | 46 |
| 47 namespace { | 47 namespace { |
| 48 | 48 |
| 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 { | 56 class FetchManager::Loader final : public GarbageCollectedFinalized<FetchManager
::Loader>, public ThreadableLoaderClient { |
| 57 USING_PRE_FINALIZER(FetchManager::Loader, dispose); | 57 USING_PRE_FINALIZER(FetchManager::Loader, dispose); |
| 58 public: | 58 public: |
| 59 static Loader* create(ExecutionContext* executionContext, FetchManager* fetc
hManager, ScriptPromiseResolver* resolver, FetchRequestData* request, bool isIso
latedWorld) | 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, isI
solatedWorld); | 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&, std::unique_
ptr<WebDataConsumerHandle>) 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; |
| 72 | 72 |
| 73 void start(); | 73 void start(); |
| 74 void dispose(); | 74 void dispose(); |
| 75 | 75 |
| 76 class SRIVerifier final : public GarbageCollectedFinalized<SRIVerifier>, pub
lic WebDataConsumerHandle::Client { | 76 class SRIVerifier final : public GarbageCollectedFinalized<SRIVerifier>, pub
lic WebDataConsumerHandle::Client { |
| 77 public: | 77 public: |
| 78 // Promptly clear m_handle and m_reader. | 78 // Promptly clear m_handle and m_reader. |
| 79 EAGERLY_FINALIZE(); | 79 EAGERLY_FINALIZE(); |
| 80 // SRIVerifier takes ownership of |handle| and |response|. | 80 // SRIVerifier takes ownership of |handle| and |response|. |
| 81 // |updater| must be garbage collected. The other arguments | 81 // |updater| must be garbage collected. The other arguments |
| 82 // all must have the lifetime of the give loader. | 82 // all must have the lifetime of the give loader. |
| 83 SRIVerifier(PassOwnPtr<WebDataConsumerHandle> handle, CompositeDataConsu
merHandle::Updater* updater, Response* response, FetchManager::Loader* loader, S
tring integrityMetadata, const KURL& url) | 83 SRIVerifier(std::unique_ptr<WebDataConsumerHandle> handle, CompositeData
ConsumerHandle::Updater* updater, Response* response, FetchManager::Loader* load
er, String integrityMetadata, const KURL& url) |
| 84 : m_handle(std::move(handle)) | 84 : m_handle(std::move(handle)) |
| 85 , m_updater(updater) | 85 , m_updater(updater) |
| 86 , m_response(response) | 86 , m_response(response) |
| 87 , m_loader(loader) | 87 , m_loader(loader) |
| 88 , m_integrityMetadata(integrityMetadata) | 88 , m_integrityMetadata(integrityMetadata) |
| 89 , m_url(url) | 89 , m_url(url) |
| 90 , m_finished(false) | 90 , m_finished(false) |
| 91 { | 91 { |
| 92 m_reader = m_handle->obtainReader(this); | 92 m_reader = m_handle->obtainReader(this); |
| 93 } | 93 } |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 134 | 134 |
| 135 bool isFinished() const { return m_finished; } | 135 bool isFinished() const { return m_finished; } |
| 136 | 136 |
| 137 DEFINE_INLINE_TRACE() | 137 DEFINE_INLINE_TRACE() |
| 138 { | 138 { |
| 139 visitor->trace(m_updater); | 139 visitor->trace(m_updater); |
| 140 visitor->trace(m_response); | 140 visitor->trace(m_response); |
| 141 visitor->trace(m_loader); | 141 visitor->trace(m_loader); |
| 142 } | 142 } |
| 143 private: | 143 private: |
| 144 OwnPtr<WebDataConsumerHandle> m_handle; | 144 std::unique_ptr<WebDataConsumerHandle> m_handle; |
| 145 Member<CompositeDataConsumerHandle::Updater> m_updater; | 145 Member<CompositeDataConsumerHandle::Updater> m_updater; |
| 146 Member<Response> m_response; | 146 Member<Response> m_response; |
| 147 Member<FetchManager::Loader> m_loader; | 147 Member<FetchManager::Loader> m_loader; |
| 148 String m_integrityMetadata; | 148 String m_integrityMetadata; |
| 149 KURL m_url; | 149 KURL m_url; |
| 150 OwnPtr<WebDataConsumerHandle::Reader> m_reader; | 150 std::unique_ptr<WebDataConsumerHandle::Reader> m_reader; |
| 151 Vector<char> m_buffer; | 151 Vector<char> m_buffer; |
| 152 bool m_finished; | 152 bool m_finished; |
| 153 }; | 153 }; |
| 154 | 154 |
| 155 private: | 155 private: |
| 156 Loader(ExecutionContext*, FetchManager*, ScriptPromiseResolver*, FetchReques
tData*, bool isIsolatedWorld); | 156 Loader(ExecutionContext*, FetchManager*, ScriptPromiseResolver*, FetchReques
tData*, bool isIsolatedWorld); |
| 157 | 157 |
| 158 void performBasicFetch(); | 158 void performBasicFetch(); |
| 159 void performNetworkError(const String& message); | 159 void performNetworkError(const String& message); |
| 160 void performHTTPFetch(bool corsFlag, bool corsPreflightFlag); | 160 void performHTTPFetch(bool corsFlag, bool corsPreflightFlag); |
| 161 void performDataFetch(); | 161 void performDataFetch(); |
| 162 void failed(const String& message); | 162 void failed(const String& message); |
| 163 void notifyFinished(); | 163 void notifyFinished(); |
| 164 Document* document() const; | 164 Document* document() const; |
| 165 void loadSucceeded(); | 165 void loadSucceeded(); |
| 166 | 166 |
| 167 Member<FetchManager> m_fetchManager; | 167 Member<FetchManager> m_fetchManager; |
| 168 Member<ScriptPromiseResolver> m_resolver; | 168 Member<ScriptPromiseResolver> m_resolver; |
| 169 Member<FetchRequestData> m_request; | 169 Member<FetchRequestData> m_request; |
| 170 OwnPtr<ThreadableLoader> m_loader; | 170 std::unique_ptr<ThreadableLoader> m_loader; |
| 171 bool m_failed; | 171 bool m_failed; |
| 172 bool m_finished; | 172 bool m_finished; |
| 173 int m_responseHttpStatusCode; | 173 int m_responseHttpStatusCode; |
| 174 Member<SRIVerifier> m_integrityVerifier; | 174 Member<SRIVerifier> m_integrityVerifier; |
| 175 bool m_didFinishLoading; | 175 bool m_didFinishLoading; |
| 176 bool m_isIsolatedWorld; | 176 bool m_isIsolatedWorld; |
| 177 Member<ExecutionContext> m_executionContext; | 177 Member<ExecutionContext> m_executionContext; |
| 178 }; | 178 }; |
| 179 | 179 |
| 180 FetchManager::Loader::Loader(ExecutionContext* executionContext, FetchManager* f
etchManager, ScriptPromiseResolver* resolver, FetchRequestData* request, bool is
IsolatedWorld) | 180 FetchManager::Loader::Loader(ExecutionContext* executionContext, FetchManager* f
etchManager, ScriptPromiseResolver* resolver, FetchRequestData* request, bool is
IsolatedWorld) |
| (...skipping 18 matching lines...) Expand all Loading... |
| 199 | 199 |
| 200 DEFINE_TRACE(FetchManager::Loader) | 200 DEFINE_TRACE(FetchManager::Loader) |
| 201 { | 201 { |
| 202 visitor->trace(m_fetchManager); | 202 visitor->trace(m_fetchManager); |
| 203 visitor->trace(m_resolver); | 203 visitor->trace(m_resolver); |
| 204 visitor->trace(m_request); | 204 visitor->trace(m_request); |
| 205 visitor->trace(m_integrityVerifier); | 205 visitor->trace(m_integrityVerifier); |
| 206 visitor->trace(m_executionContext); | 206 visitor->trace(m_executionContext); |
| 207 } | 207 } |
| 208 | 208 |
| 209 void FetchManager::Loader::didReceiveResponse(unsigned long, const ResourceRespo
nse& response, PassOwnPtr<WebDataConsumerHandle> handle) | 209 void FetchManager::Loader::didReceiveResponse(unsigned long, const ResourceRespo
nse& response, std::unique_ptr<WebDataConsumerHandle> handle) |
| 210 { | 210 { |
| 211 ASSERT(handle); | 211 ASSERT(handle); |
| 212 | 212 |
| 213 if (response.url().protocolIs("blob") && response.httpStatusCode() == 404) { | 213 if (response.url().protocolIs("blob") && response.httpStatusCode() == 404) { |
| 214 // "If |blob| is null, return a network error." | 214 // "If |blob| is null, return a network error." |
| 215 // https://fetch.spec.whatwg.org/#concept-basic-fetch | 215 // https://fetch.spec.whatwg.org/#concept-basic-fetch |
| 216 performNetworkError("Blob not found."); | 216 performNetworkError("Blob not found."); |
| 217 return; | 217 return; |
| 218 } | 218 } |
| 219 | 219 |
| (...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 555 | 555 |
| 556 // "1. Let |HTTPRequest| be a copy of |request|, except that |HTTPRequest|'s | 556 // "1. Let |HTTPRequest| be a copy of |request|, except that |HTTPRequest|'s |
| 557 // body is a tee of |request|'s body." | 557 // body is a tee of |request|'s body." |
| 558 // We use ResourceRequest class for HTTPRequest. | 558 // We use ResourceRequest class for HTTPRequest. |
| 559 // FIXME: Support body. | 559 // FIXME: Support body. |
| 560 ResourceRequest request(m_request->url()); | 560 ResourceRequest request(m_request->url()); |
| 561 request.setRequestContext(m_request->context()); | 561 request.setRequestContext(m_request->context()); |
| 562 request.setHTTPMethod(m_request->method()); | 562 request.setHTTPMethod(m_request->method()); |
| 563 request.setFetchRequestMode(m_request->mode()); | 563 request.setFetchRequestMode(m_request->mode()); |
| 564 request.setFetchCredentialsMode(m_request->credentials()); | 564 request.setFetchCredentialsMode(m_request->credentials()); |
| 565 const Vector<OwnPtr<FetchHeaderList::Header>>& list = m_request->headerList(
)->list(); | 565 const Vector<std::unique_ptr<FetchHeaderList::Header>>& list = m_request->he
aderList()->list(); |
| 566 for (size_t i = 0; i < list.size(); ++i) { | 566 for (size_t i = 0; i < list.size(); ++i) { |
| 567 request.addHTTPHeaderField(AtomicString(list[i]->first), AtomicString(li
st[i]->second)); | 567 request.addHTTPHeaderField(AtomicString(list[i]->first), AtomicString(li
st[i]->second)); |
| 568 } | 568 } |
| 569 | 569 |
| 570 if (m_request->method() != HTTPNames::GET && m_request->method() != HTTPName
s::HEAD) { | 570 if (m_request->method() != HTTPNames::GET && m_request->method() != HTTPName
s::HEAD) { |
| 571 if (m_request->buffer()) | 571 if (m_request->buffer()) |
| 572 request.setHTTPBody(m_request->buffer()->drainAsFormData()); | 572 request.setHTTPBody(m_request->buffer()->drainAsFormData()); |
| 573 if (m_request->attachedCredential()) | 573 if (m_request->attachedCredential()) |
| 574 request.setAttachedCredential(m_request->attachedCredential()); | 574 request.setAttachedCredential(m_request->attachedCredential()); |
| 575 } | 575 } |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 738 loader->dispose(); | 738 loader->dispose(); |
| 739 } | 739 } |
| 740 | 740 |
| 741 DEFINE_TRACE(FetchManager) | 741 DEFINE_TRACE(FetchManager) |
| 742 { | 742 { |
| 743 visitor->trace(m_loaders); | 743 visitor->trace(m_loaders); |
| 744 ContextLifecycleObserver::trace(visitor); | 744 ContextLifecycleObserver::trace(visitor); |
| 745 } | 745 } |
| 746 | 746 |
| 747 } // namespace blink | 747 } // namespace blink |
| OLD | NEW |