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

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

Issue 2177243002: Use per-frame TaskRunner instead of thread's default in DataConsumerHandle (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@data_consumer_handle_unique_ptr
Patch Set: update Created 4 years, 4 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/FetchDataLoader.h" 5 #include "modules/fetch/FetchDataLoader.h"
6 6
7 #include "core/html/parser/TextResourceDecoder.h" 7 #include "core/html/parser/TextResourceDecoder.h"
8 #include "wtf/PtrUtil.h" 8 #include "wtf/PtrUtil.h"
9 #include "wtf/text/StringBuilder.h" 9 #include "wtf/text/StringBuilder.h"
10 #include "wtf/text/WTFString.h" 10 #include "wtf/text/WTFString.h"
(...skipping 14 matching lines...) Expand all
25 25
26 DEFINE_INLINE_VIRTUAL_TRACE() 26 DEFINE_INLINE_VIRTUAL_TRACE()
27 { 27 {
28 FetchDataLoader::trace(visitor); 28 FetchDataLoader::trace(visitor);
29 visitor->trace(m_client); 29 visitor->trace(m_client);
30 } 30 }
31 31
32 private: 32 private:
33 void start(FetchDataConsumerHandle* handle, FetchDataLoader::Client* client) override 33 void start(FetchDataConsumerHandle* handle, FetchDataLoader::Client* client) override
34 { 34 {
35 ASSERT(!m_client); 35 DCHECK(client);
36 ASSERT(!m_reader); 36 DCHECK(!m_client);
37 DCHECK(!m_reader);
37 38
38 m_client = client; 39 m_client = client;
39 // Passing |this| here is safe because |this| owns |m_reader|. 40 // Passing |this| here is safe because |this| owns |m_reader|.
40 m_reader = handle->obtainFetchDataReader(this); 41 m_reader = handle->obtainFetchDataReader(this);
41 RefPtr<BlobDataHandle> blobHandle = m_reader->drainAsBlobDataHandle(); 42 RefPtr<BlobDataHandle> blobHandle = m_reader->drainAsBlobDataHandle();
42 if (blobHandle) { 43 if (blobHandle) {
43 ASSERT(blobHandle->size() != UINT64_MAX); 44 DCHECK(blobHandle->size() != UINT64_MAX);
44 m_reader.reset(); 45 m_reader.reset();
45 if (blobHandle->type() != m_mimeType) { 46 if (blobHandle->type() != m_mimeType) {
46 // A new BlobDataHandle is created to override the Blob's type. 47 // A new BlobDataHandle is created to override the Blob's type.
47 m_client->didFetchDataLoadedBlobHandle(BlobDataHandle::create(bl obHandle->uuid(), m_mimeType, blobHandle->size())); 48 m_client->didFetchDataLoadedBlobHandle(BlobDataHandle::create(bl obHandle->uuid(), m_mimeType, blobHandle->size()));
48 } else { 49 } else {
49 m_client->didFetchDataLoadedBlobHandle(blobHandle); 50 m_client->didFetchDataLoadedBlobHandle(blobHandle);
50 } 51 }
51 m_client.clear(); 52 m_client.clear();
52 return; 53 return;
53 } 54 }
54 55
55 // We read data from |m_reader| and create a new blob. 56 // We read data from |m_reader| and create a new blob.
56 m_blobData = BlobData::create(); 57 m_blobData = BlobData::create();
57 m_blobData->setContentType(m_mimeType); 58 m_blobData->setContentType(m_mimeType);
58 } 59 }
59 60
60 void didGetReadable() override 61 void didGetReadable() override
61 { 62 {
62 ASSERT(m_client); 63 DCHECK(m_client);
63 ASSERT(m_reader); 64 DCHECK(m_reader);
64 65
65 while (true) { 66 while (true) {
66 const void* buffer; 67 const void* buffer;
67 size_t available; 68 size_t available;
68 WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer, WebDataConsumerHandle::FlagNone, &available); 69 WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer, WebDataConsumerHandle::FlagNone, &available);
69 70
70 switch (result) { 71 switch (result) {
71 case WebDataConsumerHandle::Ok: 72 case WebDataConsumerHandle::Ok:
72 m_blobData->appendBytes(buffer, available); 73 m_blobData->appendBytes(buffer, available);
73 m_reader->endRead(available); 74 m_reader->endRead(available);
(...skipping 15 matching lines...) Expand all
89 case WebDataConsumerHandle::UnexpectedError: 90 case WebDataConsumerHandle::UnexpectedError:
90 m_reader.reset(); 91 m_reader.reset();
91 m_blobData.reset(); 92 m_blobData.reset();
92 m_client->didFetchDataLoadFailed(); 93 m_client->didFetchDataLoadFailed();
93 m_client.clear(); 94 m_client.clear();
94 return; 95 return;
95 } 96 }
96 } 97 }
97 } 98 }
98 99
100 WebTaskRunner* getTaskRunner() override
101 {
102 return m_client->getTaskRunner();
103 }
104
99 void cancel() override 105 void cancel() override
100 { 106 {
101 m_reader.reset(); 107 m_reader.reset();
102 m_blobData.reset(); 108 m_blobData.reset();
103 m_client.clear(); 109 m_client.clear();
104 } 110 }
105 111
106 std::unique_ptr<FetchDataConsumerHandle::Reader> m_reader; 112 std::unique_ptr<FetchDataConsumerHandle::Reader> m_reader;
107 Member<FetchDataLoader::Client> m_client; 113 Member<FetchDataLoader::Client> m_client;
108 114
(...skipping 10 matching lines...) Expand all
119 125
120 DEFINE_INLINE_VIRTUAL_TRACE() 126 DEFINE_INLINE_VIRTUAL_TRACE()
121 { 127 {
122 FetchDataLoader::trace(visitor); 128 FetchDataLoader::trace(visitor);
123 visitor->trace(m_client); 129 visitor->trace(m_client);
124 } 130 }
125 131
126 protected: 132 protected:
127 void start(FetchDataConsumerHandle* handle, FetchDataLoader::Client* client) override 133 void start(FetchDataConsumerHandle* handle, FetchDataLoader::Client* client) override
128 { 134 {
129 ASSERT(!m_client); 135 DCHECK(!m_client);
130 ASSERT(!m_rawData); 136 DCHECK(!m_rawData);
131 ASSERT(!m_reader); 137 DCHECK(!m_reader);
132 m_client = client; 138 m_client = client;
133 m_rawData = wrapUnique(new ArrayBufferBuilder()); 139 m_rawData = wrapUnique(new ArrayBufferBuilder());
134 m_reader = handle->obtainFetchDataReader(this); 140 m_reader = handle->obtainFetchDataReader(this);
135 } 141 }
136 142
137 void didGetReadable() override 143 void didGetReadable() override
138 { 144 {
139 ASSERT(m_client); 145 DCHECK(m_client);
140 ASSERT(m_rawData); 146 DCHECK(m_rawData);
141 ASSERT(m_reader); 147 DCHECK(m_reader);
142 148
143 while (true) { 149 while (true) {
144 const void* buffer; 150 const void* buffer;
145 size_t available; 151 size_t available;
146 WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer, WebDataConsumerHandle::FlagNone, &available); 152 WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer, WebDataConsumerHandle::FlagNone, &available);
147 153
148 switch (result) { 154 switch (result) {
149 case WebDataConsumerHandle::Ok: 155 case WebDataConsumerHandle::Ok:
150 if (available > 0) { 156 if (available > 0) {
151 unsigned bytesAppended = m_rawData->append(static_cast<const char*>(buffer), available); 157 unsigned bytesAppended = m_rawData->append(static_cast<const char*>(buffer), available);
152 if (!bytesAppended) { 158 if (!bytesAppended) {
153 m_reader->endRead(0); 159 m_reader->endRead(0);
154 error(); 160 error();
155 return; 161 return;
156 } 162 }
157 ASSERT(bytesAppended == available); 163 DCHECK(bytesAppended == available);
158 } 164 }
159 m_reader->endRead(available); 165 m_reader->endRead(available);
160 break; 166 break;
161 167
162 case WebDataConsumerHandle::Done: 168 case WebDataConsumerHandle::Done:
163 m_reader.reset(); 169 m_reader.reset();
164 m_client->didFetchDataLoadedArrayBuffer(DOMArrayBuffer::create(m _rawData->toArrayBuffer())); 170 m_client->didFetchDataLoadedArrayBuffer(DOMArrayBuffer::create(m _rawData->toArrayBuffer()));
165 m_rawData.reset(); 171 m_rawData.reset();
166 m_client.clear(); 172 m_client.clear();
167 return; 173 return;
168 174
169 case WebDataConsumerHandle::ShouldWait: 175 case WebDataConsumerHandle::ShouldWait:
170 return; 176 return;
171 177
172 case WebDataConsumerHandle::Busy: 178 case WebDataConsumerHandle::Busy:
173 case WebDataConsumerHandle::ResourceExhausted: 179 case WebDataConsumerHandle::ResourceExhausted:
174 case WebDataConsumerHandle::UnexpectedError: 180 case WebDataConsumerHandle::UnexpectedError:
175 error(); 181 error();
176 return; 182 return;
177 } 183 }
178 } 184 }
179 } 185 }
180 186
187 WebTaskRunner* getTaskRunner() override
188 {
189 return m_client->getTaskRunner();
190 }
191
181 void error() 192 void error()
182 { 193 {
183 m_reader.reset(); 194 m_reader.reset();
184 m_rawData.reset(); 195 m_rawData.reset();
185 m_client->didFetchDataLoadFailed(); 196 m_client->didFetchDataLoadFailed();
186 m_client.clear(); 197 m_client.clear();
187 } 198 }
188 199
189 void cancel() override 200 void cancel() override
190 { 201 {
(...skipping 17 matching lines...) Expand all
208 219
209 DEFINE_INLINE_VIRTUAL_TRACE() 220 DEFINE_INLINE_VIRTUAL_TRACE()
210 { 221 {
211 FetchDataLoader::trace(visitor); 222 FetchDataLoader::trace(visitor);
212 visitor->trace(m_client); 223 visitor->trace(m_client);
213 } 224 }
214 225
215 protected: 226 protected:
216 void start(FetchDataConsumerHandle* handle, FetchDataLoader::Client* client) override 227 void start(FetchDataConsumerHandle* handle, FetchDataLoader::Client* client) override
217 { 228 {
218 ASSERT(!m_client); 229 DCHECK(client);
219 ASSERT(!m_decoder); 230 DCHECK(!m_client);
220 ASSERT(!m_reader); 231 DCHECK(!m_decoder);
232 DCHECK(!m_reader);
221 m_client = client; 233 m_client = client;
222 m_decoder = TextResourceDecoder::createAlwaysUseUTF8ForText(); 234 m_decoder = TextResourceDecoder::createAlwaysUseUTF8ForText();
223 m_reader = handle->obtainFetchDataReader(this); 235 m_reader = handle->obtainFetchDataReader(this);
224 } 236 }
225 237
226 void didGetReadable() override 238 void didGetReadable() override
227 { 239 {
228 ASSERT(m_client); 240 DCHECK(m_client);
229 ASSERT(m_decoder); 241 DCHECK(m_decoder);
230 ASSERT(m_reader); 242 DCHECK(m_reader);
231 243
232 while (true) { 244 while (true) {
233 const void* buffer; 245 const void* buffer;
234 size_t available; 246 size_t available;
235 WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer, WebDataConsumerHandle::FlagNone, &available); 247 WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer, WebDataConsumerHandle::FlagNone, &available);
236 248
237 switch (result) { 249 switch (result) {
238 case WebDataConsumerHandle::Ok: 250 case WebDataConsumerHandle::Ok:
239 if (available > 0) 251 if (available > 0)
240 m_builder.append(m_decoder->decode(static_cast<const char*>( buffer), available)); 252 m_builder.append(m_decoder->decode(static_cast<const char*>( buffer), available));
(...skipping 14 matching lines...) Expand all
255 267
256 case WebDataConsumerHandle::Busy: 268 case WebDataConsumerHandle::Busy:
257 case WebDataConsumerHandle::ResourceExhausted: 269 case WebDataConsumerHandle::ResourceExhausted:
258 case WebDataConsumerHandle::UnexpectedError: 270 case WebDataConsumerHandle::UnexpectedError:
259 error(); 271 error();
260 return; 272 return;
261 } 273 }
262 } 274 }
263 } 275 }
264 276
277 WebTaskRunner* getTaskRunner() override
278 {
279 DCHECK(m_client);
280 return m_client->getTaskRunner();
281 }
282
265 void error() 283 void error()
266 { 284 {
267 m_reader.reset(); 285 m_reader.reset();
268 m_builder.clear(); 286 m_builder.clear();
269 m_decoder.reset(); 287 m_decoder.reset();
270 m_client->didFetchDataLoadFailed(); 288 m_client->didFetchDataLoadFailed();
271 m_client.clear(); 289 m_client.clear();
272 } 290 }
273 291
274 void cancel() override 292 void cancel() override
(...skipping 22 matching lines...) Expand all
297 DEFINE_INLINE_VIRTUAL_TRACE() 315 DEFINE_INLINE_VIRTUAL_TRACE()
298 { 316 {
299 FetchDataLoader::trace(visitor); 317 FetchDataLoader::trace(visitor);
300 visitor->trace(m_client); 318 visitor->trace(m_client);
301 visitor->trace(m_outStream); 319 visitor->trace(m_outStream);
302 } 320 }
303 321
304 protected: 322 protected:
305 void start(FetchDataConsumerHandle* handle, FetchDataLoader::Client* client) override 323 void start(FetchDataConsumerHandle* handle, FetchDataLoader::Client* client) override
306 { 324 {
307 ASSERT(!m_client); 325 DCHECK(!m_client);
308 ASSERT(!m_reader); 326 DCHECK(!m_reader);
309 m_client = client; 327 m_client = client;
310 m_reader = handle->obtainFetchDataReader(this); 328 m_reader = handle->obtainFetchDataReader(this);
311 } 329 }
312 330
313 void didGetReadable() override 331 void didGetReadable() override
314 { 332 {
315 ASSERT(m_client); 333 DCHECK(m_client);
316 ASSERT(m_reader); 334 DCHECK(m_reader);
317 335
318 bool needToFlush = false; 336 bool needToFlush = false;
319 while (true) { 337 while (true) {
320 const void* buffer; 338 const void* buffer;
321 size_t available; 339 size_t available;
322 WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer, WebDataConsumerHandle::FlagNone, &available); 340 WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer, WebDataConsumerHandle::FlagNone, &available);
323 341
324 switch (result) { 342 switch (result) {
325 case WebDataConsumerHandle::Ok: 343 case WebDataConsumerHandle::Ok:
326 m_outStream->addData(static_cast<const char*>(buffer), available ); 344 m_outStream->addData(static_cast<const char*>(buffer), available );
(...skipping 25 matching lines...) Expand all
352 // process. 370 // process.
353 m_reader.reset(); 371 m_reader.reset();
354 m_outStream->abort(); 372 m_outStream->abort();
355 m_client->didFetchDataLoadFailed(); 373 m_client->didFetchDataLoadFailed();
356 cleanup(); 374 cleanup();
357 return; 375 return;
358 } 376 }
359 } 377 }
360 } 378 }
361 379
380 WebTaskRunner* getTaskRunner() override
381 {
382 return m_client->getTaskRunner();
383 }
384
362 void cancel() override 385 void cancel() override
363 { 386 {
364 cleanup(); 387 cleanup();
365 } 388 }
366 389
367 void cleanup() 390 void cleanup()
368 { 391 {
369 m_reader.reset(); 392 m_reader.reset();
370 m_client.clear(); 393 m_client.clear();
371 m_outStream.clear(); 394 m_outStream.clear();
(...skipping 22 matching lines...) Expand all
394 { 417 {
395 return new FetchDataLoaderAsString(); 418 return new FetchDataLoaderAsString();
396 } 419 }
397 420
398 FetchDataLoader* FetchDataLoader::createLoaderAsStream(Stream* outStream) 421 FetchDataLoader* FetchDataLoader::createLoaderAsStream(Stream* outStream)
399 { 422 {
400 return new FetchDataLoaderAsStream(outStream); 423 return new FetchDataLoaderAsStream(outStream);
401 } 424 }
402 425
403 } // namespace blink 426 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698