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 loading is already cancelled. | 313 // The loading is already cancelled. |
349 return; | 314 return; |
350 } | 315 } |
351 | 316 |
352 m_peer = peer; | 317 m_peer = peer; |
353 } | 318 } |
354 | 319 |
355 DEFINE_TRACE(WorkerThreadableLoader::Bridge) | 320 void WorkerThreadableLoader::didSendData(unsigned long long bytesSent, unsigned
long long totalBytesToBeSent) |
356 { | 321 { |
357 visitor->trace(m_clientWrapper); | 322 DCHECK(!isMainThread()); |
| 323 if (!m_client) |
| 324 return; |
| 325 m_client->didSendData(bytesSent, totalBytesToBeSent); |
358 } | 326 } |
359 | 327 |
360 void WorkerThreadableLoader::Bridge::cancelPeer() | 328 void WorkerThreadableLoader::didReceiveResponse(unsigned long identifier, std::u
nique_ptr<CrossThreadResourceResponseData> responseData, std::unique_ptr<WebData
ConsumerHandle> handle) |
361 { | 329 { |
362 DCHECK(!isMainThread()); | 330 DCHECK(!isMainThread()); |
363 if (!m_peer) | 331 if (!m_client) |
364 return; | 332 return; |
365 m_loaderProxy->postTaskToLoader(BLINK_FROM_HERE, createCrossThreadTask(&Peer
::cancel, m_peer)); | 333 ResourceResponse response(responseData.get()); |
| 334 m_client->didReceiveResponse(identifier, response, std::move(handle)); |
| 335 } |
| 336 |
| 337 void WorkerThreadableLoader::didReceiveData(std::unique_ptr<Vector<char>> data) |
| 338 { |
| 339 DCHECK(!isMainThread()); |
| 340 CHECK_LE(data->size(), std::numeric_limits<unsigned>::max()); |
| 341 if (!m_client) |
| 342 return; |
| 343 m_client->didReceiveData(data->data(), data->size()); |
| 344 } |
| 345 |
| 346 void WorkerThreadableLoader::didReceiveCachedMetadata(std::unique_ptr<Vector<cha
r>> data) |
| 347 { |
| 348 DCHECK(!isMainThread()); |
| 349 if (!m_client) |
| 350 return; |
| 351 m_client->didReceiveCachedMetadata(data->data(), data->size()); |
| 352 } |
| 353 |
| 354 void WorkerThreadableLoader::didFinishLoading(unsigned long identifier, double f
inishTime) |
| 355 { |
| 356 DCHECK(!isMainThread()); |
| 357 if (!m_client) |
| 358 return; |
| 359 auto* client = m_client; |
| 360 m_client = nullptr; |
366 m_peer = nullptr; | 361 m_peer = nullptr; |
| 362 client->didFinishLoading(identifier, finishTime); |
| 363 } |
| 364 |
| 365 void WorkerThreadableLoader::didFail(const ResourceError& error) |
| 366 { |
| 367 DCHECK(!isMainThread()); |
| 368 if (!m_client) |
| 369 return; |
| 370 auto* client = m_client; |
| 371 m_client = nullptr; |
| 372 m_peer = nullptr; |
| 373 client->didFail(error); |
| 374 } |
| 375 |
| 376 void WorkerThreadableLoader::didFailAccessControlCheck(const ResourceError& erro
r) |
| 377 { |
| 378 DCHECK(!isMainThread()); |
| 379 if (!m_client) |
| 380 return; |
| 381 auto* client = m_client; |
| 382 m_client = nullptr; |
| 383 m_peer = nullptr; |
| 384 client->didFailAccessControlCheck(error); |
| 385 } |
| 386 |
| 387 void WorkerThreadableLoader::didFailRedirectCheck() |
| 388 { |
| 389 DCHECK(!isMainThread()); |
| 390 if (!m_client) |
| 391 return; |
| 392 auto* client = m_client; |
| 393 m_client = nullptr; |
| 394 m_peer = nullptr; |
| 395 client->didFailRedirectCheck(); |
| 396 } |
| 397 |
| 398 void WorkerThreadableLoader::didDownloadData(int dataLength) |
| 399 { |
| 400 DCHECK(!isMainThread()); |
| 401 if (!m_client) |
| 402 return; |
| 403 m_client->didDownloadData(dataLength); |
| 404 } |
| 405 |
| 406 void WorkerThreadableLoader::didReceiveResourceTiming(std::unique_ptr<CrossThrea
dResourceTimingInfoData> timingData) |
| 407 { |
| 408 DCHECK(!isMainThread()); |
| 409 if (!m_client) |
| 410 return; |
| 411 std::unique_ptr<ResourceTimingInfo> info(ResourceTimingInfo::adopt(std::move
(timingData))); |
| 412 WorkerGlobalScopePerformance::performance(*m_workerGlobalScope)->addResource
Timing(*info); |
| 413 m_client->didReceiveResourceTiming(*info); |
| 414 } |
| 415 |
| 416 DEFINE_TRACE(WorkerThreadableLoader) |
| 417 { |
| 418 visitor->trace(m_workerGlobalScope); |
| 419 ThreadableLoader::trace(visitor); |
367 } | 420 } |
368 | 421 |
369 void WorkerThreadableLoader::Peer::createAndStart( | 422 void WorkerThreadableLoader::Peer::createAndStart( |
370 Bridge* bridge, | 423 WorkerThreadableLoader* workerLoader, |
371 PassRefPtr<WorkerLoaderProxy> passLoaderProxy, | 424 PassRefPtr<WorkerLoaderProxy> passLoaderProxy, |
372 WorkerThreadLifecycleContext* workerThreadLifecycleContext, | 425 WorkerThreadLifecycleContext* workerThreadLifecycleContext, |
373 std::unique_ptr<CrossThreadResourceRequestData> request, | 426 std::unique_ptr<CrossThreadResourceRequestData> request, |
374 const ThreadableLoaderOptions& options, | 427 const ThreadableLoaderOptions& options, |
375 const ResourceLoaderOptions& resourceLoaderOptions, | 428 const ResourceLoaderOptions& resourceLoaderOptions, |
376 PassRefPtr<WaitableEventWithTasks> eventWithTasks, | 429 PassRefPtr<WaitableEventWithTasks> eventWithTasks, |
377 ExecutionContext* executionContext) | 430 ExecutionContext* executionContext) |
378 { | 431 { |
379 DCHECK(isMainThread()); | 432 DCHECK(isMainThread()); |
380 TaskForwarder* forwarder; | 433 TaskForwarder* forwarder; |
381 RefPtr<WorkerLoaderProxy> loaderProxy = passLoaderProxy; | 434 RefPtr<WorkerLoaderProxy> loaderProxy = passLoaderProxy; |
382 if (eventWithTasks) | 435 if (eventWithTasks) |
383 forwarder = new SyncTaskForwarder(eventWithTasks); | 436 forwarder = new SyncTaskForwarder(eventWithTasks); |
384 else | 437 else |
385 forwarder = new AsyncTaskForwarder(loaderProxy); | 438 forwarder = new AsyncTaskForwarder(loaderProxy); |
386 | 439 |
387 Peer* peer = new Peer(forwarder, workerThreadLifecycleContext); | 440 Peer* peer = new Peer(forwarder, workerThreadLifecycleContext); |
388 if (peer->wasContextDestroyedBeforeObserverCreation()) { | 441 if (peer->wasContextDestroyedBeforeObserverCreation()) { |
389 // The thread is already terminating. | 442 // The thread is already terminating. |
390 forwarder->abort(); | 443 forwarder->abort(); |
391 peer->m_forwarder = nullptr; | 444 peer->m_forwarder = nullptr; |
392 return; | 445 return; |
393 } | 446 } |
394 peer->m_clientWrapper = bridge->clientWrapper(); | 447 peer->m_workerLoader = workerLoader; |
395 peer->start(*toDocument(executionContext), std::move(request), options, reso
urceLoaderOptions); | 448 peer->start(*toDocument(executionContext), std::move(request), options, reso
urceLoaderOptions); |
396 forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&Bridge::didSt
art, wrapCrossThreadPersistent(bridge), wrapCrossThreadPersistent(peer))); | 449 forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThreada
bleLoader::didStart, wrapCrossThreadPersistent(workerLoader), wrapCrossThreadPer
sistent(peer))); |
397 } | 450 } |
398 | 451 |
399 WorkerThreadableLoader::Peer::~Peer() | 452 WorkerThreadableLoader::Peer::~Peer() |
400 { | 453 { |
401 DCHECK(isMainThread()); | 454 DCHECK(isMainThread()); |
402 DCHECK(!m_mainThreadLoader); | 455 DCHECK(!m_workerLoader); |
403 } | 456 } |
404 | 457 |
405 void WorkerThreadableLoader::Peer::overrideTimeout(unsigned long timeoutMillisec
onds) | 458 void WorkerThreadableLoader::Peer::overrideTimeout(unsigned long timeoutMillisec
onds) |
406 { | 459 { |
407 DCHECK(isMainThread()); | 460 DCHECK(isMainThread()); |
408 if (!m_mainThreadLoader) | 461 if (!m_mainThreadLoader) |
409 return; | 462 return; |
410 m_mainThreadLoader->overrideTimeout(timeoutMilliseconds); | 463 m_mainThreadLoader->overrideTimeout(timeoutMilliseconds); |
411 } | 464 } |
412 | 465 |
413 void WorkerThreadableLoader::Peer::cancel() | 466 void WorkerThreadableLoader::Peer::cancel() |
414 { | 467 { |
415 DCHECK(isMainThread()); | 468 DCHECK(isMainThread()); |
416 if (!m_mainThreadLoader) | 469 if (!m_mainThreadLoader) |
417 return; | 470 return; |
418 m_mainThreadLoader->cancel(); | 471 m_mainThreadLoader->cancel(); |
419 m_mainThreadLoader = nullptr; | 472 m_mainThreadLoader = nullptr; |
420 } | 473 } |
421 | 474 |
422 void WorkerThreadableLoader::Peer::didSendData(unsigned long long bytesSent, uns
igned long long totalBytesToBeSent) | 475 void WorkerThreadableLoader::Peer::didSendData(unsigned long long bytesSent, uns
igned long long totalBytesToBeSent) |
423 { | 476 { |
424 DCHECK(isMainThread()); | 477 DCHECK(isMainThread()); |
425 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien
tWrapper.get(); | 478 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
426 if (!clientWrapper || !m_forwarder) | 479 if (!workerLoader || !m_forwarder) |
427 return; | 480 return; |
428 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableL
oaderClientWrapper::didSendData, clientWrapper, bytesSent, totalBytesToBeSent)); | 481 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThrea
dableLoader::didSendData, workerLoader, bytesSent, totalBytesToBeSent)); |
429 } | 482 } |
430 | 483 |
431 void WorkerThreadableLoader::Peer::didReceiveResponse(unsigned long identifier,
const ResourceResponse& response, std::unique_ptr<WebDataConsumerHandle> handle) | 484 void WorkerThreadableLoader::Peer::didReceiveResponse(unsigned long identifier,
const ResourceResponse& response, std::unique_ptr<WebDataConsumerHandle> handle) |
432 { | 485 { |
433 DCHECK(isMainThread()); | 486 DCHECK(isMainThread()); |
434 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien
tWrapper.get(); | 487 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
435 if (!clientWrapper || !m_forwarder) | 488 if (!workerLoader || !m_forwarder) |
436 return; | 489 return; |
437 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableL
oaderClientWrapper::didReceiveResponse, clientWrapper, identifier, response, pas
sed(std::move(handle)))); | 490 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThrea
dableLoader::didReceiveResponse, workerLoader, identifier, response, passed(std:
:move(handle)))); |
438 } | 491 } |
439 | 492 |
440 void WorkerThreadableLoader::Peer::didReceiveData(const char* data, unsigned dat
aLength) | 493 void WorkerThreadableLoader::Peer::didReceiveData(const char* data, unsigned dat
aLength) |
441 { | 494 { |
442 DCHECK(isMainThread()); | 495 DCHECK(isMainThread()); |
443 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien
tWrapper.get(); | 496 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
444 if (!clientWrapper || !m_forwarder) | 497 if (!workerLoader || !m_forwarder) |
445 return; | 498 return; |
446 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableL
oaderClientWrapper::didReceiveData, clientWrapper, passed(createVectorFromMemory
Region(data, dataLength)))); | 499 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThrea
dableLoader::didReceiveData, workerLoader, passed(createVectorFromMemoryRegion(d
ata, dataLength)))); |
447 } | 500 } |
448 | 501 |
449 void WorkerThreadableLoader::Peer::didDownloadData(int dataLength) | 502 void WorkerThreadableLoader::Peer::didDownloadData(int dataLength) |
450 { | 503 { |
451 DCHECK(isMainThread()); | 504 DCHECK(isMainThread()); |
452 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien
tWrapper.get(); | 505 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
453 if (!clientWrapper || !m_forwarder) | 506 if (!workerLoader || !m_forwarder) |
454 return; | 507 return; |
455 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableL
oaderClientWrapper::didDownloadData, clientWrapper, dataLength)); | 508 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThrea
dableLoader::didDownloadData, workerLoader, dataLength)); |
456 } | 509 } |
457 | 510 |
458 void WorkerThreadableLoader::Peer::didReceiveCachedMetadata(const char* data, in
t dataLength) | 511 void WorkerThreadableLoader::Peer::didReceiveCachedMetadata(const char* data, in
t dataLength) |
459 { | 512 { |
460 DCHECK(isMainThread()); | 513 DCHECK(isMainThread()); |
461 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien
tWrapper.get(); | 514 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
462 if (!clientWrapper || !m_forwarder) | 515 if (!workerLoader || !m_forwarder) |
463 return; | 516 return; |
464 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableL
oaderClientWrapper::didReceiveCachedMetadata, clientWrapper, passed(createVector
FromMemoryRegion(data, dataLength)))); | 517 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThrea
dableLoader::didReceiveCachedMetadata, workerLoader, passed(createVectorFromMemo
ryRegion(data, dataLength)))); |
465 } | 518 } |
466 | 519 |
467 void WorkerThreadableLoader::Peer::didFinishLoading(unsigned long identifier, do
uble finishTime) | 520 void WorkerThreadableLoader::Peer::didFinishLoading(unsigned long identifier, do
uble finishTime) |
468 { | 521 { |
469 DCHECK(isMainThread()); | 522 DCHECK(isMainThread()); |
470 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien
tWrapper.get(); | 523 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
471 if (!clientWrapper || !m_forwarder) | 524 if (!workerLoader || !m_forwarder) |
472 return; | 525 return; |
473 m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTas
k(&ThreadableLoaderClientWrapper::didFinishLoading, clientWrapper, identifier, f
inishTime)); | 526 m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTas
k(&WorkerThreadableLoader::didFinishLoading, workerLoader, identifier, finishTim
e)); |
474 m_forwarder = nullptr; | 527 m_forwarder = nullptr; |
475 } | 528 } |
476 | 529 |
477 void WorkerThreadableLoader::Peer::didFail(const ResourceError& error) | 530 void WorkerThreadableLoader::Peer::didFail(const ResourceError& error) |
478 { | 531 { |
479 DCHECK(isMainThread()); | 532 DCHECK(isMainThread()); |
480 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien
tWrapper.get(); | 533 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
481 if (!clientWrapper || !m_forwarder) | 534 if (!workerLoader || !m_forwarder) |
482 return; | 535 return; |
483 m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTas
k(&ThreadableLoaderClientWrapper::didFail, clientWrapper, error)); | 536 m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTas
k(&WorkerThreadableLoader::didFail, workerLoader, error)); |
484 m_forwarder = nullptr; | 537 m_forwarder = nullptr; |
485 } | 538 } |
486 | 539 |
487 void WorkerThreadableLoader::Peer::didFailAccessControlCheck(const ResourceError
& error) | 540 void WorkerThreadableLoader::Peer::didFailAccessControlCheck(const ResourceError
& error) |
488 { | 541 { |
489 DCHECK(isMainThread()); | 542 DCHECK(isMainThread()); |
490 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien
tWrapper.get(); | 543 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
491 if (!clientWrapper || !m_forwarder) | 544 if (!workerLoader || !m_forwarder) |
492 return; | 545 return; |
493 m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTas
k(&ThreadableLoaderClientWrapper::didFailAccessControlCheck, clientWrapper, erro
r)); | 546 m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTas
k(&WorkerThreadableLoader::didFailAccessControlCheck, workerLoader, error)); |
494 m_forwarder = nullptr; | 547 m_forwarder = nullptr; |
495 } | 548 } |
496 | 549 |
497 void WorkerThreadableLoader::Peer::didFailRedirectCheck() | 550 void WorkerThreadableLoader::Peer::didFailRedirectCheck() |
498 { | 551 { |
499 DCHECK(isMainThread()); | 552 DCHECK(isMainThread()); |
500 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien
tWrapper.get(); | 553 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
501 if (!clientWrapper || !m_forwarder) | 554 if (!workerLoader || !m_forwarder) |
502 return; | 555 return; |
503 m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTas
k(&ThreadableLoaderClientWrapper::didFailRedirectCheck, clientWrapper)); | 556 m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTas
k(&WorkerThreadableLoader::didFailRedirectCheck, workerLoader)); |
504 m_forwarder = nullptr; | 557 m_forwarder = nullptr; |
505 } | 558 } |
506 | 559 |
507 void WorkerThreadableLoader::Peer::didReceiveResourceTiming(const ResourceTiming
Info& info) | 560 void WorkerThreadableLoader::Peer::didReceiveResourceTiming(const ResourceTiming
Info& info) |
508 { | 561 { |
509 DCHECK(isMainThread()); | 562 DCHECK(isMainThread()); |
510 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien
tWrapper.get(); | 563 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
511 if (!clientWrapper || !m_forwarder) | 564 if (!workerLoader || !m_forwarder) |
512 return; | 565 return; |
513 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableL
oaderClientWrapper::didReceiveResourceTiming, clientWrapper, info)); | 566 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThrea
dableLoader::didReceiveResourceTiming, workerLoader, info)); |
514 } | 567 } |
515 | 568 |
516 void WorkerThreadableLoader::Peer::contextDestroyed() | 569 void WorkerThreadableLoader::Peer::contextDestroyed() |
517 { | 570 { |
518 DCHECK(isMainThread()); | 571 DCHECK(isMainThread()); |
519 if (m_forwarder) { | 572 if (m_forwarder) { |
520 m_forwarder->abort(); | 573 m_forwarder->abort(); |
521 m_forwarder = nullptr; | 574 m_forwarder = nullptr; |
522 } | 575 } |
523 m_clientWrapper = nullptr; | 576 m_workerLoader = nullptr; |
524 cancel(); | 577 cancel(); |
525 } | 578 } |
526 | 579 |
527 DEFINE_TRACE(WorkerThreadableLoader::Peer) | 580 DEFINE_TRACE(WorkerThreadableLoader::Peer) |
528 { | 581 { |
529 visitor->trace(m_forwarder); | 582 visitor->trace(m_forwarder); |
| 583 visitor->trace(m_mainThreadLoader); |
530 WorkerThreadLifecycleObserver::trace(visitor); | 584 WorkerThreadLifecycleObserver::trace(visitor); |
531 } | 585 } |
532 | 586 |
533 WorkerThreadableLoader::Peer::Peer(TaskForwarder* forwarder, WorkerThreadLifecyc
leContext* context) | 587 WorkerThreadableLoader::Peer::Peer(TaskForwarder* forwarder, WorkerThreadLifecyc
leContext* context) |
534 : WorkerThreadLifecycleObserver(context) | 588 : WorkerThreadLifecycleObserver(context) |
535 , m_forwarder(forwarder) | 589 , m_forwarder(forwarder) |
536 { | 590 { |
537 DCHECK(isMainThread()); | 591 DCHECK(isMainThread()); |
538 } | 592 } |
539 | 593 |
540 void WorkerThreadableLoader::Peer::start( | 594 void WorkerThreadableLoader::Peer::start( |
541 Document& document, | 595 Document& document, |
542 std::unique_ptr<CrossThreadResourceRequestData> request, | 596 std::unique_ptr<CrossThreadResourceRequestData> request, |
543 const ThreadableLoaderOptions& options, | 597 const ThreadableLoaderOptions& options, |
544 const ResourceLoaderOptions& originalResourceLoaderOptions) | 598 const ResourceLoaderOptions& originalResourceLoaderOptions) |
545 { | 599 { |
546 DCHECK(isMainThread()); | 600 DCHECK(isMainThread()); |
547 ResourceLoaderOptions resourceLoaderOptions = originalResourceLoaderOptions; | 601 ResourceLoaderOptions resourceLoaderOptions = originalResourceLoaderOptions; |
548 resourceLoaderOptions.requestInitiatorContext = WorkerContext; | 602 resourceLoaderOptions.requestInitiatorContext = WorkerContext; |
549 m_mainThreadLoader = DocumentThreadableLoader::create(document, this, option
s, resourceLoaderOptions); | 603 m_mainThreadLoader = DocumentThreadableLoader::create(document, this, option
s, resourceLoaderOptions); |
550 m_mainThreadLoader->start(ResourceRequest(request.get())); | 604 m_mainThreadLoader->start(ResourceRequest(request.get())); |
551 } | 605 } |
552 | 606 |
553 } // namespace blink | 607 } // namespace blink |
OLD | NEW |