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

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: Created 4 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 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(PassOwnPt r<FetchDataConsumerHandle> handle)
13 : m_reader(handle->obtainReader(this))
14 {
15 }
16
17 BytesConsumerForDataConsumerHandle::~BytesConsumerForDataConsumerHandle() {}
18
19 BytesConsumer::Result BytesConsumerForDataConsumerHandle::read(char* buffer, siz e_t size, size_t* readSize)
20 {
21 if (m_state == State::Closed)
22 return Result::Done;
23 if (m_state == State::Errored)
24 return Result::Error;
25
26 WebDataConsumerHandle::Result r = m_reader->read(buffer, size, WebDataConsum erHandle::FlagNone, readSize);
27 switch (r) {
28 case WebDataConsumerHandle::Ok:
29 return Result::Ok;
30 case WebDataConsumerHandle::ShouldWait:
31 return Result::ShouldWait;
32 case WebDataConsumerHandle::Done:
33 close();
34 return Result::Done;
35 default:
36 error();
37 return Result::Error;
38 }
39 }
40
41 BytesConsumer::Result BytesConsumerForDataConsumerHandle::beginRead(const char** buffer, size_t* available)
42 {
43 if (m_state == State::Closed)
44 return Result::Done;
45 if (m_state == State::Errored)
46 return Result::Error;
47
48 WebDataConsumerHandle::Result r = m_reader->beginRead(reinterpret_cast<const void**>(buffer), WebDataConsumerHandle::FlagNone, available);
49 switch (r) {
50 case WebDataConsumerHandle::Ok:
51 return Result::Ok;
52 case WebDataConsumerHandle::ShouldWait:
53 return Result::ShouldWait;
54 case WebDataConsumerHandle::Done:
55 close();
56 return Result::Done;
57 default:
58 error();
59 return Result::Error;
60 }
61 }
62
63 BytesConsumer::Result BytesConsumerForDataConsumerHandle::endRead(size_t read)
64 {
65 DCHECK(m_state == State::Readable || m_state == State::Waiting);
66 WebDataConsumerHandle::Result r = m_reader->endRead(read);
67 if (r == WebDataConsumerHandle::Ok)
68 return Result::Ok;
69 error();
70 return Result::Error;
71 }
72
73 PassRefPtr<BlobDataHandle> BytesConsumerForDataConsumerHandle::drainAsBlobDataHa ndle(BlobSizePolicy policy)
74 {
75 if (!m_reader)
76 return nullptr;
77 if (policy == BlobSizePolicy::DisallowBlobWithInvalidSize)
78 return m_reader->drainAsBlobDataHandle(FetchDataConsumerHandle::Reader:: DisallowBlobWithInvalidSize);
79 DCHECK_EQ(BlobSizePolicy::AllowBlobWithInvalidSize, policy);
80 return m_reader->drainAsBlobDataHandle(FetchDataConsumerHandle::Reader::Allo wBlobWithInvalidSize);
81 }
82
83 PassRefPtr<EncodedFormData> BytesConsumerForDataConsumerHandle::drainAsFormData( )
84 {
85 if (!m_reader)
86 return nullptr;
87 return m_reader->drainAsFormData();
88 }
89
90 void BytesConsumerForDataConsumerHandle::setClient(BytesConsumer::Client* client )
91 {
92 DCHECK(!m_client);
93 DCHECK(client);
94 m_client = client;
95 }
96
97 void BytesConsumerForDataConsumerHandle::clearClient()
98 {
99 DCHECK(m_client);
100 m_client = nullptr;
101 }
102
103 void BytesConsumerForDataConsumerHandle::cancel()
104 {
105 if (m_state == State::Readable || m_state == State::Waiting) {
106 // We don't want the client to be notified in this case.
107 BytesConsumer::Client* client = m_client;
108 m_client = nullptr;
109 close();
110 m_client = client;
111 }
112 }
113
114 void BytesConsumerForDataConsumerHandle::didGetReadable()
115 {
116 DCHECK(m_state == State::Readable || m_state == State::Waiting);
117 // Perform zero-length read to call check handle's status.
118 size_t readSize;
119 WebDataConsumerHandle::Result result = m_reader->read(nullptr, 0, WebDataCon sumerHandle::FlagNone, &readSize);
120 switch (result) {
121 case WebDataConsumerHandle::Ok:
122 case WebDataConsumerHandle::ShouldWait:
123 if (m_client)
124 m_client->onReadable();
125 return;
126 case WebDataConsumerHandle::Done:
127 close();
128 return;
129 case WebDataConsumerHandle::Busy:
130 case WebDataConsumerHandle::ResourceExhausted:
131 case WebDataConsumerHandle::UnexpectedError:
132 error();
133 return;
134 }
135 return;
136 }
137
138 DEFINE_TRACE(BytesConsumerForDataConsumerHandle)
139 {
140 visitor->trace(m_client);
141 BytesConsumer::trace(visitor);
142 }
143
144 void BytesConsumerForDataConsumerHandle::close()
145 {
146 if (m_state == State::Closed)
147 return;
148 DCHECK(m_state == State::Readable || m_state == State::Waiting);
149 m_state = State::Closed;
150 m_reader = nullptr;
151 if (m_client)
152 m_client->onClose();
153 }
154
155 void BytesConsumerForDataConsumerHandle::error()
156 {
157 if (m_state == State::Errored)
158 return;
159 DCHECK(m_state == State::Readable || m_state == State::Waiting);
160 m_state = State::Errored;
161 m_reader = nullptr;
162 m_error = Error("error");
163 if (m_client)
164 m_client->onError(m_error);
165 }
166
167 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698