Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(15)

Side by Side Diff: third_party/WebKit/Source/modules/fetch/Response.cpp

Issue 2815313002: Reland of Move ScriptState::GetExecutionContext (Part 5) (Closed)
Patch Set: Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/Response.h" 5 #include "modules/fetch/Response.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include "bindings/core/v8/Dictionary.h" 8 #include "bindings/core/v8/Dictionary.h"
9 #include "bindings/core/v8/ExceptionState.h" 9 #include "bindings/core/v8/ExceptionState.h"
10 #include "bindings/core/v8/ScriptState.h" 10 #include "bindings/core/v8/ScriptState.h"
11 #include "bindings/core/v8/V8ArrayBuffer.h" 11 #include "bindings/core/v8/V8ArrayBuffer.h"
12 #include "bindings/core/v8/V8ArrayBufferView.h" 12 #include "bindings/core/v8/V8ArrayBufferView.h"
13 #include "bindings/core/v8/V8Binding.h" 13 #include "bindings/core/v8/V8Binding.h"
14 #include "bindings/core/v8/V8Blob.h" 14 #include "bindings/core/v8/V8Blob.h"
15 #include "bindings/core/v8/V8FormData.h" 15 #include "bindings/core/v8/V8FormData.h"
16 #include "bindings/core/v8/V8PrivateProperty.h" 16 #include "bindings/core/v8/V8PrivateProperty.h"
17 #include "bindings/core/v8/V8URLSearchParams.h" 17 #include "bindings/core/v8/V8URLSearchParams.h"
18 #include "bindings/modules/v8/ByteStringSequenceSequenceOrByteStringByteStringRe cordOrHeaders.h" 18 #include "bindings/modules/v8/ByteStringSequenceSequenceOrByteStringByteStringRe cordOrHeaders.h"
19 #include "core/dom/DOMArrayBuffer.h" 19 #include "core/dom/DOMArrayBuffer.h"
20 #include "core/dom/DOMArrayBufferView.h" 20 #include "core/dom/DOMArrayBufferView.h"
21 #include "core/dom/ExecutionContext.h"
21 #include "core/dom/URLSearchParams.h" 22 #include "core/dom/URLSearchParams.h"
22 #include "core/fileapi/Blob.h" 23 #include "core/fileapi/Blob.h"
23 #include "core/frame/UseCounter.h" 24 #include "core/frame/UseCounter.h"
24 #include "core/html/FormData.h" 25 #include "core/html/FormData.h"
25 #include "core/streams/ReadableStreamOperations.h" 26 #include "core/streams/ReadableStreamOperations.h"
26 #include "modules/fetch/BlobBytesConsumer.h" 27 #include "modules/fetch/BlobBytesConsumer.h"
27 #include "modules/fetch/BodyStreamBuffer.h" 28 #include "modules/fetch/BodyStreamBuffer.h"
28 #include "modules/fetch/FormDataBytesConsumer.h" 29 #include "modules/fetch/FormDataBytesConsumer.h"
29 #include "modules/fetch/ResponseInit.h" 30 #include "modules/fetch/ResponseInit.h"
30 #include "platform/loader/fetch/FetchUtils.h" 31 #include "platform/loader/fetch/FetchUtils.h"
(...skipping 26 matching lines...) Expand all
57 response->SetResponseTime(web_response.ResponseTime()); 58 response->SetResponseTime(web_response.ResponseTime());
58 response->SetCacheStorageCacheName(web_response.CacheStorageCacheName()); 59 response->SetCacheStorageCacheName(web_response.CacheStorageCacheName());
59 60
60 for (HTTPHeaderMap::const_iterator i = web_response.Headers().begin(), 61 for (HTTPHeaderMap::const_iterator i = web_response.Headers().begin(),
61 end = web_response.Headers().end(); 62 end = web_response.Headers().end();
62 i != end; ++i) { 63 i != end; ++i) {
63 response->HeaderList()->Append(i->key, i->value); 64 response->HeaderList()->Append(i->key, i->value);
64 } 65 }
65 66
66 response->ReplaceBodyStreamBuffer(new BodyStreamBuffer( 67 response->ReplaceBodyStreamBuffer(new BodyStreamBuffer(
67 script_state, new BlobBytesConsumer(script_state->GetExecutionContext(), 68 script_state, new BlobBytesConsumer(ExecutionContext::From(script_state),
68 web_response.GetBlobDataHandle()))); 69 web_response.GetBlobDataHandle())));
69 70
70 // Filter the response according to |webResponse|'s ResponseType. 71 // Filter the response according to |webResponse|'s ResponseType.
71 switch (web_response.ResponseType()) { 72 switch (web_response.ResponseType()) {
72 case kWebServiceWorkerResponseTypeBasic: 73 case kWebServiceWorkerResponseTypeBasic:
73 response = response->CreateBasicFilteredResponse(); 74 response = response->CreateBasicFilteredResponse();
74 break; 75 break;
75 case kWebServiceWorkerResponseTypeCORS: { 76 case kWebServiceWorkerResponseTypeCORS: {
76 HTTPHeaderSet header_names; 77 HTTPHeaderSet header_names;
77 for (const auto& header : web_response.CorsExposedHeaderNames()) 78 for (const auto& header : web_response.CorsExposedHeaderNames())
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
127 return Create(script_state, nullptr, String(), ResponseInit(), 128 return Create(script_state, nullptr, String(), ResponseInit(),
128 exception_state); 129 exception_state);
129 } 130 }
130 131
131 Response* Response::Create(ScriptState* script_state, 132 Response* Response::Create(ScriptState* script_state,
132 ScriptValue body_value, 133 ScriptValue body_value,
133 const ResponseInit& init, 134 const ResponseInit& init,
134 ExceptionState& exception_state) { 135 ExceptionState& exception_state) {
135 v8::Local<v8::Value> body = body_value.V8Value(); 136 v8::Local<v8::Value> body = body_value.V8Value();
136 v8::Isolate* isolate = script_state->GetIsolate(); 137 v8::Isolate* isolate = script_state->GetIsolate();
137 ExecutionContext* execution_context = script_state->GetExecutionContext(); 138 ExecutionContext* execution_context = ExecutionContext::From(script_state);
138 139
139 BodyStreamBuffer* body_buffer = nullptr; 140 BodyStreamBuffer* body_buffer = nullptr;
140 String content_type; 141 String content_type;
141 if (body_value.IsUndefined() || body_value.IsNull()) { 142 if (body_value.IsUndefined() || body_value.IsNull()) {
142 // Note: The IDL processor cannot handle this situation. See 143 // Note: The IDL processor cannot handle this situation. See
143 // https://crbug.com/335871. 144 // https://crbug.com/335871.
144 } else if (V8Blob::hasInstance(body, isolate)) { 145 } else if (V8Blob::hasInstance(body, isolate)) {
145 Blob* blob = V8Blob::toImpl(body.As<v8::Object>()); 146 Blob* blob = V8Blob::toImpl(body.As<v8::Object>());
146 body_buffer = new BodyStreamBuffer( 147 body_buffer = new BodyStreamBuffer(
147 script_state, 148 script_state,
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 208
208 // "2. If |init|'s statusText member does not match the Reason-Phrase 209 // "2. If |init|'s statusText member does not match the Reason-Phrase
209 // token production, throw a TypeError." 210 // token production, throw a TypeError."
210 if (!IsValidReasonPhrase(init.statusText())) { 211 if (!IsValidReasonPhrase(init.statusText())) {
211 exception_state.ThrowTypeError("Invalid statusText"); 212 exception_state.ThrowTypeError("Invalid statusText");
212 return nullptr; 213 return nullptr;
213 } 214 }
214 215
215 // "3. Let |r| be a new Response object, associated with a new response, 216 // "3. Let |r| be a new Response object, associated with a new response,
216 // Headers object, and Body object." 217 // Headers object, and Body object."
217 Response* r = new Response(script_state->GetExecutionContext()); 218 Response* r = new Response(ExecutionContext::From(script_state));
218 219
219 // "4. Set |r|'s response's status to |init|'s status member." 220 // "4. Set |r|'s response's status to |init|'s status member."
220 r->response_->SetStatus(init.status()); 221 r->response_->SetStatus(init.status());
221 222
222 // "5. Set |r|'s response's status message to |init|'s statusText member." 223 // "5. Set |r|'s response's status message to |init|'s statusText member."
223 r->response_->SetStatusMessage(AtomicString(init.statusText())); 224 r->response_->SetStatusMessage(AtomicString(init.statusText()));
224 225
225 // "6. If |init|'s headers member is present, run these substeps:" 226 // "6. If |init|'s headers member is present, run these substeps:"
226 if (init.hasHeaders()) { 227 if (init.hasHeaders()) {
227 // "1. Empty |r|'s response's header list." 228 // "1. Empty |r|'s response's header list."
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
276 277
277 Response* Response::Create(ExecutionContext* context, 278 Response* Response::Create(ExecutionContext* context,
278 FetchResponseData* response) { 279 FetchResponseData* response) {
279 return new Response(context, response); 280 return new Response(context, response);
280 } 281 }
281 282
282 Response* Response::Create(ScriptState* script_state, 283 Response* Response::Create(ScriptState* script_state,
283 const WebServiceWorkerResponse& web_response) { 284 const WebServiceWorkerResponse& web_response) {
284 FetchResponseData* response_data = 285 FetchResponseData* response_data =
285 CreateFetchResponseDataFromWebResponse(script_state, web_response); 286 CreateFetchResponseDataFromWebResponse(script_state, web_response);
286 return new Response(script_state->GetExecutionContext(), response_data); 287 return new Response(ExecutionContext::From(script_state), response_data);
287 } 288 }
288 289
289 Response* Response::error(ScriptState* script_state) { 290 Response* Response::error(ScriptState* script_state) {
290 FetchResponseData* response_data = 291 FetchResponseData* response_data =
291 FetchResponseData::CreateNetworkErrorResponse(); 292 FetchResponseData::CreateNetworkErrorResponse();
292 Response* r = 293 Response* r =
293 new Response(script_state->GetExecutionContext(), response_data); 294 new Response(ExecutionContext::From(script_state), response_data);
294 r->headers_->SetGuard(Headers::kImmutableGuard); 295 r->headers_->SetGuard(Headers::kImmutableGuard);
295 return r; 296 return r;
296 } 297 }
297 298
298 Response* Response::redirect(ScriptState* script_state, 299 Response* Response::redirect(ScriptState* script_state,
299 const String& url, 300 const String& url,
300 unsigned short status, 301 unsigned short status,
301 ExceptionState& exception_state) { 302 ExceptionState& exception_state) {
302 KURL parsed_url = script_state->GetExecutionContext()->CompleteURL(url); 303 KURL parsed_url = ExecutionContext::From(script_state)->CompleteURL(url);
303 if (!parsed_url.IsValid()) { 304 if (!parsed_url.IsValid()) {
304 exception_state.ThrowTypeError("Failed to parse URL from " + url); 305 exception_state.ThrowTypeError("Failed to parse URL from " + url);
305 return nullptr; 306 return nullptr;
306 } 307 }
307 308
308 if (!NetworkUtils::IsRedirectResponseCode(status)) { 309 if (!NetworkUtils::IsRedirectResponseCode(status)) {
309 exception_state.ThrowRangeError("Invalid status code"); 310 exception_state.ThrowRangeError("Invalid status code");
310 return nullptr; 311 return nullptr;
311 } 312 }
312 313
313 Response* r = new Response(script_state->GetExecutionContext()); 314 Response* r = new Response(ExecutionContext::From(script_state));
314 r->headers_->SetGuard(Headers::kImmutableGuard); 315 r->headers_->SetGuard(Headers::kImmutableGuard);
315 r->response_->SetStatus(status); 316 r->response_->SetStatus(status);
316 r->response_->HeaderList()->Set("Location", parsed_url); 317 r->response_->HeaderList()->Set("Location", parsed_url);
317 318
318 return r; 319 return r;
319 } 320 }
320 321
321 String Response::type() const { 322 String Response::type() const {
322 // "The type attribute's getter must return response's type." 323 // "The type attribute's getter must return response's type."
323 switch (response_->GetType()) { 324 switch (response_->GetType()) {
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
462 .Set(response.As<v8::Object>(), body_buffer); 463 .Set(response.As<v8::Object>(), body_buffer);
463 } 464 }
464 465
465 DEFINE_TRACE(Response) { 466 DEFINE_TRACE(Response) {
466 Body::Trace(visitor); 467 Body::Trace(visitor);
467 visitor->Trace(response_); 468 visitor->Trace(response_);
468 visitor->Trace(headers_); 469 visitor->Trace(headers_);
469 } 470 }
470 471
471 } // namespace blink 472 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/modules/fetch/Request.cpp ('k') | third_party/WebKit/Source/modules/fetch/ResponseTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698