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

Side by Side Diff: Source/modules/serviceworkers/Response.cpp

Issue 555443002: [Fetch API] Put body members directly on Response/Request (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: incorporated yhirano's comment Created 6 years, 3 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
« no previous file with comments | « Source/modules/serviceworkers/Response.h ('k') | Source/modules/serviceworkers/Response.idl » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "config.h" 5 #include "config.h"
6 #include "Response.h" 6 #include "Response.h"
7 7
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 "core/fileapi/Blob.h" 10 #include "core/fileapi/Blob.h"
11 #include "modules/serviceworkers/FetchBodyStream.h"
12 #include "modules/serviceworkers/ResponseInit.h" 11 #include "modules/serviceworkers/ResponseInit.h"
13 #include "public/platform/WebServiceWorkerResponse.h" 12 #include "public/platform/WebServiceWorkerResponse.h"
14 #include "wtf/ArrayBuffer.h" 13 #include "wtf/ArrayBuffer.h"
15 #include "wtf/ArrayBufferView.h" 14 #include "wtf/ArrayBufferView.h"
16 #include "wtf/RefPtr.h" 15 #include "wtf/RefPtr.h"
17 16
18 namespace blink { 17 namespace blink {
19 18
20 namespace { 19 namespace {
21 20
(...skipping 18 matching lines...) Expand all
40 for (HashMap<String, String>::const_iterator i = webResponse.headers().begin (), end = webResponse.headers().end(); i != end; ++i) { 39 for (HashMap<String, String>::const_iterator i = webResponse.headers().begin (), end = webResponse.headers().end(); i != end; ++i) {
41 headers->append(i->key, i->value, exceptionState); 40 headers->append(i->key, i->value, exceptionState);
42 if (exceptionState.hadException()) 41 if (exceptionState.hadException())
43 return 0; 42 return 0;
44 } 43 }
45 return headers; 44 return headers;
46 } 45 }
47 46
48 } 47 }
49 48
50 Response* Response::create(Blob* body, const Dictionary& responseInit, Exception State& exceptionState) 49 Response* Response::create(ExecutionContext* context, Blob* body, const Dictiona ry& responseInit, ExceptionState& exceptionState)
51 { 50 {
52 return create(body, ResponseInit(responseInit), exceptionState); 51 return create(context, body, ResponseInit(responseInit), exceptionState);
53 } 52 }
54 53
55 Response* Response::create(const String& body, const Dictionary& responseInit, E xceptionState& exceptionState) 54 Response* Response::create(ExecutionContext* context, const String& body, const Dictionary& responseInit, ExceptionState& exceptionState)
56 { 55 {
57 OwnPtr<BlobData> blobData = BlobData::create(); 56 OwnPtr<BlobData> blobData = BlobData::create();
58 blobData->appendText(body, false); 57 blobData->appendText(body, false);
59 // "Set |Content-Type| to `text/plain;charset=UTF-8`." 58 // "Set |Content-Type| to `text/plain;charset=UTF-8`."
60 blobData->setContentType("text/plain;charset=UTF-8"); 59 blobData->setContentType("text/plain;charset=UTF-8");
61 const long long length = blobData->length(); 60 const long long length = blobData->length();
62 RefPtrWillBeRawPtr<Blob> blob = Blob::create(BlobDataHandle::create(blobData .release(), length)); 61 RefPtrWillBeRawPtr<Blob> blob = Blob::create(BlobDataHandle::create(blobData .release(), length));
63 return create(blob.get(), ResponseInit(responseInit), exceptionState); 62 return create(context, blob.get(), ResponseInit(responseInit), exceptionStat e);
64 } 63 }
65 64
66 Response* Response::create(const ArrayBuffer* body, const Dictionary& responseIn it, ExceptionState& exceptionState) 65 Response* Response::create(ExecutionContext* context, const ArrayBuffer* body, c onst Dictionary& responseInit, ExceptionState& exceptionState)
67 { 66 {
68 OwnPtr<BlobData> blobData = BlobData::create(); 67 OwnPtr<BlobData> blobData = BlobData::create();
69 blobData->appendArrayBuffer(body); 68 blobData->appendArrayBuffer(body);
70 const long long length = blobData->length(); 69 const long long length = blobData->length();
71 RefPtrWillBeRawPtr<Blob> blob = Blob::create(BlobDataHandle::create(blobData .release(), length)); 70 RefPtrWillBeRawPtr<Blob> blob = Blob::create(BlobDataHandle::create(blobData .release(), length));
72 return create(blob.get(), ResponseInit(responseInit), exceptionState); 71 return create(context, blob.get(), ResponseInit(responseInit), exceptionStat e);
73 } 72 }
74 73
75 Response* Response::create(const ArrayBufferView* body, const Dictionary& respon seInit, ExceptionState& exceptionState) 74 Response* Response::create(ExecutionContext* context, const ArrayBufferView* bod y, const Dictionary& responseInit, ExceptionState& exceptionState)
76 { 75 {
77 OwnPtr<BlobData> blobData = BlobData::create(); 76 OwnPtr<BlobData> blobData = BlobData::create();
78 blobData->appendArrayBufferView(body); 77 blobData->appendArrayBufferView(body);
79 const long long length = blobData->length(); 78 const long long length = blobData->length();
80 RefPtrWillBeRawPtr<Blob> blob = Blob::create(BlobDataHandle::create(blobData .release(), length)); 79 RefPtrWillBeRawPtr<Blob> blob = Blob::create(BlobDataHandle::create(blobData .release(), length));
81 return create(blob.get(), ResponseInit(responseInit), exceptionState); 80 return create(context, blob.get(), ResponseInit(responseInit), exceptionStat e);
82 } 81 }
83 82
84 Response* Response::create(Blob* body, const ResponseInit& responseInit, Excepti onState& exceptionState) 83 Response* Response::create(ExecutionContext* context, Blob* body, const Response Init& responseInit, ExceptionState& exceptionState)
85 { 84 {
86 // "1. If |init|'s status member is not in the range 200 to 599, throw a 85 // "1. If |init|'s status member is not in the range 200 to 599, throw a
87 // RangeError." 86 // RangeError."
88 if (responseInit.status < 200 || 599 < responseInit.status) { 87 if (responseInit.status < 200 || 599 < responseInit.status) {
89 exceptionState.throwRangeError("Invalid status"); 88 exceptionState.throwRangeError("Invalid status");
90 return 0; 89 return 0;
91 } 90 }
92 91
93 // FIXME: "2. If |init|'s statusText member does not match the Reason-Phrase 92 // FIXME: "2. If |init|'s statusText member does not match the Reason-Phrase
94 // token production, throw a TypeError." 93 // token production, throw a TypeError."
95 94
96 // "3. Let |r| be a new Response object, associated with a new response, 95 // "3. Let |r| be a new Response object, associated with a new response,
97 // Headers object, and FetchBodyStream object." 96 // Headers object, and Body object."
98 Response* r = new Response(); 97 Response* r = new Response(context);
98 r->suspendIfNeeded();
99 99
100 // "4. Set |r|'s response's status to |init|'s status member." 100 // "4. Set |r|'s response's status to |init|'s status member."
101 r->m_response->setStatus(responseInit.status); 101 r->m_response->setStatus(responseInit.status);
102 102
103 // "5. Set |r|'s response's status message to |init|'s statusText member." 103 // "5. Set |r|'s response's status message to |init|'s statusText member."
104 r->m_response->setStatusMessage(AtomicString(responseInit.statusText)); 104 r->m_response->setStatusMessage(AtomicString(responseInit.statusText));
105 105
106 // "6. If |init|'s headers member is present, run these substeps:" 106 // "6. If |init|'s headers member is present, run these substeps:"
107 if (responseInit.headers) { 107 if (responseInit.headers) {
108 // "1. Empty |r|'s response's header list." 108 // "1. Empty |r|'s response's header list."
(...skipping 17 matching lines...) Expand all
126 // "1. Let |stream| and |Content-Type| be the result of extracting body. " 126 // "1. Let |stream| and |Content-Type| be the result of extracting body. "
127 // "2. Set |r|'s response's body to |stream|." 127 // "2. Set |r|'s response's body to |stream|."
128 // "3. If |Content-Type| is non-null and |r|'s response's header list 128 // "3. If |Content-Type| is non-null and |r|'s response's header list
129 // contains no header named `Content-Type`, append `Content-Type`/ 129 // contains no header named `Content-Type`, append `Content-Type`/
130 // |Content-Type| to |r|'s response's header list." 130 // |Content-Type| to |r|'s response's header list."
131 r->m_response->setBlobDataHandle(body->blobDataHandle()); 131 r->m_response->setBlobDataHandle(body->blobDataHandle());
132 if (!body->type().isNull() && !r->m_response->headerList()->has("Content -Type")) 132 if (!body->type().isNull() && !r->m_response->headerList()->has("Content -Type"))
133 r->m_response->headerList()->append("Content-Type", body->type()); 133 r->m_response->headerList()->append("Content-Type", body->type());
134 } 134 }
135 135
136 // FIXME: "8. Set |r|'s FetchBodyStream object's MIME type to the result of 136 // FIXME: "8. Set |r|'s MIME type to the result of extracting a MIME type
137 // extracting a MIME type from |r|'s response's header list." 137 // from |r|'s response's header list."
138 138
139 // "9. Return |r|." 139 // "9. Return |r|."
140 return r; 140 return r;
141 } 141 }
142 142
143 Response* Response::create(FetchResponseData* response) 143 Response* Response::create(ExecutionContext* context, FetchResponseData* respons e)
144 { 144 {
145 return new Response(response); 145 Response* r = new Response(context, response);
146 r->suspendIfNeeded();
147 return r;
146 } 148 }
147 149
148 Response* Response::create(const WebServiceWorkerResponse& webResponse) 150 Response* Response::create(ExecutionContext* context, const WebServiceWorkerResp onse& webResponse)
149 { 151 {
150 return new Response(webResponse); 152 Response* r = new Response(context, webResponse);
153 r->suspendIfNeeded();
154 return r;
151 } 155 }
152 156
153 String Response::type() const 157 String Response::type() const
154 { 158 {
155 // "The type attribute's getter must return response's type." 159 // "The type attribute's getter must return response's type."
156 switch (m_response->type()) { 160 switch (m_response->type()) {
157 case FetchResponseData::BasicType: 161 case FetchResponseData::BasicType:
158 return "basic"; 162 return "basic";
159 case FetchResponseData::CORSType: 163 case FetchResponseData::CORSType:
160 return "cors"; 164 return "cors";
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 // "The statusText attribute's getter must return response's status message. " 196 // "The statusText attribute's getter must return response's status message. "
193 return m_response->statusMessage(); 197 return m_response->statusMessage();
194 } 198 }
195 199
196 Headers* Response::headers() const 200 Headers* Response::headers() const
197 { 201 {
198 // "The headers attribute's getter must return the associated Headers object ." 202 // "The headers attribute's getter must return the associated Headers object ."
199 return m_headers; 203 return m_headers;
200 } 204 }
201 205
202 FetchBodyStream* Response::body(ExecutionContext* context)
203 {
204 if (!m_response->blobDataHandle())
205 return 0;
206 if (!m_fetchBodyStream)
207 m_fetchBodyStream = FetchBodyStream::create(context, m_response->blobDat aHandle());
208 return m_fetchBodyStream;
209 }
210
211 void Response::populateWebServiceWorkerResponse(WebServiceWorkerResponse& respon se) 206 void Response::populateWebServiceWorkerResponse(WebServiceWorkerResponse& respon se)
212 { 207 {
213 m_response->populateWebServiceWorkerResponse(response); 208 m_response->populateWebServiceWorkerResponse(response);
214 } 209 }
215 210
216 Response::Response() 211 Response::Response(ExecutionContext* context)
217 : m_response(FetchResponseData::create()) 212 : Body(context)
213 , m_response(FetchResponseData::create())
218 , m_headers(Headers::create(m_response->headerList())) 214 , m_headers(Headers::create(m_response->headerList()))
219 { 215 {
220 m_headers->setGuard(Headers::ResponseGuard); 216 m_headers->setGuard(Headers::ResponseGuard);
221 } 217 }
222 218
223 Response::Response(FetchResponseData* response) 219 Response::Response(ExecutionContext* context, FetchResponseData* response)
224 : m_response(response) 220 : Body(context)
221 , m_response(response)
225 , m_headers(Headers::create(m_response->headerList())) 222 , m_headers(Headers::create(m_response->headerList()))
226 { 223 {
227 m_headers->setGuard(Headers::ResponseGuard); 224 m_headers->setGuard(Headers::ResponseGuard);
228 } 225 }
229 226
230 // FIXME: Handle response body data. 227 // FIXME: Handle response body data.
231 Response::Response(const WebServiceWorkerResponse& webResponse) 228 Response::Response(ExecutionContext* context, const WebServiceWorkerResponse& we bResponse)
232 : m_response(createFetchResponseDataFromWebResponse(webResponse)) 229 : Body(context)
230 , m_response(createFetchResponseDataFromWebResponse(webResponse))
233 , m_headers(createHeadersFromWebResponse(webResponse)) 231 , m_headers(createHeadersFromWebResponse(webResponse))
234 { 232 {
235 m_headers->setGuard(Headers::ResponseGuard); 233 m_headers->setGuard(Headers::ResponseGuard);
236 } 234 }
237 235
236 PassRefPtr<BlobDataHandle> Response::blobDataHandle()
237 {
238 return m_response->blobDataHandle();
239 }
240
238 void Response::trace(Visitor* visitor) 241 void Response::trace(Visitor* visitor)
239 { 242 {
243 Body::trace(visitor);
240 visitor->trace(m_response); 244 visitor->trace(m_response);
241 visitor->trace(m_headers); 245 visitor->trace(m_headers);
242 visitor->trace(m_fetchBodyStream);
243 } 246 }
244 247
245 } // namespace blink 248 } // namespace blink
OLDNEW
« no previous file with comments | « Source/modules/serviceworkers/Response.h ('k') | Source/modules/serviceworkers/Response.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698