| OLD | NEW |
| 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 Loading... |
| 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 if (client) |
| 98 m_readerTaskRunner = client->getTaskRunner()->clone(); |
| 99 else |
| 100 m_readerTaskRunner = Platform::current()->currentThread()->getWebTaskRun
ner()->clone(); |
| 98 m_client = client; | 101 m_client = client; |
| 99 | 102 |
| 100 if (m_client && !(isEmpty() && m_result == ShouldWait)) | 103 if (m_client && !(isEmpty() && m_result == ShouldWait)) |
| 101 notify(); | 104 notify(); |
| 102 } | 105 } |
| 103 | 106 |
| 104 void DataConsumerHandleTestUtil::ReplayingHandle::Context::detachReader() | 107 void DataConsumerHandleTestUtil::ReplayingHandle::Context::detachReader() |
| 105 { | 108 { |
| 106 MutexLocker locker(m_mutex); | 109 MutexLocker locker(m_mutex); |
| 107 DCHECK(m_readerThread && m_readerThread->isCurrentThread()); | 110 DCHECK(m_readerTaskRunner && m_readerTaskRunner->runsTasksOnCurrentThread())
; |
| 108 m_readerThread = nullptr; | 111 m_readerTaskRunner = nullptr; |
| 109 m_client = nullptr; | 112 m_client = nullptr; |
| 110 if (!m_isHandleAttached) | 113 if (!m_isHandleAttached) |
| 111 m_detached->signal(); | 114 m_detached->signal(); |
| 112 } | 115 } |
| 113 | 116 |
| 114 void DataConsumerHandleTestUtil::ReplayingHandle::Context::detachHandle() | 117 void DataConsumerHandleTestUtil::ReplayingHandle::Context::detachHandle() |
| 115 { | 118 { |
| 116 MutexLocker locker(m_mutex); | 119 MutexLocker locker(m_mutex); |
| 117 m_isHandleAttached = false; | 120 m_isHandleAttached = false; |
| 118 if (!m_readerThread) | 121 if (!m_readerTaskRunner) |
| 119 m_detached->signal(); | 122 m_detached->signal(); |
| 120 } | 123 } |
| 121 | 124 |
| 122 WebDataConsumerHandle::Result DataConsumerHandleTestUtil::ReplayingHandle::Conte
xt::beginRead(const void** buffer, Flags, size_t* available) | 125 WebDataConsumerHandle::Result DataConsumerHandleTestUtil::ReplayingHandle::Conte
xt::beginRead(const void** buffer, Flags, size_t* available) |
| 123 { | 126 { |
| 124 MutexLocker locker(m_mutex); | 127 MutexLocker locker(m_mutex); |
| 125 *buffer = nullptr; | 128 *buffer = nullptr; |
| 126 *available = 0; | 129 *available = 0; |
| 127 if (isEmpty()) | 130 if (isEmpty()) |
| 128 return m_result; | 131 return m_result; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 156 | 159 |
| 157 WebDataConsumerHandle::Result DataConsumerHandleTestUtil::ReplayingHandle::Conte
xt::endRead(size_t readSize) | 160 WebDataConsumerHandle::Result DataConsumerHandleTestUtil::ReplayingHandle::Conte
xt::endRead(size_t readSize) |
| 158 { | 161 { |
| 159 MutexLocker locker(m_mutex); | 162 MutexLocker locker(m_mutex); |
| 160 consume(readSize); | 163 consume(readSize); |
| 161 return Ok; | 164 return Ok; |
| 162 } | 165 } |
| 163 | 166 |
| 164 DataConsumerHandleTestUtil::ReplayingHandle::Context::Context() | 167 DataConsumerHandleTestUtil::ReplayingHandle::Context::Context() |
| 165 : m_offset(0) | 168 : m_offset(0) |
| 166 , m_readerThread(nullptr) | 169 , m_readerTaskRunner(nullptr) |
| 167 , m_client(nullptr) | 170 , m_client(nullptr) |
| 168 , m_result(ShouldWait) | 171 , m_result(ShouldWait) |
| 169 , m_isHandleAttached(true) | 172 , m_isHandleAttached(true) |
| 170 , m_detached(wrapUnique(new WaitableEvent())) | 173 , m_detached(wrapUnique(new WaitableEvent())) |
| 171 { | 174 { |
| 172 } | 175 } |
| 173 | 176 |
| 174 const DataConsumerHandleTestUtil::Command& DataConsumerHandleTestUtil::Replaying
Handle::Context::top() | 177 const DataConsumerHandleTestUtil::Command& DataConsumerHandleTestUtil::Replaying
Handle::Context::top() |
| 175 { | 178 { |
| 176 DCHECK(!isEmpty()); | 179 DCHECK(!isEmpty()); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 187 m_commands.removeFirst(); | 190 m_commands.removeFirst(); |
| 188 } else { | 191 } else { |
| 189 m_offset += size; | 192 m_offset += size; |
| 190 } | 193 } |
| 191 } | 194 } |
| 192 | 195 |
| 193 void DataConsumerHandleTestUtil::ReplayingHandle::Context::notify() | 196 void DataConsumerHandleTestUtil::ReplayingHandle::Context::notify() |
| 194 { | 197 { |
| 195 if (!m_client) | 198 if (!m_client) |
| 196 return; | 199 return; |
| 197 DCHECK(m_readerThread); | 200 m_client->getTaskRunner()->postTask(BLINK_FROM_HERE, crossThreadBind(&Contex
t::notifyInternal, wrapPassRefPtr(this))); |
| 198 m_readerThread->getWebTaskRunner()->postTask(BLINK_FROM_HERE, crossThreadBin
d(&Context::notifyInternal, wrapPassRefPtr(this))); | |
| 199 } | 201 } |
| 200 | 202 |
| 201 void DataConsumerHandleTestUtil::ReplayingHandle::Context::notifyInternal() | 203 void DataConsumerHandleTestUtil::ReplayingHandle::Context::notifyInternal() |
| 202 { | 204 { |
| 203 { | 205 { |
| 204 MutexLocker locker(m_mutex); | 206 MutexLocker locker(m_mutex); |
| 205 if (!m_client || !m_readerThread->isCurrentThread()) { | 207 if (!m_client || !m_readerTaskRunner->runsTasksOnCurrentThread()) { |
| 206 // There is no client, or a new reader is attached. | 208 // There is no client, or a new reader is attached. |
| 207 return; | 209 return; |
| 208 } | 210 } |
| 209 } | 211 } |
| 210 // The reading thread is the current thread. | 212 // The reading thread is the current thread. |
| 211 m_client->didGetReadable(); | 213 m_client->didGetReadable(); |
| 212 } | 214 } |
| 213 | 215 |
| 214 DataConsumerHandleTestUtil::ReplayingHandle::ReplayingHandle() | 216 DataConsumerHandleTestUtil::ReplayingHandle::ReplayingHandle() |
| 215 : m_context(Context::create()) | 217 : m_context(Context::create()) |
| 216 { | 218 { |
| 217 } | 219 } |
| 218 | 220 |
| 219 DataConsumerHandleTestUtil::ReplayingHandle::~ReplayingHandle() | 221 DataConsumerHandleTestUtil::ReplayingHandle::~ReplayingHandle() |
| 220 { | 222 { |
| 221 m_context->detachHandle(); | 223 m_context->detachHandle(); |
| 222 } | 224 } |
| 223 | 225 |
| 224 std::unique_ptr<WebDataConsumerHandle::Reader> DataConsumerHandleTestUtil::Repla
yingHandle::obtainReader(Client* client) | 226 std::unique_ptr<WebDataConsumerHandle::Reader> DataConsumerHandleTestUtil::Repla
yingHandle::obtainReader(Client* client) |
| 225 { | 227 { |
| 226 return WTF::wrapUnique(new ReaderImpl(m_context, client)); | 228 return WTF::wrapUnique(new ReaderImpl(m_context, client)); |
| 227 } | 229 } |
| 228 | 230 |
| 229 void DataConsumerHandleTestUtil::ReplayingHandle::add(const Command& command) | 231 void DataConsumerHandleTestUtil::ReplayingHandle::add(const Command& command) |
| 230 { | 232 { |
| 231 m_context->add(command); | 233 m_context->add(command); |
| 232 } | 234 } |
| 233 | 235 |
| 234 DataConsumerHandleTestUtil::HandleReader::HandleReader(std::unique_ptr<WebDataCo
nsumerHandle> handle, std::unique_ptr<OnFinishedReading> onFinishedReading) | 236 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)) | 237 : m_readerTaskRunner(std::move(readerTaskRunner)) |
| 238 , m_reader(handle->obtainReader(this)) |
| 236 , m_onFinishedReading(std::move(onFinishedReading)) | 239 , m_onFinishedReading(std::move(onFinishedReading)) |
| 237 { | 240 { |
| 238 } | 241 } |
| 239 | 242 |
| 240 void DataConsumerHandleTestUtil::HandleReader::didGetReadable() | 243 void DataConsumerHandleTestUtil::HandleReader::didGetReadable() |
| 241 { | 244 { |
| 242 WebDataConsumerHandle::Result r = WebDataConsumerHandle::UnexpectedError; | 245 WebDataConsumerHandle::Result r = WebDataConsumerHandle::UnexpectedError; |
| 243 char buffer[3]; | 246 char buffer[3]; |
| 244 while (true) { | 247 while (true) { |
| 245 size_t size; | 248 size_t size; |
| 246 r = m_reader->read(buffer, sizeof(buffer), WebDataConsumerHandle::FlagNo
ne, &size); | 249 r = m_reader->read(buffer, sizeof(buffer), WebDataConsumerHandle::FlagNo
ne, &size); |
| 247 if (r == WebDataConsumerHandle::ShouldWait) | 250 if (r == WebDataConsumerHandle::ShouldWait) |
| 248 return; | 251 return; |
| 249 if (r != WebDataConsumerHandle::Ok) | 252 if (r != WebDataConsumerHandle::Ok) |
| 250 break; | 253 break; |
| 251 m_data.append(buffer, size); | 254 m_data.append(buffer, size); |
| 252 } | 255 } |
| 253 std::unique_ptr<HandleReadResult> result = wrapUnique(new HandleReadResult(r
, m_data)); | 256 std::unique_ptr<HandleReadResult> result = wrapUnique(new HandleReadResult(r
, m_data)); |
| 254 m_data.clear(); | 257 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)))); | 258 m_readerTaskRunner->postTask(BLINK_FROM_HERE, WTF::bind(&HandleReader::runOn
FinishedReading, WTF::unretained(this), passed(std::move(result)))); |
| 256 m_reader = nullptr; | 259 m_reader = nullptr; |
| 257 } | 260 } |
| 258 | 261 |
| 262 WebTaskRunner* DataConsumerHandleTestUtil::HandleReader::getTaskRunner() |
| 263 { |
| 264 return m_readerTaskRunner.get(); |
| 265 } |
| 266 |
| 259 void DataConsumerHandleTestUtil::HandleReader::runOnFinishedReading(std::unique_
ptr<HandleReadResult> result) | 267 void DataConsumerHandleTestUtil::HandleReader::runOnFinishedReading(std::unique_
ptr<HandleReadResult> result) |
| 260 { | 268 { |
| 261 DCHECK(m_onFinishedReading); | 269 DCHECK(m_onFinishedReading); |
| 262 std::unique_ptr<OnFinishedReading> onFinishedReading(std::move(m_onFinishedR
eading)); | 270 std::unique_ptr<OnFinishedReading> onFinishedReading(std::move(m_onFinishedR
eading)); |
| 263 (*onFinishedReading)(std::move(result)); | 271 (*onFinishedReading)(std::move(result)); |
| 264 } | 272 } |
| 265 | 273 |
| 266 DataConsumerHandleTestUtil::HandleTwoPhaseReader::HandleTwoPhaseReader(std::uniq
ue_ptr<WebDataConsumerHandle> handle, std::unique_ptr<OnFinishedReading> onFinis
hedReading) | 274 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)) | 275 : m_readerTaskRunner(std::move(readerTaskRunner)) |
| 276 , m_reader(handle->obtainReader(this)) |
| 268 , m_onFinishedReading(std::move(onFinishedReading)) | 277 , m_onFinishedReading(std::move(onFinishedReading)) |
| 269 { | 278 { |
| 270 } | 279 } |
| 271 | 280 |
| 272 void DataConsumerHandleTestUtil::HandleTwoPhaseReader::didGetReadable() | 281 void DataConsumerHandleTestUtil::HandleTwoPhaseReader::didGetReadable() |
| 273 { | 282 { |
| 274 WebDataConsumerHandle::Result r = WebDataConsumerHandle::UnexpectedError; | 283 WebDataConsumerHandle::Result r = WebDataConsumerHandle::UnexpectedError; |
| 275 while (true) { | 284 while (true) { |
| 276 const void* buffer = nullptr; | 285 const void* buffer = nullptr; |
| 277 size_t size; | 286 size_t size; |
| 278 r = m_reader->beginRead(&buffer, WebDataConsumerHandle::FlagNone, &size)
; | 287 r = m_reader->beginRead(&buffer, WebDataConsumerHandle::FlagNone, &size)
; |
| 279 if (r == WebDataConsumerHandle::ShouldWait) | 288 if (r == WebDataConsumerHandle::ShouldWait) |
| 280 return; | 289 return; |
| 281 if (r != WebDataConsumerHandle::Ok) | 290 if (r != WebDataConsumerHandle::Ok) |
| 282 break; | 291 break; |
| 283 // Read smaller than available in order to test |endRead|. | 292 // 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))); | 293 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); | 294 m_data.append(static_cast<const char*>(buffer), readSize); |
| 286 m_reader->endRead(readSize); | 295 m_reader->endRead(readSize); |
| 287 } | 296 } |
| 288 std::unique_ptr<HandleReadResult> result = wrapUnique(new HandleReadResult(r
, m_data)); | 297 std::unique_ptr<HandleReadResult> result = wrapUnique(new HandleReadResult(r
, m_data)); |
| 289 m_data.clear(); | 298 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)))); | 299 m_readerTaskRunner->postTask(BLINK_FROM_HERE, WTF::bind(&HandleTwoPhaseReade
r::runOnFinishedReading, WTF::unretained(this), passed(std::move(result)))); |
| 291 m_reader = nullptr; | 300 m_reader = nullptr; |
| 292 } | 301 } |
| 293 | 302 |
| 303 WebTaskRunner* DataConsumerHandleTestUtil::HandleTwoPhaseReader::getTaskRunner() |
| 304 { |
| 305 return m_readerTaskRunner.get(); |
| 306 } |
| 307 |
| 294 void DataConsumerHandleTestUtil::HandleTwoPhaseReader::runOnFinishedReading(std:
:unique_ptr<HandleReadResult> result) | 308 void DataConsumerHandleTestUtil::HandleTwoPhaseReader::runOnFinishedReading(std:
:unique_ptr<HandleReadResult> result) |
| 295 { | 309 { |
| 296 DCHECK(m_onFinishedReading); | 310 DCHECK(m_onFinishedReading); |
| 297 std::unique_ptr<OnFinishedReading> onFinishedReading(std::move(m_onFinishedR
eading)); | 311 std::unique_ptr<OnFinishedReading> onFinishedReading(std::move(m_onFinishedR
eading)); |
| 298 (*onFinishedReading)(std::move(result)); | 312 (*onFinishedReading)(std::move(result)); |
| 299 } | 313 } |
| 300 | 314 |
| 301 } // namespace blink | 315 } // namespace blink |
| OLD | NEW |