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

Side by Side Diff: third_party/WebKit/Source/modules/fetch/DataConsumerHandleTestUtil.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: test 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
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/DataConsumerHandleTestUtil.h" 5 #include "modules/fetch/DataConsumerHandleTestUtil.h"
6 6
7 #include "bindings/core/v8/DOMWrapperWorld.h" 7 #include "bindings/core/v8/DOMWrapperWorld.h"
8 #include "wtf/PtrUtil.h" 8 #include "wtf/PtrUtil.h"
9 #include <memory> 9 #include <memory>
10 10
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
85 85
86 void DataConsumerHandleTestUtil::ReplayingHandle::Context::add(const Command& co mmand) 86 void DataConsumerHandleTestUtil::ReplayingHandle::Context::add(const Command& co mmand)
87 { 87 {
88 MutexLocker locker(m_mutex); 88 MutexLocker locker(m_mutex);
89 m_commands.append(command); 89 m_commands.append(command);
90 } 90 }
91 91
92 void DataConsumerHandleTestUtil::ReplayingHandle::Context::attachReader(WebDataC onsumerHandle::Client* client) 92 void DataConsumerHandleTestUtil::ReplayingHandle::Context::attachReader(WebDataC onsumerHandle::Client* client)
93 { 93 {
94 MutexLocker locker(m_mutex); 94 MutexLocker locker(m_mutex);
95 DCHECK(!m_readerThread); 95 DCHECK(!m_readerTaskRunner);
96 DCHECK(!m_client); 96 DCHECK(!m_client);
97 m_readerThread = Platform::current()->currentThread(); 97 m_readerTaskRunner = client->getTaskRunner()->clone();
98 m_client = client; 98 m_client = client;
99 99
100 if (m_client && !(isEmpty() && m_result == ShouldWait)) 100 if (m_client && !(isEmpty() && m_result == ShouldWait))
101 notify(); 101 notify();
102 } 102 }
103 103
104 void DataConsumerHandleTestUtil::ReplayingHandle::Context::detachReader() 104 void DataConsumerHandleTestUtil::ReplayingHandle::Context::detachReader()
105 { 105 {
106 MutexLocker locker(m_mutex); 106 MutexLocker locker(m_mutex);
107 DCHECK(m_readerThread && m_readerThread->isCurrentThread()); 107 DCHECK(m_readerTaskRunner && m_readerTaskRunner->runsTasksOnCurrentThread()) ;
108 m_readerThread = nullptr; 108 m_readerTaskRunner = nullptr;
109 m_client = nullptr; 109 m_client = nullptr;
110 if (!m_isHandleAttached) 110 if (!m_isHandleAttached)
111 m_detached->signal(); 111 m_detached->signal();
112 } 112 }
113 113
114 void DataConsumerHandleTestUtil::ReplayingHandle::Context::detachHandle() 114 void DataConsumerHandleTestUtil::ReplayingHandle::Context::detachHandle()
115 { 115 {
116 MutexLocker locker(m_mutex); 116 MutexLocker locker(m_mutex);
117 m_isHandleAttached = false; 117 m_isHandleAttached = false;
118 if (!m_readerThread) 118 if (!m_readerTaskRunner)
119 m_detached->signal(); 119 m_detached->signal();
120 } 120 }
121 121
122 WebDataConsumerHandle::Result DataConsumerHandleTestUtil::ReplayingHandle::Conte xt::beginRead(const void** buffer, Flags, size_t* available) 122 WebDataConsumerHandle::Result DataConsumerHandleTestUtil::ReplayingHandle::Conte xt::beginRead(const void** buffer, Flags, size_t* available)
123 { 123 {
124 MutexLocker locker(m_mutex); 124 MutexLocker locker(m_mutex);
125 *buffer = nullptr; 125 *buffer = nullptr;
126 *available = 0; 126 *available = 0;
127 if (isEmpty()) 127 if (isEmpty())
128 return m_result; 128 return m_result;
(...skipping 27 matching lines...) Expand all
156 156
157 WebDataConsumerHandle::Result DataConsumerHandleTestUtil::ReplayingHandle::Conte xt::endRead(size_t readSize) 157 WebDataConsumerHandle::Result DataConsumerHandleTestUtil::ReplayingHandle::Conte xt::endRead(size_t readSize)
158 { 158 {
159 MutexLocker locker(m_mutex); 159 MutexLocker locker(m_mutex);
160 consume(readSize); 160 consume(readSize);
161 return Ok; 161 return Ok;
162 } 162 }
163 163
164 DataConsumerHandleTestUtil::ReplayingHandle::Context::Context() 164 DataConsumerHandleTestUtil::ReplayingHandle::Context::Context()
165 : m_offset(0) 165 : m_offset(0)
166 , m_readerThread(nullptr) 166 , m_readerTaskRunner(nullptr)
167 , m_client(nullptr) 167 , m_client(nullptr)
168 , m_result(ShouldWait) 168 , m_result(ShouldWait)
169 , m_isHandleAttached(true) 169 , m_isHandleAttached(true)
170 , m_detached(wrapUnique(new WaitableEvent())) 170 , m_detached(wrapUnique(new WaitableEvent()))
171 { 171 {
172 } 172 }
173 173
174 const DataConsumerHandleTestUtil::Command& DataConsumerHandleTestUtil::Replaying Handle::Context::top() 174 const DataConsumerHandleTestUtil::Command& DataConsumerHandleTestUtil::Replaying Handle::Context::top()
175 { 175 {
176 DCHECK(!isEmpty()); 176 DCHECK(!isEmpty());
(...skipping 10 matching lines...) Expand all
187 m_commands.removeFirst(); 187 m_commands.removeFirst();
188 } else { 188 } else {
189 m_offset += size; 189 m_offset += size;
190 } 190 }
191 } 191 }
192 192
193 void DataConsumerHandleTestUtil::ReplayingHandle::Context::notify() 193 void DataConsumerHandleTestUtil::ReplayingHandle::Context::notify()
194 { 194 {
195 if (!m_client) 195 if (!m_client)
196 return; 196 return;
197 DCHECK(m_readerThread); 197 DCHECK(m_readerTaskRunner);
198 m_readerThread->getWebTaskRunner()->postTask(BLINK_FROM_HERE, crossThreadBin d(&Context::notifyInternal, wrapPassRefPtr(this))); 198 m_readerTaskRunner->postTask(BLINK_FROM_HERE, crossThreadBind(&Context::noti fyInternal, wrapPassRefPtr(this)));
199 } 199 }
200 200
201 void DataConsumerHandleTestUtil::ReplayingHandle::Context::notifyInternal() 201 void DataConsumerHandleTestUtil::ReplayingHandle::Context::notifyInternal()
202 { 202 {
203 { 203 {
204 MutexLocker locker(m_mutex); 204 MutexLocker locker(m_mutex);
205 if (!m_client || !m_readerThread->isCurrentThread()) { 205 if (!m_client || !m_readerTaskRunner->runsTasksOnCurrentThread()) {
206 // There is no client, or a new reader is attached. 206 // There is no client, or a new reader is attached.
207 return; 207 return;
208 } 208 }
209 } 209 }
210 // The reading thread is the current thread. 210 // The reading thread is the current thread.
211 m_client->didGetReadable(); 211 m_client->didGetReadable();
212 } 212 }
213 213
214 DataConsumerHandleTestUtil::ReplayingHandle::ReplayingHandle() 214 DataConsumerHandleTestUtil::ReplayingHandle::ReplayingHandle()
215 : m_context(Context::create()) 215 : m_context(Context::create())
216 { 216 {
217 } 217 }
218 218
219 DataConsumerHandleTestUtil::ReplayingHandle::~ReplayingHandle() 219 DataConsumerHandleTestUtil::ReplayingHandle::~ReplayingHandle()
220 { 220 {
221 m_context->detachHandle(); 221 m_context->detachHandle();
222 } 222 }
223 223
224 std::unique_ptr<WebDataConsumerHandle::Reader> DataConsumerHandleTestUtil::Repla yingHandle::obtainReader(Client* client) 224 std::unique_ptr<WebDataConsumerHandle::Reader> DataConsumerHandleTestUtil::Repla yingHandle::obtainReader(Client* client)
225 { 225 {
226 return WTF::wrapUnique(new ReaderImpl(m_context, client)); 226 return WTF::wrapUnique(new ReaderImpl(m_context, client));
227 } 227 }
228 228
229 void DataConsumerHandleTestUtil::ReplayingHandle::add(const Command& command) 229 void DataConsumerHandleTestUtil::ReplayingHandle::add(const Command& command)
230 { 230 {
231 m_context->add(command); 231 m_context->add(command);
232 } 232 }
233 233
234 DataConsumerHandleTestUtil::HandleReader::HandleReader(std::unique_ptr<WebDataCo nsumerHandle> handle, std::unique_ptr<OnFinishedReading> onFinishedReading) 234 DataConsumerHandleTestUtil::HandleReader::HandleReader(std::unique_ptr<WebDataCo nsumerHandle> handle, std::unique_ptr<OnFinishedReading> onFinishedReading, std: :unique_ptr<WebTaskRunner> readerTaskRunner)
235 : m_reader(handle->obtainReader(this)) 235 : m_readerTaskRunner(std::move(readerTaskRunner))
236 , m_reader(handle->obtainReader(this))
236 , m_onFinishedReading(std::move(onFinishedReading)) 237 , m_onFinishedReading(std::move(onFinishedReading))
237 { 238 {
238 } 239 }
239 240
240 void DataConsumerHandleTestUtil::HandleReader::didGetReadable() 241 void DataConsumerHandleTestUtil::HandleReader::didGetReadable()
241 { 242 {
242 WebDataConsumerHandle::Result r = WebDataConsumerHandle::UnexpectedError; 243 WebDataConsumerHandle::Result r = WebDataConsumerHandle::UnexpectedError;
243 char buffer[3]; 244 char buffer[3];
244 while (true) { 245 while (true) {
245 size_t size; 246 size_t size;
246 r = m_reader->read(buffer, sizeof(buffer), WebDataConsumerHandle::FlagNo ne, &size); 247 r = m_reader->read(buffer, sizeof(buffer), WebDataConsumerHandle::FlagNo ne, &size);
247 if (r == WebDataConsumerHandle::ShouldWait) 248 if (r == WebDataConsumerHandle::ShouldWait)
248 return; 249 return;
249 if (r != WebDataConsumerHandle::Ok) 250 if (r != WebDataConsumerHandle::Ok)
250 break; 251 break;
251 m_data.append(buffer, size); 252 m_data.append(buffer, size);
252 } 253 }
253 std::unique_ptr<HandleReadResult> result = wrapUnique(new HandleReadResult(r , m_data)); 254 std::unique_ptr<HandleReadResult> result = wrapUnique(new HandleReadResult(r , m_data));
254 m_data.clear(); 255 m_data.clear();
255 Platform::current()->currentThread()->getWebTaskRunner()->postTask(BLINK_FRO M_HERE, WTF::bind(&HandleReader::runOnFinishedReading, WTF::unretained(this), pa ssed(std::move(result)))); 256 m_readerTaskRunner->postTask(BLINK_FROM_HERE, WTF::bind(&HandleReader::runOn FinishedReading, WTF::unretained(this), passed(std::move(result))));
256 m_reader = nullptr; 257 m_reader = nullptr;
257 } 258 }
258 259
260 WebTaskRunner* DataConsumerHandleTestUtil::HandleReader::getTaskRunner()
261 {
262 return m_readerTaskRunner.get();
263 }
264
259 void DataConsumerHandleTestUtil::HandleReader::runOnFinishedReading(std::unique_ ptr<HandleReadResult> result) 265 void DataConsumerHandleTestUtil::HandleReader::runOnFinishedReading(std::unique_ ptr<HandleReadResult> result)
260 { 266 {
261 DCHECK(m_onFinishedReading); 267 DCHECK(m_onFinishedReading);
262 std::unique_ptr<OnFinishedReading> onFinishedReading(std::move(m_onFinishedR eading)); 268 std::unique_ptr<OnFinishedReading> onFinishedReading(std::move(m_onFinishedR eading));
263 (*onFinishedReading)(std::move(result)); 269 (*onFinishedReading)(std::move(result));
264 } 270 }
265 271
266 DataConsumerHandleTestUtil::HandleTwoPhaseReader::HandleTwoPhaseReader(std::uniq ue_ptr<WebDataConsumerHandle> handle, std::unique_ptr<OnFinishedReading> onFinis hedReading) 272 DataConsumerHandleTestUtil::HandleTwoPhaseReader::HandleTwoPhaseReader(std::uniq ue_ptr<WebDataConsumerHandle> handle, std::unique_ptr<OnFinishedReading> onFinis hedReading, std::unique_ptr<WebTaskRunner> readerTaskRunner)
267 : m_reader(handle->obtainReader(this)) 273 : m_readerTaskRunner(std::move(readerTaskRunner))
274 , m_reader(handle->obtainReader(this))
268 , m_onFinishedReading(std::move(onFinishedReading)) 275 , m_onFinishedReading(std::move(onFinishedReading))
269 { 276 {
270 } 277 }
271 278
272 void DataConsumerHandleTestUtil::HandleTwoPhaseReader::didGetReadable() 279 void DataConsumerHandleTestUtil::HandleTwoPhaseReader::didGetReadable()
273 { 280 {
274 WebDataConsumerHandle::Result r = WebDataConsumerHandle::UnexpectedError; 281 WebDataConsumerHandle::Result r = WebDataConsumerHandle::UnexpectedError;
275 while (true) { 282 while (true) {
276 const void* buffer = nullptr; 283 const void* buffer = nullptr;
277 size_t size; 284 size_t size;
278 r = m_reader->beginRead(&buffer, WebDataConsumerHandle::FlagNone, &size) ; 285 r = m_reader->beginRead(&buffer, WebDataConsumerHandle::FlagNone, &size) ;
279 if (r == WebDataConsumerHandle::ShouldWait) 286 if (r == WebDataConsumerHandle::ShouldWait)
280 return; 287 return;
281 if (r != WebDataConsumerHandle::Ok) 288 if (r != WebDataConsumerHandle::Ok)
282 break; 289 break;
283 // Read smaller than available in order to test |endRead|. 290 // Read smaller than available in order to test |endRead|.
284 size_t readSize = std::min(size, std::max(size * 2 / 3, static_cast<size _t>(1))); 291 size_t readSize = std::min(size, std::max(size * 2 / 3, static_cast<size _t>(1)));
285 m_data.append(static_cast<const char*>(buffer), readSize); 292 m_data.append(static_cast<const char*>(buffer), readSize);
286 m_reader->endRead(readSize); 293 m_reader->endRead(readSize);
287 } 294 }
288 std::unique_ptr<HandleReadResult> result = wrapUnique(new HandleReadResult(r , m_data)); 295 std::unique_ptr<HandleReadResult> result = wrapUnique(new HandleReadResult(r , m_data));
289 m_data.clear(); 296 m_data.clear();
290 Platform::current()->currentThread()->getWebTaskRunner()->postTask(BLINK_FRO M_HERE, WTF::bind(&HandleTwoPhaseReader::runOnFinishedReading, WTF::unretained(t his), passed(std::move(result)))); 297 m_readerTaskRunner->postTask(BLINK_FROM_HERE, WTF::bind(&HandleTwoPhaseReade r::runOnFinishedReading, WTF::unretained(this), passed(std::move(result))));
291 m_reader = nullptr; 298 m_reader = nullptr;
292 } 299 }
293 300
301 WebTaskRunner* DataConsumerHandleTestUtil::HandleTwoPhaseReader::getTaskRunner()
302 {
303 return m_readerTaskRunner.get();
304 }
305
294 void DataConsumerHandleTestUtil::HandleTwoPhaseReader::runOnFinishedReading(std: :unique_ptr<HandleReadResult> result) 306 void DataConsumerHandleTestUtil::HandleTwoPhaseReader::runOnFinishedReading(std: :unique_ptr<HandleReadResult> result)
295 { 307 {
296 DCHECK(m_onFinishedReading); 308 DCHECK(m_onFinishedReading);
297 std::unique_ptr<OnFinishedReading> onFinishedReading(std::move(m_onFinishedR eading)); 309 std::unique_ptr<OnFinishedReading> onFinishedReading(std::move(m_onFinishedR eading));
298 (*onFinishedReading)(std::move(result)); 310 (*onFinishedReading)(std::move(result));
299 } 311 }
300 312
313 std::unique_ptr<WebTaskRunner> getCurrentTaskRunner()
314 {
315 return Platform::current()->currentThread()->getWebTaskRunner()->clone();
haraken 2016/07/28 09:19:30 Do you need clone()?
tzik 2016/07/28 14:45:34 This is no longer used. Let me remove it.
316 }
317
301 } // namespace blink 318 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698