OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2009, 2010 Google Inc. All rights reserved. | 2 * Copyright (C) 2009, 2010 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
201 RefPtr<WaitableEventWithTasks> m_eventWithTasks; | 201 RefPtr<WaitableEventWithTasks> m_eventWithTasks; |
202 }; | 202 }; |
203 | 203 |
204 WorkerThreadableLoader::WorkerThreadableLoader( | 204 WorkerThreadableLoader::WorkerThreadableLoader( |
205 WorkerGlobalScope& workerGlobalScope, | 205 WorkerGlobalScope& workerGlobalScope, |
206 ThreadableLoaderClient* client, | 206 ThreadableLoaderClient* client, |
207 const ThreadableLoaderOptions& options, | 207 const ThreadableLoaderOptions& options, |
208 const ResourceLoaderOptions& resourceLoaderOptions, | 208 const ResourceLoaderOptions& resourceLoaderOptions, |
209 BlockingBehavior blockingBehavior) | 209 BlockingBehavior blockingBehavior) |
210 : m_workerGlobalScope(&workerGlobalScope) | 210 : m_workerGlobalScope(&workerGlobalScope) |
211 , m_workerClientWrapper(new ThreadableLoaderClientWrapper(workerGlobalScope,
client)) | 211 , m_workerLoaderProxy(workerGlobalScope.thread()->workerLoaderProxy()) |
212 , m_bridge(new Bridge(m_workerClientWrapper, workerGlobalScope.thread()->wor
kerLoaderProxy(), options, resourceLoaderOptions, blockingBehavior)) | 212 , m_client(client) |
| 213 , m_threadableLoaderOptions(options) |
| 214 , m_resourceLoaderOptions(resourceLoaderOptions) |
| 215 , m_blockingBehavior(blockingBehavior) |
213 { | 216 { |
| 217 DCHECK(client); |
214 } | 218 } |
215 | 219 |
216 void WorkerThreadableLoader::loadResourceSynchronously(WorkerGlobalScope& worker
GlobalScope, const ResourceRequest& request, ThreadableLoaderClient& client, con
st ThreadableLoaderOptions& options, const ResourceLoaderOptions& resourceLoader
Options) | 220 void WorkerThreadableLoader::loadResourceSynchronously(WorkerGlobalScope& worker
GlobalScope, const ResourceRequest& request, ThreadableLoaderClient& client, con
st ThreadableLoaderOptions& options, const ResourceLoaderOptions& resourceLoader
Options) |
217 { | 221 { |
218 std::unique_ptr<WorkerThreadableLoader> loader = wrapUnique(new WorkerThread
ableLoader(workerGlobalScope, &client, options, resourceLoaderOptions, LoadSynch
ronously)); | 222 (new WorkerThreadableLoader(workerGlobalScope, &client, options, resourceLoa
derOptions, LoadSynchronously))->start(request); |
219 loader->start(request); | |
220 } | 223 } |
221 | 224 |
222 WorkerThreadableLoader::~WorkerThreadableLoader() | 225 WorkerThreadableLoader::~WorkerThreadableLoader() |
223 { | 226 { |
224 DCHECK(m_workerClientWrapper->done()); | 227 DCHECK(!m_peer); |
225 m_bridge->destroy(); | 228 DCHECK(!m_client); |
226 } | 229 } |
227 | 230 |
228 void WorkerThreadableLoader::start(const ResourceRequest& request) | 231 void WorkerThreadableLoader::start(const ResourceRequest& originalRequest) |
229 { | 232 { |
230 ResourceRequest requestToPass(request); | 233 ResourceRequest request(originalRequest); |
231 if (!requestToPass.didSetHTTPReferrer()) | 234 if (!request.didSetHTTPReferrer()) |
232 requestToPass.setHTTPReferrer(SecurityPolicy::generateReferrer(m_workerG
lobalScope->getReferrerPolicy(), request.url(), m_workerGlobalScope->outgoingRef
errer())); | 235 request.setHTTPReferrer(SecurityPolicy::generateReferrer(m_workerGlobalS
cope->getReferrerPolicy(), request.url(), m_workerGlobalScope->outgoingReferrer(
))); |
233 m_bridge->start(requestToPass, *m_workerGlobalScope); | |
234 } | |
235 | 236 |
236 void WorkerThreadableLoader::overrideTimeout(unsigned long timeoutMilliseconds) | |
237 { | |
238 m_bridge->overrideTimeout(timeoutMilliseconds); | |
239 } | |
240 | |
241 void WorkerThreadableLoader::cancel() | |
242 { | |
243 m_bridge->cancel(); | |
244 } | |
245 | |
246 WorkerThreadableLoader::Bridge::Bridge( | |
247 ThreadableLoaderClientWrapper* clientWrapper, | |
248 PassRefPtr<WorkerLoaderProxy> loaderProxy, | |
249 const ThreadableLoaderOptions& threadableLoaderOptions, | |
250 const ResourceLoaderOptions& resourceLoaderOptions, | |
251 BlockingBehavior blockingBehavior) | |
252 : m_clientWrapper(clientWrapper) | |
253 , m_loaderProxy(loaderProxy) | |
254 , m_threadableLoaderOptions(threadableLoaderOptions) | |
255 , m_resourceLoaderOptions(resourceLoaderOptions) | |
256 , m_blockingBehavior(blockingBehavior) | |
257 { | |
258 DCHECK(!isMainThread()); | |
259 } | |
260 | |
261 WorkerThreadableLoader::Bridge::~Bridge() | |
262 { | |
263 DCHECK(!isMainThread()); | |
264 DCHECK(!m_peer); | |
265 } | |
266 | |
267 void WorkerThreadableLoader::Bridge::start(const ResourceRequest& request, const
WorkerGlobalScope& workerGlobalScope) | |
268 { | |
269 DCHECK(!isMainThread()); | 237 DCHECK(!isMainThread()); |
270 RefPtr<WaitableEventWithTasks> eventWithTasks; | 238 RefPtr<WaitableEventWithTasks> eventWithTasks; |
271 if (m_blockingBehavior == LoadSynchronously) | 239 if (m_blockingBehavior == LoadSynchronously) |
272 eventWithTasks = WaitableEventWithTasks::create(); | 240 eventWithTasks = WaitableEventWithTasks::create(); |
273 | 241 |
274 m_loaderProxy->postTaskToLoader(BLINK_FROM_HERE, createCrossThreadTask( | 242 m_workerLoaderProxy->postTaskToLoader(BLINK_FROM_HERE, createCrossThreadTask
( |
275 &Peer::createAndStart, | 243 &Peer::createAndStart, |
276 wrapCrossThreadPersistent(this), | 244 wrapCrossThreadPersistent(this), |
277 m_loaderProxy, | 245 m_workerLoaderProxy, |
278 wrapCrossThreadPersistent(workerGlobalScope.thread()->getWorkerThreadLif
ecycleContext()), | 246 wrapCrossThreadPersistent(m_workerGlobalScope->thread()->getWorkerThread
LifecycleContext()), |
279 request, | 247 request, |
280 m_threadableLoaderOptions, | 248 m_threadableLoaderOptions, |
281 m_resourceLoaderOptions, | 249 m_resourceLoaderOptions, |
282 eventWithTasks)); | 250 eventWithTasks)); |
283 | 251 |
284 if (m_blockingBehavior == LoadAsynchronously) | 252 if (m_blockingBehavior == LoadAsynchronously) |
285 return; | 253 return; |
286 | 254 |
287 { | 255 { |
288 SafePointScope scope(BlinkGC::HeapPointersOnStack); | 256 SafePointScope scope(BlinkGC::HeapPointersOnStack); |
(...skipping 11 matching lines...) Expand all Loading... |
300 // it to ensure it is stored in the crash dump. | 268 // it to ensure it is stored in the crash dump. |
301 const void* programCounter = task.m_location.program_counter(); | 269 const void* programCounter = task.m_location.program_counter(); |
302 WTF::debug::alias(&programCounter); | 270 WTF::debug::alias(&programCounter); |
303 | 271 |
304 // m_clientTask contains only CallClosureTasks. So, it's ok to pass | 272 // m_clientTask contains only CallClosureTasks. So, it's ok to pass |
305 // the nullptr. | 273 // the nullptr. |
306 task.m_task->performTask(nullptr); | 274 task.m_task->performTask(nullptr); |
307 } | 275 } |
308 } | 276 } |
309 | 277 |
310 void WorkerThreadableLoader::Bridge::overrideTimeout(unsigned long timeoutMillis
econds) | 278 void WorkerThreadableLoader::overrideTimeout(unsigned long timeoutMilliseconds) |
311 { | 279 { |
312 DCHECK(!isMainThread()); | 280 DCHECK(!isMainThread()); |
313 if (!m_peer) | 281 if (!m_peer) |
314 return; | 282 return; |
315 m_loaderProxy->postTaskToLoader(BLINK_FROM_HERE, createCrossThreadTask(&Peer
::overrideTimeout, m_peer, timeoutMilliseconds)); | 283 m_workerLoaderProxy->postTaskToLoader(BLINK_FROM_HERE, createCrossThreadTask
(&Peer::overrideTimeout, m_peer, timeoutMilliseconds)); |
316 } | 284 } |
317 | 285 |
318 void WorkerThreadableLoader::Bridge::cancel() | 286 void WorkerThreadableLoader::cancel() |
319 { | 287 { |
320 DCHECK(!isMainThread()); | 288 DCHECK(!isMainThread()); |
321 cancelPeer(); | 289 if (m_peer) { |
| 290 m_workerLoaderProxy->postTaskToLoader(BLINK_FROM_HERE, createCrossThread
Task(&Peer::cancel, m_peer)); |
| 291 m_peer = nullptr; |
| 292 } |
322 | 293 |
323 if (m_clientWrapper->done()) | 294 if (!m_client) |
324 return; | 295 return; |
| 296 |
325 // If the client hasn't reached a termination state, then transition it | 297 // If the client hasn't reached a termination state, then transition it |
326 // by sending a cancellation error. | 298 // by sending a cancellation error. |
327 // Note: no more client callbacks will be done after this method -- the | 299 // Note: no more client callbacks will be done after this method -- the |
328 // clearClient() call ensures that. | 300 // clearClient() call ensures that. |
329 ResourceError error(String(), 0, String(), String()); | 301 ResourceError error(String(), 0, String(), String()); |
330 error.setIsCancellation(true); | 302 error.setIsCancellation(true); |
331 m_clientWrapper->didFail(error); | 303 didFail(error); |
332 m_clientWrapper->clearClient(); | 304 DCHECK(!m_client); |
333 } | 305 } |
334 | 306 |
335 void WorkerThreadableLoader::Bridge::destroy() | 307 void WorkerThreadableLoader::didStart(Peer* peer) |
336 { | |
337 DCHECK(!isMainThread()); | |
338 cancelPeer(); | |
339 m_clientWrapper->clearClient(); | |
340 } | |
341 | |
342 void WorkerThreadableLoader::Bridge::didStart(Peer* peer) | |
343 { | 308 { |
344 DCHECK(!isMainThread()); | 309 DCHECK(!isMainThread()); |
345 DCHECK(!m_peer); | 310 DCHECK(!m_peer); |
346 DCHECK(peer); | 311 DCHECK(peer); |
347 if (m_clientWrapper->done()) { | 312 if (!m_client) { |
348 // The thread is terminating. | 313 // The thread is terminating. |
349 m_loaderProxy->postTaskToLoader(BLINK_FROM_HERE, createCrossThreadTask(&
Peer::cancel, wrapCrossThreadPersistent(peer))); | 314 m_workerLoaderProxy->postTaskToLoader(BLINK_FROM_HERE, createCrossThread
Task(&Peer::cancel, wrapCrossThreadPersistent(peer))); |
350 return; | 315 return; |
351 } | 316 } |
352 | 317 |
353 m_peer = peer; | 318 m_peer = peer; |
354 } | 319 } |
355 | 320 |
356 DEFINE_TRACE(WorkerThreadableLoader::Bridge) | 321 void WorkerThreadableLoader::didSendData(unsigned long long bytesSent, unsigned
long long totalBytesToBeSent) |
357 { | 322 { |
358 visitor->trace(m_clientWrapper); | 323 DCHECK(!isMainThread()); |
| 324 if (!m_client) |
| 325 return; |
| 326 m_client->didSendData(bytesSent, totalBytesToBeSent); |
359 } | 327 } |
360 | 328 |
361 void WorkerThreadableLoader::Bridge::cancelPeer() | 329 void WorkerThreadableLoader::didReceiveResponse(unsigned long identifier, std::u
nique_ptr<CrossThreadResourceResponseData> responseData, std::unique_ptr<WebData
ConsumerHandle> handle) |
362 { | 330 { |
363 DCHECK(!isMainThread()); | 331 DCHECK(!isMainThread()); |
364 if (!m_peer) | 332 if (!m_client) |
365 return; | 333 return; |
366 m_loaderProxy->postTaskToLoader(BLINK_FROM_HERE, createCrossThreadTask(&Peer
::cancel, m_peer)); | 334 ResourceResponse response(responseData.get()); |
| 335 m_client->didReceiveResponse(identifier, response, std::move(handle)); |
| 336 } |
| 337 |
| 338 void WorkerThreadableLoader::didReceiveData(std::unique_ptr<Vector<char>> data) |
| 339 { |
| 340 DCHECK(!isMainThread()); |
| 341 CHECK_LE(data->size(), std::numeric_limits<unsigned>::max()); |
| 342 if (!m_client) |
| 343 return; |
| 344 m_client->didReceiveData(data->data(), data->size()); |
| 345 } |
| 346 |
| 347 void WorkerThreadableLoader::didReceiveCachedMetadata(std::unique_ptr<Vector<cha
r>> data) |
| 348 { |
| 349 DCHECK(!isMainThread()); |
| 350 if (!m_client) |
| 351 return; |
| 352 m_client->didReceiveCachedMetadata(data->data(), data->size()); |
| 353 } |
| 354 |
| 355 void WorkerThreadableLoader::didFinishLoading(unsigned long identifier, double f
inishTime) |
| 356 { |
| 357 DCHECK(!isMainThread()); |
| 358 if (!m_client) |
| 359 return; |
| 360 auto* client = m_client; |
| 361 m_client = nullptr; |
367 m_peer = nullptr; | 362 m_peer = nullptr; |
| 363 client->didFinishLoading(identifier, finishTime); |
| 364 } |
| 365 |
| 366 void WorkerThreadableLoader::didFail(const ResourceError& error) |
| 367 { |
| 368 DCHECK(!isMainThread()); |
| 369 if (!m_client) |
| 370 return; |
| 371 auto* client = m_client; |
| 372 m_client = nullptr; |
| 373 m_peer = nullptr; |
| 374 client->didFail(error); |
| 375 } |
| 376 |
| 377 void WorkerThreadableLoader::didFailAccessControlCheck(const ResourceError& erro
r) |
| 378 { |
| 379 DCHECK(!isMainThread()); |
| 380 if (!m_client) |
| 381 return; |
| 382 auto* client = m_client; |
| 383 m_client = nullptr; |
| 384 m_peer = nullptr; |
| 385 client->didFailAccessControlCheck(error); |
| 386 } |
| 387 |
| 388 void WorkerThreadableLoader::didFailRedirectCheck() |
| 389 { |
| 390 DCHECK(!isMainThread()); |
| 391 if (!m_client) |
| 392 return; |
| 393 auto* client = m_client; |
| 394 m_client = nullptr; |
| 395 m_peer = nullptr; |
| 396 client->didFailRedirectCheck(); |
| 397 } |
| 398 |
| 399 void WorkerThreadableLoader::didDownloadData(int dataLength) |
| 400 { |
| 401 DCHECK(!isMainThread()); |
| 402 if (!m_client) |
| 403 return; |
| 404 m_client->didDownloadData(dataLength); |
| 405 } |
| 406 |
| 407 void WorkerThreadableLoader::didReceiveResourceTiming(std::unique_ptr<CrossThrea
dResourceTimingInfoData> timingData) |
| 408 { |
| 409 DCHECK(!isMainThread()); |
| 410 if (!m_client) |
| 411 return; |
| 412 std::unique_ptr<ResourceTimingInfo> info(ResourceTimingInfo::adopt(std::move
(timingData))); |
| 413 WorkerGlobalScopePerformance::performance(*m_workerGlobalScope)->addResource
Timing(*info); |
| 414 m_client->didReceiveResourceTiming(*info); |
| 415 } |
| 416 |
| 417 DEFINE_TRACE(WorkerThreadableLoader) |
| 418 { |
| 419 visitor->trace(m_workerGlobalScope); |
| 420 ThreadableLoader::trace(visitor); |
368 } | 421 } |
369 | 422 |
370 void WorkerThreadableLoader::Peer::createAndStart( | 423 void WorkerThreadableLoader::Peer::createAndStart( |
371 Bridge* bridge, | 424 WorkerThreadableLoader* workerLoader, |
372 PassRefPtr<WorkerLoaderProxy> passLoaderProxy, | 425 PassRefPtr<WorkerLoaderProxy> passLoaderProxy, |
373 WorkerThreadLifecycleContext* workerThreadLifecycleContext, | 426 WorkerThreadLifecycleContext* workerThreadLifecycleContext, |
374 std::unique_ptr<CrossThreadResourceRequestData> request, | 427 std::unique_ptr<CrossThreadResourceRequestData> request, |
375 const ThreadableLoaderOptions& options, | 428 const ThreadableLoaderOptions& options, |
376 const ResourceLoaderOptions& resourceLoaderOptions, | 429 const ResourceLoaderOptions& resourceLoaderOptions, |
377 PassRefPtr<WaitableEventWithTasks> eventWithTasks, | 430 PassRefPtr<WaitableEventWithTasks> eventWithTasks, |
378 ExecutionContext* executionContext) | 431 ExecutionContext* executionContext) |
379 { | 432 { |
380 DCHECK(isMainThread()); | 433 DCHECK(isMainThread()); |
381 TaskForwarder* forwarder; | 434 TaskForwarder* forwarder; |
382 RefPtr<WorkerLoaderProxy> loaderProxy = passLoaderProxy; | 435 RefPtr<WorkerLoaderProxy> loaderProxy = passLoaderProxy; |
383 if (eventWithTasks) | 436 if (eventWithTasks) |
384 forwarder = new SyncTaskForwarder(eventWithTasks); | 437 forwarder = new SyncTaskForwarder(eventWithTasks); |
385 else | 438 else |
386 forwarder = new AsyncTaskForwarder(loaderProxy); | 439 forwarder = new AsyncTaskForwarder(loaderProxy); |
387 | 440 |
388 Peer* peer = new Peer(forwarder, workerThreadLifecycleContext); | 441 Peer* peer = new Peer(forwarder, workerThreadLifecycleContext); |
389 if (peer->wasContextDestroyedBeforeObserverCreation()) { | 442 if (peer->wasContextDestroyedBeforeObserverCreation()) { |
390 // The thread is already terminating. | 443 // The thread is already terminating. |
391 forwarder->abort(); | 444 forwarder->abort(); |
392 peer->m_forwarder = nullptr; | 445 peer->m_forwarder = nullptr; |
393 return; | 446 return; |
394 } | 447 } |
395 peer->m_clientWrapper = bridge->clientWrapper(); | 448 peer->m_workerLoader = workerLoader; |
396 peer->start(*toDocument(executionContext), std::move(request), options, reso
urceLoaderOptions); | 449 peer->start(*toDocument(executionContext), std::move(request), options, reso
urceLoaderOptions); |
397 forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&Bridge::didSt
art, wrapCrossThreadPersistent(bridge), wrapCrossThreadPersistent(peer))); | 450 forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThreada
bleLoader::didStart, wrapCrossThreadPersistent(workerLoader), wrapCrossThreadPer
sistent(peer))); |
398 } | 451 } |
399 | 452 |
400 WorkerThreadableLoader::Peer::~Peer() | 453 WorkerThreadableLoader::Peer::~Peer() |
401 { | 454 { |
402 DCHECK(isMainThread()); | 455 DCHECK(isMainThread()); |
403 DCHECK(!m_mainThreadLoader); | 456 DCHECK(!m_workerLoader); |
404 } | 457 } |
405 | 458 |
406 void WorkerThreadableLoader::Peer::overrideTimeout(unsigned long timeoutMillisec
onds) | 459 void WorkerThreadableLoader::Peer::overrideTimeout(unsigned long timeoutMillisec
onds) |
407 { | 460 { |
408 DCHECK(isMainThread()); | 461 DCHECK(isMainThread()); |
409 if (!m_mainThreadLoader) | 462 if (!m_mainThreadLoader) |
410 return; | 463 return; |
411 m_mainThreadLoader->overrideTimeout(timeoutMilliseconds); | 464 m_mainThreadLoader->overrideTimeout(timeoutMilliseconds); |
412 } | 465 } |
413 | 466 |
414 void WorkerThreadableLoader::Peer::cancel() | 467 void WorkerThreadableLoader::Peer::cancel() |
415 { | 468 { |
416 DCHECK(isMainThread()); | 469 DCHECK(isMainThread()); |
417 if (!m_mainThreadLoader) | 470 if (!m_mainThreadLoader) |
418 return; | 471 return; |
419 m_mainThreadLoader->cancel(); | 472 m_mainThreadLoader->cancel(); |
420 m_mainThreadLoader = nullptr; | 473 m_mainThreadLoader = nullptr; |
421 } | 474 } |
422 | 475 |
423 void WorkerThreadableLoader::Peer::didSendData(unsigned long long bytesSent, uns
igned long long totalBytesToBeSent) | 476 void WorkerThreadableLoader::Peer::didSendData(unsigned long long bytesSent, uns
igned long long totalBytesToBeSent) |
424 { | 477 { |
425 DCHECK(isMainThread()); | 478 DCHECK(isMainThread()); |
426 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien
tWrapper.get(); | 479 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
427 if (!clientWrapper || !m_forwarder) | 480 if (!workerLoader || !m_forwarder) |
428 return; | 481 return; |
429 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableL
oaderClientWrapper::didSendData, clientWrapper, bytesSent, totalBytesToBeSent)); | 482 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThrea
dableLoader::didSendData, workerLoader, bytesSent, totalBytesToBeSent)); |
430 } | 483 } |
431 | 484 |
432 void WorkerThreadableLoader::Peer::didReceiveResponse(unsigned long identifier,
const ResourceResponse& response, std::unique_ptr<WebDataConsumerHandle> handle) | 485 void WorkerThreadableLoader::Peer::didReceiveResponse(unsigned long identifier,
const ResourceResponse& response, std::unique_ptr<WebDataConsumerHandle> handle) |
433 { | 486 { |
434 DCHECK(isMainThread()); | 487 DCHECK(isMainThread()); |
435 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien
tWrapper.get(); | 488 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
436 if (!clientWrapper || !m_forwarder) | 489 if (!workerLoader || !m_forwarder) |
437 return; | 490 return; |
438 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableL
oaderClientWrapper::didReceiveResponse, clientWrapper, identifier, response, pas
sed(std::move(handle)))); | 491 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThrea
dableLoader::didReceiveResponse, workerLoader, identifier, response, passed(std:
:move(handle)))); |
439 } | 492 } |
440 | 493 |
441 void WorkerThreadableLoader::Peer::didReceiveData(const char* data, unsigned dat
aLength) | 494 void WorkerThreadableLoader::Peer::didReceiveData(const char* data, unsigned dat
aLength) |
442 { | 495 { |
443 DCHECK(isMainThread()); | 496 DCHECK(isMainThread()); |
444 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien
tWrapper.get(); | 497 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
445 if (!clientWrapper || !m_forwarder) | 498 if (!workerLoader || !m_forwarder) |
446 return; | 499 return; |
447 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableL
oaderClientWrapper::didReceiveData, clientWrapper, passed(createVectorFromMemory
Region(data, dataLength)))); | 500 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThrea
dableLoader::didReceiveData, workerLoader, passed(createVectorFromMemoryRegion(d
ata, dataLength)))); |
448 } | 501 } |
449 | 502 |
450 void WorkerThreadableLoader::Peer::didDownloadData(int dataLength) | 503 void WorkerThreadableLoader::Peer::didDownloadData(int dataLength) |
451 { | 504 { |
452 DCHECK(isMainThread()); | 505 DCHECK(isMainThread()); |
453 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien
tWrapper.get(); | 506 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
454 if (!clientWrapper || !m_forwarder) | 507 if (!workerLoader || !m_forwarder) |
455 return; | 508 return; |
456 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableL
oaderClientWrapper::didDownloadData, clientWrapper, dataLength)); | 509 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThrea
dableLoader::didDownloadData, workerLoader, dataLength)); |
457 } | 510 } |
458 | 511 |
459 void WorkerThreadableLoader::Peer::didReceiveCachedMetadata(const char* data, in
t dataLength) | 512 void WorkerThreadableLoader::Peer::didReceiveCachedMetadata(const char* data, in
t dataLength) |
460 { | 513 { |
461 DCHECK(isMainThread()); | 514 DCHECK(isMainThread()); |
462 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien
tWrapper.get(); | 515 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
463 if (!clientWrapper || !m_forwarder) | 516 if (!workerLoader || !m_forwarder) |
464 return; | 517 return; |
465 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableL
oaderClientWrapper::didReceiveCachedMetadata, clientWrapper, passed(createVector
FromMemoryRegion(data, dataLength)))); | 518 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThrea
dableLoader::didReceiveCachedMetadata, workerLoader, passed(createVectorFromMemo
ryRegion(data, dataLength)))); |
466 } | 519 } |
467 | 520 |
468 void WorkerThreadableLoader::Peer::didFinishLoading(unsigned long identifier, do
uble finishTime) | 521 void WorkerThreadableLoader::Peer::didFinishLoading(unsigned long identifier, do
uble finishTime) |
469 { | 522 { |
470 DCHECK(isMainThread()); | 523 DCHECK(isMainThread()); |
471 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien
tWrapper.get(); | 524 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
472 if (!clientWrapper || !m_forwarder) | 525 if (!workerLoader || !m_forwarder) |
473 return; | 526 return; |
474 m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTas
k(&ThreadableLoaderClientWrapper::didFinishLoading, clientWrapper, identifier, f
inishTime)); | 527 m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTas
k(&WorkerThreadableLoader::didFinishLoading, workerLoader, identifier, finishTim
e)); |
475 m_forwarder = nullptr; | 528 m_forwarder = nullptr; |
476 } | 529 } |
477 | 530 |
478 void WorkerThreadableLoader::Peer::didFail(const ResourceError& error) | 531 void WorkerThreadableLoader::Peer::didFail(const ResourceError& error) |
479 { | 532 { |
480 DCHECK(isMainThread()); | 533 DCHECK(isMainThread()); |
481 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien
tWrapper.get(); | 534 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
482 if (!clientWrapper || !m_forwarder) | 535 if (!workerLoader || !m_forwarder) |
483 return; | 536 return; |
484 m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTas
k(&ThreadableLoaderClientWrapper::didFail, clientWrapper, error)); | 537 m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTas
k(&WorkerThreadableLoader::didFail, workerLoader, error)); |
485 m_forwarder = nullptr; | 538 m_forwarder = nullptr; |
486 } | 539 } |
487 | 540 |
488 void WorkerThreadableLoader::Peer::didFailAccessControlCheck(const ResourceError
& error) | 541 void WorkerThreadableLoader::Peer::didFailAccessControlCheck(const ResourceError
& error) |
489 { | 542 { |
490 DCHECK(isMainThread()); | 543 DCHECK(isMainThread()); |
491 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien
tWrapper.get(); | 544 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
492 if (!clientWrapper || !m_forwarder) | 545 if (!workerLoader || !m_forwarder) |
493 return; | 546 return; |
494 m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTas
k(&ThreadableLoaderClientWrapper::didFailAccessControlCheck, clientWrapper, erro
r)); | 547 m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTas
k(&WorkerThreadableLoader::didFailAccessControlCheck, workerLoader, error)); |
495 m_forwarder = nullptr; | 548 m_forwarder = nullptr; |
496 } | 549 } |
497 | 550 |
498 void WorkerThreadableLoader::Peer::didFailRedirectCheck() | 551 void WorkerThreadableLoader::Peer::didFailRedirectCheck() |
499 { | 552 { |
500 DCHECK(isMainThread()); | 553 DCHECK(isMainThread()); |
501 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien
tWrapper.get(); | 554 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
502 if (!clientWrapper || !m_forwarder) | 555 if (!workerLoader || !m_forwarder) |
503 return; | 556 return; |
504 m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTas
k(&ThreadableLoaderClientWrapper::didFailRedirectCheck, clientWrapper)); | 557 m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTas
k(&WorkerThreadableLoader::didFailRedirectCheck, workerLoader)); |
505 m_forwarder = nullptr; | 558 m_forwarder = nullptr; |
506 } | 559 } |
507 | 560 |
508 void WorkerThreadableLoader::Peer::didReceiveResourceTiming(const ResourceTiming
Info& info) | 561 void WorkerThreadableLoader::Peer::didReceiveResourceTiming(const ResourceTiming
Info& info) |
509 { | 562 { |
510 DCHECK(isMainThread()); | 563 DCHECK(isMainThread()); |
511 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien
tWrapper.get(); | 564 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
512 if (!clientWrapper || !m_forwarder) | 565 if (!workerLoader || !m_forwarder) |
513 return; | 566 return; |
514 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableL
oaderClientWrapper::didReceiveResourceTiming, clientWrapper, info)); | 567 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThrea
dableLoader::didReceiveResourceTiming, workerLoader, info)); |
515 } | 568 } |
516 | 569 |
517 void WorkerThreadableLoader::Peer::contextDestroyed() | 570 void WorkerThreadableLoader::Peer::contextDestroyed() |
518 { | 571 { |
519 DCHECK(isMainThread()); | 572 DCHECK(isMainThread()); |
520 if (m_forwarder) { | 573 if (m_forwarder) { |
521 m_forwarder->abort(); | 574 m_forwarder->abort(); |
522 m_forwarder = nullptr; | 575 m_forwarder = nullptr; |
523 } | 576 } |
524 m_clientWrapper = nullptr; | 577 m_workerLoader = nullptr; |
525 cancel(); | 578 cancel(); |
526 } | 579 } |
527 | 580 |
528 DEFINE_TRACE(WorkerThreadableLoader::Peer) | 581 DEFINE_TRACE(WorkerThreadableLoader::Peer) |
529 { | 582 { |
530 visitor->trace(m_forwarder); | 583 visitor->trace(m_forwarder); |
| 584 visitor->trace(m_mainThreadLoader); |
531 WorkerThreadLifecycleObserver::trace(visitor); | 585 WorkerThreadLifecycleObserver::trace(visitor); |
532 } | 586 } |
533 | 587 |
534 WorkerThreadableLoader::Peer::Peer(TaskForwarder* forwarder, WorkerThreadLifecyc
leContext* context) | 588 WorkerThreadableLoader::Peer::Peer(TaskForwarder* forwarder, WorkerThreadLifecyc
leContext* context) |
535 : WorkerThreadLifecycleObserver(context) | 589 : WorkerThreadLifecycleObserver(context) |
536 , m_forwarder(forwarder) | 590 , m_forwarder(forwarder) |
537 { | 591 { |
538 DCHECK(isMainThread()); | 592 DCHECK(isMainThread()); |
539 } | 593 } |
540 | 594 |
541 void WorkerThreadableLoader::Peer::start( | 595 void WorkerThreadableLoader::Peer::start( |
542 Document& document, | 596 Document& document, |
543 std::unique_ptr<CrossThreadResourceRequestData> request, | 597 std::unique_ptr<CrossThreadResourceRequestData> request, |
544 const ThreadableLoaderOptions& options, | 598 const ThreadableLoaderOptions& options, |
545 const ResourceLoaderOptions& originalResourceLoaderOptions) | 599 const ResourceLoaderOptions& originalResourceLoaderOptions) |
546 { | 600 { |
547 DCHECK(isMainThread()); | 601 DCHECK(isMainThread()); |
548 ResourceLoaderOptions resourceLoaderOptions = originalResourceLoaderOptions; | 602 ResourceLoaderOptions resourceLoaderOptions = originalResourceLoaderOptions; |
549 resourceLoaderOptions.requestInitiatorContext = WorkerContext; | 603 resourceLoaderOptions.requestInitiatorContext = WorkerContext; |
550 m_mainThreadLoader = DocumentThreadableLoader::create(document, this, option
s, resourceLoaderOptions); | 604 m_mainThreadLoader = DocumentThreadableLoader::create(document, this, option
s, resourceLoaderOptions); |
551 m_mainThreadLoader->start(ResourceRequest(request.get())); | 605 m_mainThreadLoader->start(ResourceRequest(request.get())); |
552 } | 606 } |
553 | 607 |
554 } // namespace blink | 608 } // namespace blink |
OLD | NEW |