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 |