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

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

Issue 2046203003: [Fetch API] Introduce BytesConsumer (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix 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
(Empty)
1 // Copyright 2016 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 "modules/fetch/BytesConsumerForDataConsumerHandle.h"
6
7 #include <algorithm>
8 #include <string.h>
9
10 namespace blink {
11
12 BytesConsumerForDataConsumerHandle::BytesConsumerForDataConsumerHandle(std::uniq ue_ptr<FetchDataConsumerHandle> handle)
13 : m_reader(handle->obtainFetchDataReader(this))
14 {
15 }
16
17 BytesConsumerForDataConsumerHandle::~BytesConsumerForDataConsumerHandle() {}
18
19 BytesConsumer::Result BytesConsumerForDataConsumerHandle::read(char* buffer, siz e_t size, size_t* readSize)
20 {
21 *readSize = 0;
22 if (m_state == InternalState::Closed)
23 return Result::Done;
24 if (m_state == InternalState::Errored)
25 return Result::Error;
26
27 WebDataConsumerHandle::Result r = m_reader->read(buffer, size, WebDataConsum erHandle::FlagNone, readSize);
28 switch (r) {
29 case WebDataConsumerHandle::Ok:
30 return Result::Ok;
31 case WebDataConsumerHandle::ShouldWait:
32 return Result::ShouldWait;
33 case WebDataConsumerHandle::Done:
34 close();
35 return Result::Done;
36 case WebDataConsumerHandle::Busy:
37 case WebDataConsumerHandle::ResourceExhausted:
38 case WebDataConsumerHandle::UnexpectedError:
39 error();
40 return Result::Error;
41 }
42 NOTREACHED();
43 return Result::Error;
44 }
45
46 BytesConsumer::Result BytesConsumerForDataConsumerHandle::beginRead(const char** buffer, size_t* available)
47 {
48 *buffer = nullptr;
49 *available = 0;
50 if (m_state == InternalState::Closed)
51 return Result::Done;
52 if (m_state == InternalState::Errored)
53 return Result::Error;
54
55 WebDataConsumerHandle::Result r = m_reader->beginRead(reinterpret_cast<const void**>(buffer), WebDataConsumerHandle::FlagNone, available);
56 switch (r) {
57 case WebDataConsumerHandle::Ok:
58 return Result::Ok;
59 case WebDataConsumerHandle::ShouldWait:
60 return Result::ShouldWait;
61 case WebDataConsumerHandle::Done:
62 close();
63 return Result::Done;
64 case WebDataConsumerHandle::Busy:
65 case WebDataConsumerHandle::ResourceExhausted:
66 case WebDataConsumerHandle::UnexpectedError:
67 error();
68 return Result::Error;
69 }
70 NOTREACHED();
71 return Result::Error;
72 }
73
74 BytesConsumer::Result BytesConsumerForDataConsumerHandle::endRead(size_t read)
75 {
76 DCHECK(m_state == InternalState::Readable || m_state == InternalState::Waiti ng);
77 WebDataConsumerHandle::Result r = m_reader->endRead(read);
78 if (r == WebDataConsumerHandle::Ok)
79 return Result::Ok;
80 error();
81 return Result::Error;
82 }
83
84 PassRefPtr<BlobDataHandle> BytesConsumerForDataConsumerHandle::drainAsBlobDataHa ndle(BlobSizePolicy policy)
85 {
86 if (!m_reader)
87 return nullptr;
88
89 RefPtr<BlobDataHandle> handle;
90 if (policy == BlobSizePolicy::DisallowBlobWithInvalidSize) {
91 handle = m_reader->drainAsBlobDataHandle(FetchDataConsumerHandle::Reader ::DisallowBlobWithInvalidSize);
92 } else {
93 DCHECK_EQ(BlobSizePolicy::AllowBlobWithInvalidSize, policy);
94 handle = m_reader->drainAsBlobDataHandle(FetchDataConsumerHandle::Reader ::AllowBlobWithInvalidSize);
95 }
96
97 if (handle)
98 close();
99 return handle.release();
100 }
101
102 PassRefPtr<EncodedFormData> BytesConsumerForDataConsumerHandle::drainAsFormData( )
103 {
104 if (!m_reader)
105 return nullptr;
106 RefPtr<EncodedFormData> formData = m_reader->drainAsFormData();
107 if (formData)
108 close();
109 return formData.release();
110 }
111
112 void BytesConsumerForDataConsumerHandle::setClient(BytesConsumer::Client* client )
113 {
114 DCHECK(!m_client);
115 DCHECK(client);
116 m_client = client;
117 }
118
119 void BytesConsumerForDataConsumerHandle::clearClient()
120 {
121 DCHECK(m_client);
122 m_client = nullptr;
123 }
124
125 void BytesConsumerForDataConsumerHandle::cancel()
126 {
127 if (m_state == InternalState::Readable || m_state == InternalState::Waiting) {
128 // We don't want the client to be notified in this case.
129 BytesConsumer::Client* client = m_client;
130 m_client = nullptr;
131 close();
132 m_client = client;
133 }
134 }
135
136 BytesConsumer::PublicState BytesConsumerForDataConsumerHandle::getPublicState() const
137 {
138 return getPublicStateFromInternalState(m_state);
139 }
140
141 void BytesConsumerForDataConsumerHandle::didGetReadable()
142 {
143 DCHECK(m_state == InternalState::Readable || m_state == InternalState::Waiti ng);
144 // Perform zero-length read to call check handle's status.
145 size_t readSize;
146 WebDataConsumerHandle::Result result = m_reader->read(nullptr, 0, WebDataCon sumerHandle::FlagNone, &readSize);
147 switch (result) {
148 case WebDataConsumerHandle::Ok:
149 case WebDataConsumerHandle::ShouldWait:
150 if (m_client)
151 m_client->onStateChange();
152 return;
153 case WebDataConsumerHandle::Done:
154 close();
155 if (m_client)
156 m_client->onStateChange();
157 return;
158 case WebDataConsumerHandle::Busy:
159 case WebDataConsumerHandle::ResourceExhausted:
160 case WebDataConsumerHandle::UnexpectedError:
161 error();
162 if (m_client)
163 m_client->onStateChange();
164 return;
165 }
166 return;
167 }
168
169 DEFINE_TRACE(BytesConsumerForDataConsumerHandle)
170 {
171 visitor->trace(m_client);
172 BytesConsumer::trace(visitor);
173 }
174
175 void BytesConsumerForDataConsumerHandle::close()
176 {
177 if (m_state == InternalState::Closed)
178 return;
179 DCHECK(m_state == InternalState::Readable || m_state == InternalState::Waiti ng);
180 m_state = InternalState::Closed;
181 m_reader = nullptr;
182 }
183
184 void BytesConsumerForDataConsumerHandle::error()
185 {
186 if (m_state == InternalState::Errored)
187 return;
188 DCHECK(m_state == InternalState::Readable || m_state == InternalState::Waiti ng);
189 m_state = InternalState::Errored;
190 m_reader = nullptr;
191 m_error = Error("error");
192 }
193
194 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698