Chromium Code Reviews| 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 |