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

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: Reflect comments (except for making GarbageCollected). 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"
7
8 #include "wtf/ArrayBufferBuilder.h"
9 #include "wtf/text/WTFString.h"
10
11 namespace blink {
12
13 namespace {
14
15 class FetchDataLoaderAsBlobHandle
16 : public FetchDataLoader
17 , public WebDataConsumerHandle::Client {
18 public:
19 explicit FetchDataLoaderAsBlobHandle(const String& mimeType)
20 : m_client(nullptr)
21 , m_mimeType(mimeType) { }
22
23 private:
24 void start(FetchDataConsumerHandle* handle, FetchDataLoader::Client* client) override
25 {
26 ASSERT(!m_client);
27 ASSERT(!m_reader);
28
29 m_client = client;
30 // Passing |this| here is safe because |this| owns |m_reader|.
31 m_reader = handle->obtainReader(this);
32 RefPtr<BlobDataHandle> blobHandle = m_reader->blobDataHandle();
33 if (blobHandle && blobHandle->size() != kuint64max) {
yhirano 2015/06/17 09:27:58 Hmm, If taking a non-null BlobDataHandle drains al
hiroshige 2015/06/17 18:27:29 Agree; I add a restriction that drainAsBlobDataHan
34 // If the size of |blobHandle| is set correctly, creates Blob from
35 // it.
36 m_reader.clear();
37 auto client = m_client;
38 m_client = nullptr;
39 if (blobHandle->type() != m_mimeType) {
40 // A new BlobDataHandle is created to override the Blob's type.
41 client->didFetchDataLoadedBlobHandle(BlobDataHandle::create(blob Handle->uuid(), m_mimeType, blobHandle->size()));
42 } else {
43 client->didFetchDataLoadedBlobHandle(blobHandle);
44 }
45 // Here |this| might be already destructed.
46 return;
47 }
48
49 // If the size is not set, read from |m_reader| and create a new blob.
50 m_blobData = BlobData::create();
51 m_blobData->setContentType(m_mimeType);
52 }
53
54 void didGetReadable() override
55 {
56 ASSERT(m_client);
57 ASSERT(m_reader);
58
59 while (true) {
60 const void* buffer;
61 size_t available;
62 WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer, WebDataConsumerHandle::FlagNone, &available);
63
64 switch (result) {
65 case WebDataConsumerHandle::Ok:
66 m_blobData->appendBytes(buffer, available);
67 m_reader->endRead(available);
68 break;
69
70 case WebDataConsumerHandle::Done: {
71 m_reader.clear();
72 long long size = m_blobData->length();
73 auto client = m_client;
74 m_client = nullptr;
75 client->didFetchDataLoadedBlobHandle(BlobDataHandle::create(m_bl obData.release(), size));
76 return;
77 }
78
79 case WebDataConsumerHandle::ShouldWait:
80 return;
81
82 case WebDataConsumerHandle::Busy:
83 case WebDataConsumerHandle::ResourceExhausted:
84 case WebDataConsumerHandle::UnexpectedError: {
85 m_reader.clear();
86 auto client = m_client;
87 m_client = nullptr;
88 client->didFetchDataLoadFailed();
89 return;
90 }
91 }
92 }
93 }
94
95 OwnPtr<FetchDataConsumerHandle::Reader> m_reader;
96 Client* m_client;
97
98 String m_mimeType;
99 OwnPtr<BlobData> m_blobData;
100 };
101
102 class FetchDataLoaderAsArrayBufferOrString
103 : public FetchDataLoader
104 , public WebDataConsumerHandle::Client {
105 public:
106 enum LoadType {
107 LoadAsArrayBuffer,
108 LoadAsString
109 };
110
111 explicit FetchDataLoaderAsArrayBufferOrString(LoadType loadType)
112 : m_client(nullptr)
113 , m_loadType(loadType) { }
114
115 protected:
116 void start(FetchDataConsumerHandle* handle, FetchDataLoader::Client* client) override
117 {
118 ASSERT(!m_client);
119 ASSERT(!m_rawData);
120 ASSERT(!m_reader);
121 m_client = client;
122 m_rawData = adoptPtr(new ArrayBufferBuilder());
123 m_reader = handle->obtainReader(this);
124 }
125
126 void didGetReadable() override
127 {
128 ASSERT(m_client);
129 ASSERT(m_rawData);
130 ASSERT(m_reader);
131
132 while (true) {
133 const void* buffer;
134 size_t available;
135 WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer, WebDataConsumerHandle::FlagNone, &available);
136
137 switch (result) {
138 case WebDataConsumerHandle::Ok:
139 if (available > 0) {
140 unsigned bytesAppended = m_rawData->append(static_cast<const char*>(buffer), available);
141 if (!bytesAppended) {
142 m_reader->endRead(0);
143 error();
144 return;
145 }
146 ASSERT(bytesAppended == available);
147 }
148 m_reader->endRead(available);
149 break;
150
151 case WebDataConsumerHandle::Done: {
152 m_reader.clear();
153 auto client = m_client;
154 m_client = nullptr;
155 switch (m_loadType) {
156 case LoadAsArrayBuffer:
157 client->didFetchDataLoadedArrayBuffer(DOMArrayBuffer::create (m_rawData->toArrayBuffer()));
158 break;
159 case LoadAsString:
160 client->didFetchDataLoadedString(m_rawData->toString());
161 break;
162 }
163 // Here |this| might be already destructed.
164 return;
165 }
166
167 case WebDataConsumerHandle::ShouldWait:
168 return;
169
170 case WebDataConsumerHandle::Busy:
171 case WebDataConsumerHandle::ResourceExhausted:
172 case WebDataConsumerHandle::UnexpectedError:
173 error();
174 return;
175 }
176 }
177 }
178
179 void error()
180 {
181 m_reader.clear();
182 m_rawData.clear();
183 auto client = m_client;
184 m_client = nullptr;
185 client->didFetchDataLoadFailed();
186 // Here |this| might be already destructed.
187 }
188
189 OwnPtr<FetchDataConsumerHandle::Reader> m_reader;
190 Client* m_client;
191
192 LoadType m_loadType;
193 OwnPtr<ArrayBufferBuilder> m_rawData;
194 };
195
196 } // namespace
197
198 PassOwnPtr<FetchDataLoader> FetchDataLoader::createLoaderAsBlobHandle(const Stri ng& mimeType)
199 {
200 return adoptPtr(new FetchDataLoaderAsBlobHandle(mimeType));
201 }
202
203 PassOwnPtr<FetchDataLoader> FetchDataLoader::createLoaderAsArrayBuffer()
204 {
205 return adoptPtr(new FetchDataLoaderAsArrayBufferOrString(FetchDataLoaderAsAr rayBufferOrString::LoadAsArrayBuffer));
206 }
207
208 PassOwnPtr<FetchDataLoader> FetchDataLoader::createLoaderAsString()
209 {
210 return adoptPtr(new FetchDataLoaderAsArrayBufferOrString(FetchDataLoaderAsAr rayBufferOrString::LoadAsString));
211 }
212
213 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698