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 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
184 RefPtr<WaitableEventWithTasks> m_eventWithTasks; | 184 RefPtr<WaitableEventWithTasks> m_eventWithTasks; |
185 }; | 185 }; |
186 | 186 |
187 WorkerThreadableLoader::WorkerThreadableLoader( | 187 WorkerThreadableLoader::WorkerThreadableLoader( |
188 WorkerGlobalScope& workerGlobalScope, | 188 WorkerGlobalScope& workerGlobalScope, |
189 ThreadableLoaderClient* client, | 189 ThreadableLoaderClient* client, |
190 const ThreadableLoaderOptions& options, | 190 const ThreadableLoaderOptions& options, |
191 const ResourceLoaderOptions& resourceLoaderOptions, | 191 const ResourceLoaderOptions& resourceLoaderOptions, |
192 BlockingBehavior blockingBehavior) | 192 BlockingBehavior blockingBehavior) |
193 : m_workerGlobalScope(&workerGlobalScope) | 193 : m_workerGlobalScope(&workerGlobalScope) |
194 , m_workerClientWrapper(new ThreadableLoaderClientWrapper(workerGlobalScope, client)) | 194 , m_workerLoaderProxy(workerGlobalScope.thread()->workerLoaderProxy()) |
195 , m_bridge(new Bridge(m_workerClientWrapper, workerGlobalScope.thread()->wor kerLoaderProxy(), options, resourceLoaderOptions, blockingBehavior)) | 195 , m_client(client) |
196 , m_threadableLoaderOptions(options) | |
197 , m_resourceLoaderOptions(resourceLoaderOptions) | |
198 , m_blockingBehavior(blockingBehavior) | |
196 { | 199 { |
200 DCHECK(client); | |
197 } | 201 } |
198 | 202 |
199 void WorkerThreadableLoader::loadResourceSynchronously(WorkerGlobalScope& worker GlobalScope, const ResourceRequest& request, ThreadableLoaderClient& client, con st ThreadableLoaderOptions& options, const ResourceLoaderOptions& resourceLoader Options) | 203 void WorkerThreadableLoader::loadResourceSynchronously(WorkerGlobalScope& worker GlobalScope, const ResourceRequest& request, ThreadableLoaderClient& client, con st ThreadableLoaderOptions& options, const ResourceLoaderOptions& resourceLoader Options) |
200 { | 204 { |
201 std::unique_ptr<WorkerThreadableLoader> loader = wrapUnique(new WorkerThread ableLoader(workerGlobalScope, &client, options, resourceLoaderOptions, LoadSynch ronously)); | 205 (new WorkerThreadableLoader(workerGlobalScope, &client, options, resourceLoa derOptions, LoadSynchronously))->start(request); |
202 loader->start(request); | |
203 } | 206 } |
204 | 207 |
205 WorkerThreadableLoader::~WorkerThreadableLoader() | 208 WorkerThreadableLoader::~WorkerThreadableLoader() |
206 { | 209 { |
207 DCHECK(m_workerClientWrapper->done()); | 210 DCHECK(!m_peer); |
208 m_bridge->destroy(); | 211 DCHECK(!m_client); |
209 } | 212 } |
210 | 213 |
211 void WorkerThreadableLoader::start(const ResourceRequest& request) | 214 void WorkerThreadableLoader::start(const ResourceRequest& originalRequest) |
212 { | 215 { |
213 ResourceRequest requestToPass(request); | 216 ResourceRequest request(originalRequest); |
214 if (!requestToPass.didSetHTTPReferrer()) | 217 if (!request.didSetHTTPReferrer()) |
215 requestToPass.setHTTPReferrer(SecurityPolicy::generateReferrer(m_workerG lobalScope->getReferrerPolicy(), request.url(), m_workerGlobalScope->outgoingRef errer())); | 218 request.setHTTPReferrer(SecurityPolicy::generateReferrer(m_workerGlobalS cope->getReferrerPolicy(), request.url(), m_workerGlobalScope->outgoingReferrer( ))); |
216 m_bridge->start(requestToPass, *m_workerGlobalScope); | |
217 } | |
218 | 219 |
219 void WorkerThreadableLoader::overrideTimeout(unsigned long timeoutMilliseconds) | |
220 { | |
221 m_bridge->overrideTimeout(timeoutMilliseconds); | |
222 } | |
223 | |
224 void WorkerThreadableLoader::cancel() | |
225 { | |
226 m_bridge->cancel(); | |
227 } | |
228 | |
229 WorkerThreadableLoader::Bridge::Bridge( | |
230 ThreadableLoaderClientWrapper* clientWrapper, | |
231 PassRefPtr<WorkerLoaderProxy> loaderProxy, | |
232 const ThreadableLoaderOptions& threadableLoaderOptions, | |
233 const ResourceLoaderOptions& resourceLoaderOptions, | |
234 BlockingBehavior blockingBehavior) | |
235 : m_clientWrapper(clientWrapper) | |
236 , m_loaderProxy(loaderProxy) | |
237 , m_threadableLoaderOptions(threadableLoaderOptions) | |
238 , m_resourceLoaderOptions(resourceLoaderOptions) | |
239 , m_blockingBehavior(blockingBehavior) | |
240 { | |
241 DCHECK(!isMainThread()); | |
242 } | |
243 | |
244 WorkerThreadableLoader::Bridge::~Bridge() | |
245 { | |
246 DCHECK(!isMainThread()); | |
247 DCHECK(!m_peer); | |
248 } | |
249 | |
250 void WorkerThreadableLoader::Bridge::start(const ResourceRequest& request, const WorkerGlobalScope& workerGlobalScope) | |
251 { | |
252 DCHECK(!isMainThread()); | 220 DCHECK(!isMainThread()); |
253 RefPtr<WaitableEventWithTasks> eventWithTasks; | 221 RefPtr<WaitableEventWithTasks> eventWithTasks; |
254 if (m_blockingBehavior == LoadSynchronously) | 222 if (m_blockingBehavior == LoadSynchronously) |
255 eventWithTasks = WaitableEventWithTasks::create(); | 223 eventWithTasks = WaitableEventWithTasks::create(); |
256 | 224 |
257 m_loaderProxy->postTaskToLoader(createCrossThreadTask( | 225 m_workerLoaderProxy->postTaskToLoader(createCrossThreadTask( |
258 &Peer::createAndStart, | 226 &Peer::createAndStart, |
259 wrapCrossThreadPersistent(this), | 227 wrapCrossThreadPersistent(this), |
260 m_loaderProxy, | 228 m_workerLoaderProxy, |
261 wrapCrossThreadPersistent(workerGlobalScope.thread()->getWorkerThreadLif ecycleContext()), | 229 wrapCrossThreadPersistent(m_workerGlobalScope->thread()->getWorkerThread LifecycleContext()), |
262 request, | 230 request, |
263 m_threadableLoaderOptions, | 231 m_threadableLoaderOptions, |
264 m_resourceLoaderOptions, | 232 m_resourceLoaderOptions, |
265 eventWithTasks)); | 233 eventWithTasks)); |
266 | 234 |
267 if (m_blockingBehavior == LoadAsynchronously) | 235 if (m_blockingBehavior == LoadAsynchronously) |
268 return; | 236 return; |
269 | 237 |
270 { | 238 { |
271 SafePointScope scope(BlinkGC::HeapPointersOnStack); | 239 SafePointScope scope(BlinkGC::HeapPointersOnStack); |
272 eventWithTasks->wait(); | 240 eventWithTasks->wait(); |
273 } | 241 } |
274 | 242 |
275 if (eventWithTasks->isAborted()) { | 243 if (eventWithTasks->isAborted()) { |
276 // This thread is going to terminate. | 244 // This thread is going to terminate. |
277 cancel(); | 245 cancel(); |
278 return; | 246 return; |
279 } | 247 } |
280 | 248 |
281 for (const auto& task : eventWithTasks->take()) { | 249 for (const auto& task : eventWithTasks->take()) { |
282 // m_clientTask contains only CallClosureTasks. So, it's ok to pass | 250 // m_clientTask contains only CallClosureTasks. So, it's ok to pass |
283 // the nullptr. | 251 // the nullptr. |
284 task->performTask(nullptr); | 252 task->performTask(nullptr); |
285 } | 253 } |
286 } | 254 } |
287 | 255 |
288 void WorkerThreadableLoader::Bridge::overrideTimeout(unsigned long timeoutMillis econds) | 256 void WorkerThreadableLoader::overrideTimeout(unsigned long timeoutMilliseconds) |
289 { | 257 { |
290 DCHECK(!isMainThread()); | 258 DCHECK(!isMainThread()); |
291 if (!m_peer) | 259 if (!m_peer) |
292 return; | 260 return; |
293 m_loaderProxy->postTaskToLoader(createCrossThreadTask(&Peer::overrideTimeout , m_peer, timeoutMilliseconds)); | 261 m_workerLoaderProxy->postTaskToLoader(createCrossThreadTask(&Peer::overrideT imeout, m_peer, timeoutMilliseconds)); |
294 } | 262 } |
295 | 263 |
296 void WorkerThreadableLoader::Bridge::cancel() | 264 void WorkerThreadableLoader::cancel() |
297 { | 265 { |
298 DCHECK(!isMainThread()); | 266 DCHECK(!isMainThread()); |
299 cancelPeer(); | 267 if (m_peer) { |
268 m_workerLoaderProxy->postTaskToLoader(createCrossThreadTask(&Peer::cance l, m_peer)); | |
269 m_peer = nullptr; | |
270 } | |
300 | 271 |
301 if (m_clientWrapper->done()) | 272 if (!m_client) |
302 return; | 273 return; |
274 | |
303 // If the client hasn't reached a termination state, then transition it | 275 // If the client hasn't reached a termination state, then transition it |
304 // by sending a cancellation error. | 276 // by sending a cancellation error. |
305 // Note: no more client callbacks will be done after this method -- the | 277 // Note: no more client callbacks will be done after this method -- the |
306 // clearClient() call ensures that. | 278 // clearClient() call ensures that. |
307 ResourceError error(String(), 0, String(), String()); | 279 ResourceError error(String(), 0, String(), String()); |
308 error.setIsCancellation(true); | 280 error.setIsCancellation(true); |
309 m_clientWrapper->didFail(error); | 281 didFail(error); |
310 m_clientWrapper->clearClient(); | 282 DCHECK(!m_client); |
311 } | 283 } |
312 | 284 |
313 void WorkerThreadableLoader::Bridge::destroy() | 285 void WorkerThreadableLoader::didStart(Peer* peer) |
314 { | |
315 DCHECK(!isMainThread()); | |
316 cancelPeer(); | |
317 m_clientWrapper->clearClient(); | |
318 } | |
319 | |
320 void WorkerThreadableLoader::Bridge::didStart(Peer* peer) | |
321 { | 286 { |
322 DCHECK(!isMainThread()); | 287 DCHECK(!isMainThread()); |
323 DCHECK(!m_peer); | 288 DCHECK(!m_peer); |
324 DCHECK(peer); | 289 DCHECK(peer); |
325 if (m_clientWrapper->done()) { | 290 if (!m_client) { |
326 // The loading is already cancelled. | 291 // The loading is already cancelled. |
327 return; | 292 return; |
328 } | 293 } |
329 | 294 |
330 m_peer = peer; | 295 m_peer = peer; |
331 } | 296 } |
332 | 297 |
333 DEFINE_TRACE(WorkerThreadableLoader::Bridge) | 298 void WorkerThreadableLoader::didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent) |
334 { | 299 { |
335 visitor->trace(m_clientWrapper); | 300 DCHECK(!isMainThread()); |
301 if (!m_client) | |
302 return; | |
303 m_client->didSendData(bytesSent, totalBytesToBeSent); | |
336 } | 304 } |
337 | 305 |
338 void WorkerThreadableLoader::Bridge::cancelPeer() | 306 void WorkerThreadableLoader::didReceiveResponse(unsigned long identifier, std::u nique_ptr<CrossThreadResourceResponseData> responseData, std::unique_ptr<WebData ConsumerHandle> handle) |
339 { | 307 { |
340 DCHECK(!isMainThread()); | 308 DCHECK(!isMainThread()); |
341 if (!m_peer) | 309 if (!m_client) |
342 return; | 310 return; |
343 m_loaderProxy->postTaskToLoader(createCrossThreadTask(&Peer::cancel, m_peer) ); | 311 ResourceResponse response(responseData.get()); |
312 m_client->didReceiveResponse(identifier, response, std::move(handle)); | |
313 } | |
314 | |
315 void WorkerThreadableLoader::didReceiveData(std::unique_ptr<Vector<char>> data) | |
316 { | |
317 DCHECK(!isMainThread()); | |
318 CHECK_LE(data->size(), std::numeric_limits<unsigned>::max()); | |
319 if (!m_client) | |
320 return; | |
321 m_client->didReceiveData(data->data(), data->size()); | |
322 } | |
323 | |
324 void WorkerThreadableLoader::didReceiveCachedMetadata(std::unique_ptr<Vector<cha r>> data) | |
325 { | |
326 DCHECK(!isMainThread()); | |
327 if (!m_client) | |
328 return; | |
329 m_client->didReceiveCachedMetadata(data->data(), data->size()); | |
330 } | |
331 | |
332 void WorkerThreadableLoader::didFinishLoading(unsigned long identifier, double f inishTime) | |
333 { | |
334 DCHECK(!isMainThread()); | |
335 if (!m_client) | |
336 return; | |
337 auto* client = m_client; | |
338 m_client = nullptr; | |
344 m_peer = nullptr; | 339 m_peer = nullptr; |
340 client->didFinishLoading(identifier, finishTime); | |
341 } | |
342 | |
343 void WorkerThreadableLoader::didFail(const ResourceError& error) | |
344 { | |
345 DCHECK(!isMainThread()); | |
346 if (!m_client) | |
347 return; | |
348 auto* client = m_client; | |
349 m_client = nullptr; | |
350 m_peer = nullptr; | |
351 client->didFail(error); | |
352 } | |
353 | |
354 void WorkerThreadableLoader::didFailAccessControlCheck(const ResourceError& erro r) | |
355 { | |
356 DCHECK(!isMainThread()); | |
357 if (!m_client) | |
358 return; | |
359 auto* client = m_client; | |
360 m_client = nullptr; | |
361 m_peer = nullptr; | |
362 client->didFailAccessControlCheck(error); | |
363 } | |
364 | |
365 void WorkerThreadableLoader::didFailRedirectCheck() | |
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->didFailRedirectCheck(); | |
374 } | |
375 | |
376 void WorkerThreadableLoader::didDownloadData(int dataLength) | |
377 { | |
378 DCHECK(!isMainThread()); | |
379 if (!m_client) | |
380 return; | |
381 m_client->didDownloadData(dataLength); | |
382 } | |
383 | |
384 void WorkerThreadableLoader::didReceiveResourceTiming(std::unique_ptr<CrossThrea dResourceTimingInfoData> timingData) | |
385 { | |
386 DCHECK(!isMainThread()); | |
387 if (!m_client) | |
388 return; | |
389 std::unique_ptr<ResourceTimingInfo> info(ResourceTimingInfo::adopt(std::move (timingData))); | |
390 WorkerGlobalScopePerformance::performance(*m_workerGlobalScope)->addResource Timing(*info); | |
391 m_client->didReceiveResourceTiming(*info); | |
392 } | |
393 | |
394 DEFINE_TRACE(WorkerThreadableLoader) | |
395 { | |
396 visitor->trace(m_workerGlobalScope); | |
397 ThreadableLoader::trace(visitor); | |
345 } | 398 } |
346 | 399 |
347 void WorkerThreadableLoader::Peer::createAndStart( | 400 void WorkerThreadableLoader::Peer::createAndStart( |
348 Bridge* bridge, | 401 WorkerThreadableLoader* workerLoader, |
349 PassRefPtr<WorkerLoaderProxy> passLoaderProxy, | 402 PassRefPtr<WorkerLoaderProxy> passLoaderProxy, |
350 WorkerThreadLifecycleContext* workerThreadLifecycleContext, | 403 WorkerThreadLifecycleContext* workerThreadLifecycleContext, |
351 std::unique_ptr<CrossThreadResourceRequestData> request, | 404 std::unique_ptr<CrossThreadResourceRequestData> request, |
352 const ThreadableLoaderOptions& options, | 405 const ThreadableLoaderOptions& options, |
353 const ResourceLoaderOptions& resourceLoaderOptions, | 406 const ResourceLoaderOptions& resourceLoaderOptions, |
354 PassRefPtr<WaitableEventWithTasks> eventWithTasks, | 407 PassRefPtr<WaitableEventWithTasks> eventWithTasks, |
355 ExecutionContext* executionContext) | 408 ExecutionContext* executionContext) |
356 { | 409 { |
357 DCHECK(isMainThread()); | 410 DCHECK(isMainThread()); |
358 TaskForwarder* forwarder; | 411 TaskForwarder* forwarder; |
359 RefPtr<WorkerLoaderProxy> loaderProxy = passLoaderProxy; | 412 RefPtr<WorkerLoaderProxy> loaderProxy = passLoaderProxy; |
360 if (eventWithTasks) | 413 if (eventWithTasks) |
361 forwarder = new SyncTaskForwarder(eventWithTasks); | 414 forwarder = new SyncTaskForwarder(eventWithTasks); |
362 else | 415 else |
363 forwarder = new AsyncTaskForwarder(loaderProxy); | 416 forwarder = new AsyncTaskForwarder(loaderProxy); |
364 | 417 |
365 Peer* peer = new Peer(forwarder, workerThreadLifecycleContext); | 418 Peer* peer = new Peer(forwarder, workerThreadLifecycleContext); |
366 if (peer->wasContextDestroyedBeforeObserverCreation()) { | 419 if (peer->wasContextDestroyedBeforeObserverCreation()) { |
367 // The thread is already terminating. | 420 // The thread is already terminating. |
368 forwarder->abort(); | 421 forwarder->abort(); |
369 peer->m_forwarder = nullptr; | 422 peer->m_forwarder = nullptr; |
370 return; | 423 return; |
371 } | 424 } |
372 peer->m_clientWrapper = bridge->clientWrapper(); | 425 peer->m_workerLoader = workerLoader; |
373 peer->start(*toDocument(executionContext), std::move(request), options, reso urceLoaderOptions); | 426 peer->start(*toDocument(executionContext), std::move(request), options, reso urceLoaderOptions); |
374 forwarder->forwardTask(createCrossThreadTask(&Bridge::didStart, wrapCrossThr eadPersistent(bridge), wrapCrossThreadPersistent(peer))); | 427 forwarder->forwardTask(createCrossThreadTask(&WorkerThreadableLoader::didSta rt, wrapCrossThreadPersistent(workerLoader), wrapCrossThreadPersistent(peer))); |
375 } | 428 } |
376 | 429 |
377 WorkerThreadableLoader::Peer::~Peer() | 430 WorkerThreadableLoader::Peer::~Peer() |
378 { | 431 { |
379 DCHECK(isMainThread()); | 432 DCHECK(isMainThread()); |
haraken
2016/07/29 14:52:51
Can we add DCHECK(!m_workerLoader)?
yhirano
2016/08/01 06:20:06
Done.
| |
380 DCHECK(!m_mainThreadLoader); | |
haraken
2016/07/29 14:52:51
Why do we need to remove the DCHECK?
yhirano
2016/08/01 06:20:06
Generally I don't like to enforce clearing Member
| |
381 } | 433 } |
382 | 434 |
383 void WorkerThreadableLoader::Peer::overrideTimeout(unsigned long timeoutMillisec onds) | 435 void WorkerThreadableLoader::Peer::overrideTimeout(unsigned long timeoutMillisec onds) |
384 { | 436 { |
385 DCHECK(isMainThread()); | 437 DCHECK(isMainThread()); |
386 if (!m_mainThreadLoader) | 438 if (!m_mainThreadLoader) |
387 return; | 439 return; |
388 m_mainThreadLoader->overrideTimeout(timeoutMilliseconds); | 440 m_mainThreadLoader->overrideTimeout(timeoutMilliseconds); |
389 } | 441 } |
390 | 442 |
391 void WorkerThreadableLoader::Peer::cancel() | 443 void WorkerThreadableLoader::Peer::cancel() |
392 { | 444 { |
393 DCHECK(isMainThread()); | 445 DCHECK(isMainThread()); |
394 if (!m_mainThreadLoader) | 446 if (!m_mainThreadLoader) |
395 return; | 447 return; |
396 m_mainThreadLoader->cancel(); | 448 m_mainThreadLoader->cancel(); |
397 m_mainThreadLoader = nullptr; | 449 m_mainThreadLoader = nullptr; |
398 } | 450 } |
399 | 451 |
400 void WorkerThreadableLoader::Peer::didSendData(unsigned long long bytesSent, uns igned long long totalBytesToBeSent) | 452 void WorkerThreadableLoader::Peer::didSendData(unsigned long long bytesSent, uns igned long long totalBytesToBeSent) |
401 { | 453 { |
402 DCHECK(isMainThread()); | 454 DCHECK(isMainThread()); |
403 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien tWrapper.get(); | 455 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader. get(); |
404 if (!clientWrapper || !m_forwarder) | 456 if (!workerLoader || !m_forwarder) |
405 return; | 457 return; |
406 m_forwarder->forwardTask(createCrossThreadTask(&ThreadableLoaderClientWrappe r::didSendData, clientWrapper, bytesSent, totalBytesToBeSent)); | 458 m_forwarder->forwardTask(createCrossThreadTask(&WorkerThreadableLoader::didS endData, workerLoader, bytesSent, totalBytesToBeSent)); |
407 } | 459 } |
408 | 460 |
409 void WorkerThreadableLoader::Peer::didReceiveResponse(unsigned long identifier, const ResourceResponse& response, std::unique_ptr<WebDataConsumerHandle> handle) | 461 void WorkerThreadableLoader::Peer::didReceiveResponse(unsigned long identifier, const ResourceResponse& response, std::unique_ptr<WebDataConsumerHandle> handle) |
410 { | 462 { |
411 DCHECK(isMainThread()); | 463 DCHECK(isMainThread()); |
412 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien tWrapper.get(); | 464 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader. get(); |
413 if (!clientWrapper || !m_forwarder) | 465 if (!workerLoader || !m_forwarder) |
414 return; | 466 return; |
415 m_forwarder->forwardTask(createCrossThreadTask(&ThreadableLoaderClientWrappe r::didReceiveResponse, clientWrapper, identifier, response, passed(std::move(han dle)))); | 467 m_forwarder->forwardTask(createCrossThreadTask(&WorkerThreadableLoader::didR eceiveResponse, workerLoader, identifier, response, passed(std::move(handle)))); |
416 } | 468 } |
417 | 469 |
418 void WorkerThreadableLoader::Peer::didReceiveData(const char* data, unsigned dat aLength) | 470 void WorkerThreadableLoader::Peer::didReceiveData(const char* data, unsigned dat aLength) |
419 { | 471 { |
420 DCHECK(isMainThread()); | 472 DCHECK(isMainThread()); |
421 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien tWrapper.get(); | 473 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader. get(); |
422 if (!clientWrapper || !m_forwarder) | 474 if (!workerLoader || !m_forwarder) |
423 return; | 475 return; |
424 m_forwarder->forwardTask(createCrossThreadTask(&ThreadableLoaderClientWrappe r::didReceiveData, clientWrapper, passed(createVectorFromMemoryRegion(data, data Length)))); | 476 m_forwarder->forwardTask(createCrossThreadTask(&WorkerThreadableLoader::didR eceiveData, workerLoader, passed(createVectorFromMemoryRegion(data, dataLength)) )); |
425 } | 477 } |
426 | 478 |
427 void WorkerThreadableLoader::Peer::didDownloadData(int dataLength) | 479 void WorkerThreadableLoader::Peer::didDownloadData(int dataLength) |
428 { | 480 { |
429 DCHECK(isMainThread()); | 481 DCHECK(isMainThread()); |
430 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien tWrapper.get(); | 482 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader. get(); |
431 if (!clientWrapper || !m_forwarder) | 483 if (!workerLoader || !m_forwarder) |
432 return; | 484 return; |
433 m_forwarder->forwardTask(createCrossThreadTask(&ThreadableLoaderClientWrappe r::didDownloadData, clientWrapper, dataLength)); | 485 m_forwarder->forwardTask(createCrossThreadTask(&WorkerThreadableLoader::didD ownloadData, workerLoader, dataLength)); |
434 } | 486 } |
435 | 487 |
436 void WorkerThreadableLoader::Peer::didReceiveCachedMetadata(const char* data, in t dataLength) | 488 void WorkerThreadableLoader::Peer::didReceiveCachedMetadata(const char* data, in t dataLength) |
437 { | 489 { |
438 DCHECK(isMainThread()); | 490 DCHECK(isMainThread()); |
439 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien tWrapper.get(); | 491 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader. get(); |
440 if (!clientWrapper || !m_forwarder) | 492 if (!workerLoader || !m_forwarder) |
441 return; | 493 return; |
442 m_forwarder->forwardTask(createCrossThreadTask(&ThreadableLoaderClientWrappe r::didReceiveCachedMetadata, clientWrapper, passed(createVectorFromMemoryRegion( data, dataLength)))); | 494 m_forwarder->forwardTask(createCrossThreadTask(&WorkerThreadableLoader::didR eceiveCachedMetadata, workerLoader, passed(createVectorFromMemoryRegion(data, da taLength)))); |
443 } | 495 } |
444 | 496 |
445 void WorkerThreadableLoader::Peer::didFinishLoading(unsigned long identifier, do uble finishTime) | 497 void WorkerThreadableLoader::Peer::didFinishLoading(unsigned long identifier, do uble finishTime) |
446 { | 498 { |
447 DCHECK(isMainThread()); | 499 DCHECK(isMainThread()); |
448 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien tWrapper.get(); | 500 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader. get(); |
449 if (!clientWrapper || !m_forwarder) | 501 if (!workerLoader || !m_forwarder) |
450 return; | 502 return; |
451 m_forwarder->forwardTaskWithDoneSignal(createCrossThreadTask(&ThreadableLoad erClientWrapper::didFinishLoading, clientWrapper, identifier, finishTime)); | 503 m_forwarder->forwardTaskWithDoneSignal(createCrossThreadTask(&WorkerThreadab leLoader::didFinishLoading, workerLoader, identifier, finishTime)); |
452 m_forwarder = nullptr; | 504 m_forwarder = nullptr; |
453 } | 505 } |
454 | 506 |
455 void WorkerThreadableLoader::Peer::didFail(const ResourceError& error) | 507 void WorkerThreadableLoader::Peer::didFail(const ResourceError& error) |
456 { | 508 { |
457 DCHECK(isMainThread()); | 509 DCHECK(isMainThread()); |
458 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien tWrapper.get(); | 510 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader. get(); |
459 if (!clientWrapper || !m_forwarder) | 511 if (!workerLoader || !m_forwarder) |
460 return; | 512 return; |
461 m_forwarder->forwardTaskWithDoneSignal(createCrossThreadTask(&ThreadableLoad erClientWrapper::didFail, clientWrapper, error)); | 513 m_forwarder->forwardTaskWithDoneSignal(createCrossThreadTask(&WorkerThreadab leLoader::didFail, workerLoader, error)); |
462 m_forwarder = nullptr; | 514 m_forwarder = nullptr; |
463 } | 515 } |
464 | 516 |
465 void WorkerThreadableLoader::Peer::didFailAccessControlCheck(const ResourceError & error) | 517 void WorkerThreadableLoader::Peer::didFailAccessControlCheck(const ResourceError & error) |
466 { | 518 { |
467 DCHECK(isMainThread()); | 519 DCHECK(isMainThread()); |
468 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien tWrapper.get(); | 520 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader. get(); |
469 if (!clientWrapper || !m_forwarder) | 521 if (!workerLoader || !m_forwarder) |
470 return; | 522 return; |
471 m_forwarder->forwardTaskWithDoneSignal(createCrossThreadTask(&ThreadableLoad erClientWrapper::didFailAccessControlCheck, clientWrapper, error)); | 523 m_forwarder->forwardTaskWithDoneSignal(createCrossThreadTask(&WorkerThreadab leLoader::didFailAccessControlCheck, workerLoader, error)); |
472 m_forwarder = nullptr; | 524 m_forwarder = nullptr; |
473 } | 525 } |
474 | 526 |
475 void WorkerThreadableLoader::Peer::didFailRedirectCheck() | 527 void WorkerThreadableLoader::Peer::didFailRedirectCheck() |
476 { | 528 { |
477 DCHECK(isMainThread()); | 529 DCHECK(isMainThread()); |
478 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien tWrapper.get(); | 530 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader. get(); |
479 if (!clientWrapper || !m_forwarder) | 531 if (!workerLoader || !m_forwarder) |
480 return; | 532 return; |
481 m_forwarder->forwardTaskWithDoneSignal(createCrossThreadTask(&ThreadableLoad erClientWrapper::didFailRedirectCheck, clientWrapper)); | 533 m_forwarder->forwardTaskWithDoneSignal(createCrossThreadTask(&WorkerThreadab leLoader::didFailRedirectCheck, workerLoader)); |
482 m_forwarder = nullptr; | 534 m_forwarder = nullptr; |
483 } | 535 } |
484 | 536 |
485 void WorkerThreadableLoader::Peer::didReceiveResourceTiming(const ResourceTiming Info& info) | 537 void WorkerThreadableLoader::Peer::didReceiveResourceTiming(const ResourceTiming Info& info) |
486 { | 538 { |
487 DCHECK(isMainThread()); | 539 DCHECK(isMainThread()); |
488 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien tWrapper.get(); | 540 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader. get(); |
489 if (!clientWrapper || !m_forwarder) | 541 if (!workerLoader || !m_forwarder) |
490 return; | 542 return; |
491 m_forwarder->forwardTask(createCrossThreadTask(&ThreadableLoaderClientWrappe r::didReceiveResourceTiming, clientWrapper, info)); | 543 m_forwarder->forwardTask(createCrossThreadTask(&WorkerThreadableLoader::didR eceiveResourceTiming, workerLoader, info)); |
492 } | 544 } |
493 | 545 |
494 void WorkerThreadableLoader::Peer::contextDestroyed() | 546 void WorkerThreadableLoader::Peer::contextDestroyed() |
495 { | 547 { |
496 DCHECK(isMainThread()); | 548 DCHECK(isMainThread()); |
497 if (m_forwarder) { | 549 if (m_forwarder) { |
498 m_forwarder->abort(); | 550 m_forwarder->abort(); |
499 m_forwarder = nullptr; | 551 m_forwarder = nullptr; |
500 } | 552 } |
501 m_clientWrapper = nullptr; | 553 m_workerLoader = nullptr; |
502 cancel(); | 554 cancel(); |
503 } | 555 } |
504 | 556 |
505 DEFINE_TRACE(WorkerThreadableLoader::Peer) | 557 DEFINE_TRACE(WorkerThreadableLoader::Peer) |
506 { | 558 { |
507 visitor->trace(m_forwarder); | 559 visitor->trace(m_forwarder); |
560 visitor->trace(m_mainThreadLoader); | |
508 WorkerThreadLifecycleObserver::trace(visitor); | 561 WorkerThreadLifecycleObserver::trace(visitor); |
509 } | 562 } |
510 | 563 |
511 WorkerThreadableLoader::Peer::Peer(TaskForwarder* forwarder, WorkerThreadLifecyc leContext* context) | 564 WorkerThreadableLoader::Peer::Peer(TaskForwarder* forwarder, WorkerThreadLifecyc leContext* context) |
512 : WorkerThreadLifecycleObserver(context) | 565 : WorkerThreadLifecycleObserver(context) |
513 , m_forwarder(forwarder) | 566 , m_forwarder(forwarder) |
514 { | 567 { |
515 DCHECK(isMainThread()); | 568 DCHECK(isMainThread()); |
516 } | 569 } |
517 | 570 |
518 void WorkerThreadableLoader::Peer::start( | 571 void WorkerThreadableLoader::Peer::start( |
519 Document& document, | 572 Document& document, |
520 std::unique_ptr<CrossThreadResourceRequestData> request, | 573 std::unique_ptr<CrossThreadResourceRequestData> request, |
521 const ThreadableLoaderOptions& options, | 574 const ThreadableLoaderOptions& options, |
522 const ResourceLoaderOptions& originalResourceLoaderOptions) | 575 const ResourceLoaderOptions& originalResourceLoaderOptions) |
523 { | 576 { |
524 DCHECK(isMainThread()); | 577 DCHECK(isMainThread()); |
525 ResourceLoaderOptions resourceLoaderOptions = originalResourceLoaderOptions; | 578 ResourceLoaderOptions resourceLoaderOptions = originalResourceLoaderOptions; |
526 resourceLoaderOptions.requestInitiatorContext = WorkerContext; | 579 resourceLoaderOptions.requestInitiatorContext = WorkerContext; |
527 m_mainThreadLoader = DocumentThreadableLoader::create(document, this, option s, resourceLoaderOptions); | 580 m_mainThreadLoader = DocumentThreadableLoader::create(document, this, option s, resourceLoaderOptions); |
528 m_mainThreadLoader->start(ResourceRequest(request.get())); | 581 m_mainThreadLoader->start(ResourceRequest(request.get())); |
529 } | 582 } |
530 | 583 |
531 } // namespace blink | 584 } // namespace blink |
OLD | NEW |