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

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

Issue 1179393007: [2a] Implement FetchDataLoader (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Move client to start(). Created 5 years, 6 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "config.h"
6 #include "modules/fetch/FetchDataLoader.h"
yhirano 2015/06/17 05:18:53 +wtf/text/WTFString.h
hiroshige 2015/06/17 08:48:54 Done.
7
8 namespace blink {
9
10 namespace {
11
12 class FetchDataLoaderAsBlobHandle
13 : public FetchDataLoader
14 , public WebDataConsumerHandle::Client {
15 public:
16 FetchDataLoaderAsBlobHandle(const String& mimeType)
yhirano 2015/06/17 05:18:53 explicit
hiroshige 2015/06/17 08:48:55 Done.
17 : m_mimeType(mimeType) { }
18
19 private:
20 void start(FetchDataConsumerHandle* handle, FetchDataLoader::Client* client) override
21 {
22 ASSERT(!m_client);
23 ASSERT(!m_reader);
24
25 m_client = client;
26 m_reader = handle->obtainReader(this);
yhirano 2015/06/17 05:18:53 Please say that passing |this| is safe because |th
hiroshige 2015/06/17 08:48:55 Done.
27 RefPtr<BlobDataHandle> blobHandle = m_reader->blobDataHandle();
28 if (blobHandle && blobHandle->size() != kuint64max) {
29 // If the size of |blobHandle| is set correctly, creates Blob from
30 // it.
31 m_reader.clear();
32 if (blobHandle->type() != m_mimeType) {
33 // A new BlobDataHandle is created to override the Blob's type.
34 m_client->didFetchDataLoadedBlobHandle(BlobDataHandle::create(bl obHandle->uuid(), m_mimeType, blobHandle->size()));
yhirano 2015/06/17 05:18:53 [optional] for m_client->call() pattern, I think {
hiroshige 2015/06/17 08:48:55 Done.
35 } else {
36 m_client->didFetchDataLoadedBlobHandle(blobHandle);
37 }
38 // Here |this| might be already destructed.
39 return;
40 }
41
42 // If the size is not set, read from |m_reader| and create a new blob.
43 m_blobData = BlobData::create();
44 m_blobData->setContentType(m_mimeType);
45 }
46
47 void didGetReadable() override
48 {
49 ASSERT(m_client);
50 ASSERT(m_reader);
51
52 while (true) {
53 const void* buffer;
54 size_t available;
55 WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer, WebDataConsumerHandle::FlagNone, &available);
56
57 switch (result) {
58 case WebDataConsumerHandle::Ok:
59 m_blobData->appendBytes(buffer, available);
60 m_reader->endRead(available);
61 break;
62
63 case WebDataConsumerHandle::Done: {
64 m_reader.clear();
65 long long size = m_blobData->length();
66 m_client->didFetchDataLoadedBlobHandle(BlobDataHandle::create(m_ blobData.release(), size));
67 return;
68 }
69
70 case WebDataConsumerHandle::ShouldWait:
71 return;
72
73 case WebDataConsumerHandle::Busy:
74 case WebDataConsumerHandle::ResourceExhausted:
75 case WebDataConsumerHandle::UnexpectedError:
76 m_reader.clear();
77 m_client->didFetchDataLoadFailed();
78 return;
79 }
80 }
81 }
82
83 String m_mimeType;
84 OwnPtr<BlobData> m_blobData;
85 };
86
87 class FetchDataLoaderAsArrayBufferOrString
88 : public FetchDataLoader
89 , public WebDataConsumerHandle::Client {
90 public:
91 enum LoadType {
92 LoadAsArrayBuffer,
93 LoadAsString
94 };
95
96 FetchDataLoaderAsArrayBufferOrString(LoadType loadType)
97 : m_loadType(loadType) { }
98
99 protected:
100 void start(FetchDataConsumerHandle* handle, FetchDataLoader::Client* client) override
101 {
102 ASSERT(!m_client);
103 ASSERT(!m_rawData);
104 ASSERT(!m_reader);
105 m_client = client;
106 m_rawData = adoptPtr(new ArrayBufferBuilder());
107 m_reader = handle->obtainReader(this);
108 }
109
110 void didGetReadable() override
111 {
112 ASSERT(m_client);
113 ASSERT(m_rawData);
114 ASSERT(m_reader);
115
116 while (true) {
117 const void* buffer;
118 size_t available;
119 WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer, WebDataConsumerHandle::FlagNone, &available);
120
121 switch (result) {
122 case WebDataConsumerHandle::Ok:
123 if (available > 0) {
124 unsigned bytesAppended = m_rawData->append(static_cast<const char*>(buffer), available);
125 if (!bytesAppended) {
126 m_reader->endRead(0);
127 error();
128 return;
129 }
130 ASSERT(bytesAppended == available);
131 m_reader->endRead(available);
yhirano 2015/06/17 05:18:53 You can move this endRead call out of this block a
hiroshige 2015/06/17 08:48:54 Done.
132 } else {
133 m_reader->endRead(0);
134 }
135 break;
136
137 case WebDataConsumerHandle::Done:
138 m_reader.clear();
139 switch (m_loadType) {
140 case LoadAsArrayBuffer:
141 m_client->didFetchDataLoadedArrayBuffer(DOMArrayBuffer::crea te(m_rawData->toArrayBuffer()));
142 break;
143 case LoadAsString:
144 m_client->didFetchDataLoadedString(m_rawData->toString());
145 break;
146 default:
yhirano 2015/06/17 05:18:53 You don't need this default clause (compiler check
hiroshige 2015/06/17 08:48:54 Done.
147 ASSERT_NOT_REACHED();
148 }
149 // Here |this| might be already destructed.
150 return;
151
152 case WebDataConsumerHandle::ShouldWait:
153 return;
154
155 case WebDataConsumerHandle::Busy:
156 case WebDataConsumerHandle::ResourceExhausted:
157 case WebDataConsumerHandle::UnexpectedError:
158 error();
159 return;
160 }
161 }
162 }
163
164 void error()
165 {
166 m_reader.clear();
167 m_rawData.clear();
168 m_client->didFetchDataLoadFailed();
169 // Here |this| might be already destructed.
170 }
171
172 LoadType m_loadType;
173 OwnPtr<ArrayBufferBuilder> m_rawData;
174 };
175
176 } // namespace
177
178 FetchDataLoader::FetchDataLoader()
179 : m_client(nullptr)
180 {
181 }
182
183 PassOwnPtr<FetchDataLoader> FetchDataLoader::createLoaderAsBlobHandle(const Stri ng& mimeType)
184 {
185 return adoptPtr(new FetchDataLoaderAsBlobHandle(mimeType));
186 }
187
188 PassOwnPtr<FetchDataLoader> FetchDataLoader::createLoaderAsArrayBuffer()
189 {
190 return adoptPtr(new FetchDataLoaderAsArrayBufferOrString(FetchDataLoaderAsAr rayBufferOrString::LoadAsArrayBuffer));
191 }
192
193 PassOwnPtr<FetchDataLoader> FetchDataLoader::createLoaderAsString()
194 {
195 return adoptPtr(new FetchDataLoaderAsArrayBufferOrString(FetchDataLoaderAsAr rayBufferOrString::LoadAsString));
196 }
197
198 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698