| 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 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 | 52 |
| 53 namespace blink { | 53 namespace blink { |
| 54 | 54 |
| 55 static PassOwnPtr<Vector<char>> createVectorFromMemoryRegion(const char* data, u
nsigned dataLength) | 55 static PassOwnPtr<Vector<char>> createVectorFromMemoryRegion(const char* data, u
nsigned dataLength) |
| 56 { | 56 { |
| 57 OwnPtr<Vector<char>> buffer = adoptPtr(new Vector<char>(dataLength)); | 57 OwnPtr<Vector<char>> buffer = adoptPtr(new Vector<char>(dataLength)); |
| 58 memcpy(buffer->data(), data, dataLength); | 58 memcpy(buffer->data(), data, dataLength); |
| 59 return buffer.release(); | 59 return buffer.release(); |
| 60 } | 60 } |
| 61 | 61 |
| 62 WorkerThreadableLoader::WorkerThreadableLoader(WorkerGlobalScope& workerGlobalSc
ope, ThreadableLoaderClient* client, const ResourceRequest& request, const Threa
dableLoaderOptions& options, const ResourceLoaderOptions& resourceLoaderOptions,
BlockingBehavior blockingBehavior) | 62 WorkerThreadableLoader::WorkerThreadableLoader(WorkerGlobalScope& workerGlobalSc
ope, ThreadableLoaderClient* client, const ThreadableLoaderOptions& options, con
st ResourceLoaderOptions& resourceLoaderOptions, BlockingBehavior blockingBehavi
or) |
| 63 : m_workerGlobalScope(&workerGlobalScope) | 63 : m_workerGlobalScope(&workerGlobalScope) |
| 64 , m_workerClientWrapper(ThreadableLoaderClientWrapper::create(client)) | 64 , m_workerClientWrapper(ThreadableLoaderClientWrapper::create(client)) |
| 65 { | 65 { |
| 66 m_workerClientWrapper->setResourceTimingClient(this); | 66 m_workerClientWrapper->setResourceTimingClient(this); |
| 67 if (blockingBehavior == LoadAsynchronously) { | 67 if (blockingBehavior == LoadAsynchronously) { |
| 68 m_bridge = new MainThreadAsyncBridge(workerGlobalScope, m_workerClientWr
apper, request, options, resourceLoaderOptions, workerGlobalScope.referrerPolicy
(), workerGlobalScope.url().strippedForUseAsReferrer()); | 68 m_bridge = new MainThreadAsyncBridge(workerGlobalScope, m_workerClientWr
apper, options, resourceLoaderOptions); |
| 69 } else { | 69 } else { |
| 70 m_bridge = new MainThreadSyncBridge(workerGlobalScope, m_workerClientWra
pper, request, options, resourceLoaderOptions, workerGlobalScope.referrerPolicy(
), workerGlobalScope.url().strippedForUseAsReferrer()); | 70 m_bridge = new MainThreadSyncBridge(workerGlobalScope, m_workerClientWra
pper, options, resourceLoaderOptions); |
| 71 } | 71 } |
| 72 } | 72 } |
| 73 | 73 |
| 74 void WorkerThreadableLoader::loadResourceSynchronously(WorkerGlobalScope& worker
GlobalScope, const ResourceRequest& request, ThreadableLoaderClient& client, con
st ThreadableLoaderOptions& options, const ResourceLoaderOptions& resourceLoader
Options) | 74 void WorkerThreadableLoader::loadResourceSynchronously(WorkerGlobalScope& worker
GlobalScope, const ResourceRequest& request, ThreadableLoaderClient& client, con
st ThreadableLoaderOptions& options, const ResourceLoaderOptions& resourceLoader
Options) |
| 75 { | 75 { |
| 76 RefPtr<WorkerThreadableLoader> loader = adoptRef(new WorkerThreadableLoader(
workerGlobalScope, &client, request, options, resourceLoaderOptions, LoadSynchro
nously)); | 76 RefPtr<WorkerThreadableLoader> loader = adoptRef(new WorkerThreadableLoader(
workerGlobalScope, &client, options, resourceLoaderOptions, LoadSynchronously)); |
| 77 loader->start(request); |
| 77 } | 78 } |
| 78 | 79 |
| 79 WorkerThreadableLoader::~WorkerThreadableLoader() | 80 WorkerThreadableLoader::~WorkerThreadableLoader() |
| 80 { | 81 { |
| 81 m_workerClientWrapper->clearResourceTimingClient(); | 82 m_workerClientWrapper->clearResourceTimingClient(); |
| 82 m_bridge->destroy(); | 83 m_bridge->destroy(); |
| 83 m_bridge = nullptr; | 84 m_bridge = nullptr; |
| 84 } | 85 } |
| 85 | 86 |
| 87 void WorkerThreadableLoader::start(const ResourceRequest& request) |
| 88 { |
| 89 m_bridge->start(request, *m_workerGlobalScope); |
| 90 m_workerClientWrapper->setResourceTimingClient(this); |
| 91 } |
| 92 |
| 86 void WorkerThreadableLoader::overrideTimeout(unsigned long timeoutMilliseconds) | 93 void WorkerThreadableLoader::overrideTimeout(unsigned long timeoutMilliseconds) |
| 87 { | 94 { |
| 88 ASSERT(m_bridge); | 95 ASSERT(m_bridge); |
| 89 m_bridge->overrideTimeout(timeoutMilliseconds); | 96 m_bridge->overrideTimeout(timeoutMilliseconds); |
| 90 } | 97 } |
| 91 | 98 |
| 92 void WorkerThreadableLoader::cancel() | 99 void WorkerThreadableLoader::cancel() |
| 93 { | 100 { |
| 94 ASSERT(m_bridge); | 101 ASSERT(m_bridge); |
| 95 m_bridge->cancel(); | 102 m_bridge->cancel(); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 107 , m_loaderProxy(loaderProxy) | 114 , m_loaderProxy(loaderProxy) |
| 108 { | 115 { |
| 109 ASSERT(m_workerClientWrapper.get()); | 116 ASSERT(m_workerClientWrapper.get()); |
| 110 ASSERT(m_loaderProxy.get()); | 117 ASSERT(m_loaderProxy.get()); |
| 111 } | 118 } |
| 112 | 119 |
| 113 WorkerThreadableLoader::MainThreadBridgeBase::~MainThreadBridgeBase() | 120 WorkerThreadableLoader::MainThreadBridgeBase::~MainThreadBridgeBase() |
| 114 { | 121 { |
| 115 } | 122 } |
| 116 | 123 |
| 117 void WorkerThreadableLoader::MainThreadBridgeBase::mainThreadCreateLoader(PassOw
nPtr<CrossThreadResourceRequestData> requestData, ThreadableLoaderOptions option
s, ResourceLoaderOptions resourceLoaderOptions, const ReferrerPolicy referrerPol
icy, const String& outgoingReferrer, ExecutionContext* context) | 124 void WorkerThreadableLoader::MainThreadBridgeBase::mainThreadCreateLoader(Thread
ableLoaderOptions options, ResourceLoaderOptions resourceLoaderOptions, Executio
nContext* context) |
| 118 { | 125 { |
| 119 ASSERT(isMainThread()); | 126 ASSERT(isMainThread()); |
| 120 Document* document = toDocument(context); | 127 Document* document = toDocument(context); |
| 121 | 128 |
| 129 resourceLoaderOptions.requestInitiatorContext = WorkerContext; |
| 130 m_mainThreadLoader = DocumentThreadableLoader::create(*document, this, optio
ns, resourceLoaderOptions); |
| 131 ASSERT(m_mainThreadLoader); |
| 132 } |
| 133 |
| 134 void WorkerThreadableLoader::MainThreadBridgeBase::mainThreadStart(PassOwnPtr<Cr
ossThreadResourceRequestData> requestData, const ReferrerPolicy referrerPolicy,
const String& outgoingReferrer) |
| 135 { |
| 136 ASSERT(isMainThread()); |
| 137 ASSERT(m_mainThreadLoader); |
| 138 |
| 122 ResourceRequest request(requestData.get()); | 139 ResourceRequest request(requestData.get()); |
| 123 if (!request.didSetHTTPReferrer()) | 140 if (!request.didSetHTTPReferrer()) |
| 124 request.setHTTPReferrer(SecurityPolicy::generateReferrer(referrerPolicy,
request.url(), outgoingReferrer)); | 141 request.setHTTPReferrer(SecurityPolicy::generateReferrer(referrerPolicy,
request.url(), outgoingReferrer)); |
| 125 resourceLoaderOptions.requestInitiatorContext = WorkerContext; | 142 m_mainThreadLoader->start(request); |
| 126 m_mainThreadLoader = DocumentThreadableLoader::create(*document, this, reque
st, options, resourceLoaderOptions); | |
| 127 if (!m_mainThreadLoader) { | |
| 128 // DocumentThreadableLoader::create may return 0 when the document loade
r has been already changed. | |
| 129 didFail(ResourceError(errorDomainBlinkInternal, 0, request.url().string(
), "The parent document page has been unloaded.")); | |
| 130 } | |
| 131 } | 143 } |
| 132 | 144 |
| 133 void WorkerThreadableLoader::MainThreadBridgeBase::createLoader(const ResourceRe
quest& request, const ThreadableLoaderOptions& options, const ResourceLoaderOpti
ons& resourceLoaderOptions, const ReferrerPolicy& referrerPolicy, const String&
outgoingReferrer) | 145 void WorkerThreadableLoader::MainThreadBridgeBase::createLoaderInMainThread(cons
t ThreadableLoaderOptions& options, const ResourceLoaderOptions& resourceLoaderO
ptions) |
| 134 { | 146 { |
| 135 m_loaderProxy->postTaskToLoader(createCrossThreadTask(&MainThreadBridgeBase:
:mainThreadCreateLoader, this, request, options, resourceLoaderOptions, referrer
Policy, outgoingReferrer)); | 147 m_loaderProxy->postTaskToLoader(createCrossThreadTask(&MainThreadBridgeBase:
:mainThreadCreateLoader, this, options, resourceLoaderOptions)); |
| 148 } |
| 149 |
| 150 void WorkerThreadableLoader::MainThreadBridgeBase::startInMainThread(const Resou
rceRequest& request, const WorkerGlobalScope& workerGlobalScope) |
| 151 { |
| 152 loaderProxy()->postTaskToLoader(createCrossThreadTask(&MainThreadBridgeBase:
:mainThreadStart, this, request, workerGlobalScope.referrerPolicy(), workerGloba
lScope.url().strippedForUseAsReferrer())); |
| 136 } | 153 } |
| 137 | 154 |
| 138 void WorkerThreadableLoader::MainThreadBridgeBase::mainThreadDestroy(ExecutionCo
ntext* context) | 155 void WorkerThreadableLoader::MainThreadBridgeBase::mainThreadDestroy(ExecutionCo
ntext* context) |
| 139 { | 156 { |
| 140 ASSERT(isMainThread()); | 157 ASSERT(isMainThread()); |
| 141 ASSERT_UNUSED(context, context->isDocument()); | 158 ASSERT_UNUSED(context, context->isDocument()); |
| 142 delete this; | 159 delete this; |
| 143 } | 160 } |
| 144 | 161 |
| 145 void WorkerThreadableLoader::MainThreadBridgeBase::destroy() | 162 void WorkerThreadableLoader::MainThreadBridgeBase::destroy() |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 // |this| might be already destructed here because didFail() might | 208 // |this| might be already destructed here because didFail() might |
| 192 // clear a reference to ThreadableLoader, which might destruct | 209 // clear a reference to ThreadableLoader, which might destruct |
| 193 // WorkerThreadableLoader and then MainThreadBridge. | 210 // WorkerThreadableLoader and then MainThreadBridge. |
| 194 // Therefore we call clearClient() directly, rather than calling | 211 // Therefore we call clearClient() directly, rather than calling |
| 195 // this->m_workerClientWrapper->clearClient(). | 212 // this->m_workerClientWrapper->clearClient(). |
| 196 clientWrapper->clearClient(); | 213 clientWrapper->clearClient(); |
| 197 } | 214 } |
| 198 | 215 |
| 199 void WorkerThreadableLoader::MainThreadBridgeBase::didSendData(unsigned long lon
g bytesSent, unsigned long long totalBytesToBeSent) | 216 void WorkerThreadableLoader::MainThreadBridgeBase::didSendData(unsigned long lon
g bytesSent, unsigned long long totalBytesToBeSent) |
| 200 { | 217 { |
| 201 forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::di
dSendData, workerClientWrapper(), bytesSent, totalBytesToBeSent)); | 218 forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::di
dSendData, m_workerClientWrapper, bytesSent, totalBytesToBeSent)); |
| 202 } | 219 } |
| 203 | 220 |
| 204 void WorkerThreadableLoader::MainThreadBridgeBase::didReceiveResponse(unsigned l
ong identifier, const ResourceResponse& response, PassOwnPtr<WebDataConsumerHand
le> handle) | 221 void WorkerThreadableLoader::MainThreadBridgeBase::didReceiveResponse(unsigned l
ong identifier, const ResourceResponse& response, PassOwnPtr<WebDataConsumerHand
le> handle) |
| 205 { | 222 { |
| 206 forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::di
dReceiveResponse, workerClientWrapper(), identifier, response, handle)); | 223 forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::di
dReceiveResponse, m_workerClientWrapper, identifier, response, handle)); |
| 207 } | 224 } |
| 208 | 225 |
| 209 void WorkerThreadableLoader::MainThreadBridgeBase::didReceiveData(const char* da
ta, unsigned dataLength) | 226 void WorkerThreadableLoader::MainThreadBridgeBase::didReceiveData(const char* da
ta, unsigned dataLength) |
| 210 { | 227 { |
| 211 forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::di
dReceiveData, workerClientWrapper(), createVectorFromMemoryRegion(data, dataLeng
th))); | 228 forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::di
dReceiveData, m_workerClientWrapper, createVectorFromMemoryRegion(data, dataLeng
th))); |
| 212 } | 229 } |
| 213 | 230 |
| 214 void WorkerThreadableLoader::MainThreadBridgeBase::didDownloadData(int dataLengt
h) | 231 void WorkerThreadableLoader::MainThreadBridgeBase::didDownloadData(int dataLengt
h) |
| 215 { | 232 { |
| 216 forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::di
dDownloadData, workerClientWrapper(), dataLength)); | 233 forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::di
dDownloadData, m_workerClientWrapper, dataLength)); |
| 217 } | 234 } |
| 218 | 235 |
| 219 void WorkerThreadableLoader::MainThreadBridgeBase::didReceiveCachedMetadata(cons
t char* data, int dataLength) | 236 void WorkerThreadableLoader::MainThreadBridgeBase::didReceiveCachedMetadata(cons
t char* data, int dataLength) |
| 220 { | 237 { |
| 221 forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::di
dReceiveCachedMetadata, workerClientWrapper(), createVectorFromMemoryRegion(data
, dataLength))); | 238 forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::di
dReceiveCachedMetadata, m_workerClientWrapper, createVectorFromMemoryRegion(data
, dataLength))); |
| 222 } | 239 } |
| 223 | 240 |
| 224 void WorkerThreadableLoader::MainThreadBridgeBase::didFinishLoading(unsigned lon
g identifier, double finishTime) | 241 void WorkerThreadableLoader::MainThreadBridgeBase::didFinishLoading(unsigned lon
g identifier, double finishTime) |
| 225 { | 242 { |
| 226 forwardTaskToWorkerOnLoaderDone(createCrossThreadTask(&ThreadableLoaderClien
tWrapper::didFinishLoading, workerClientWrapper(), identifier, finishTime)); | 243 forwardTaskToWorkerOnLoaderDone(createCrossThreadTask(&ThreadableLoaderClien
tWrapper::didFinishLoading, m_workerClientWrapper, identifier, finishTime)); |
| 227 } | 244 } |
| 228 | 245 |
| 229 void WorkerThreadableLoader::MainThreadBridgeBase::didFail(const ResourceError&
error) | 246 void WorkerThreadableLoader::MainThreadBridgeBase::didFail(const ResourceError&
error) |
| 230 { | 247 { |
| 231 forwardTaskToWorkerOnLoaderDone(createCrossThreadTask(&ThreadableLoaderClien
tWrapper::didFail, workerClientWrapper(), error)); | 248 forwardTaskToWorkerOnLoaderDone(createCrossThreadTask(&ThreadableLoaderClien
tWrapper::didFail, m_workerClientWrapper, error)); |
| 232 } | 249 } |
| 233 | 250 |
| 234 void WorkerThreadableLoader::MainThreadBridgeBase::didFailAccessControlCheck(con
st ResourceError& error) | 251 void WorkerThreadableLoader::MainThreadBridgeBase::didFailAccessControlCheck(con
st ResourceError& error) |
| 235 { | 252 { |
| 236 forwardTaskToWorkerOnLoaderDone(createCrossThreadTask(&ThreadableLoaderClien
tWrapper::didFailAccessControlCheck, workerClientWrapper(), error)); | 253 forwardTaskToWorkerOnLoaderDone(createCrossThreadTask(&ThreadableLoaderClien
tWrapper::didFailAccessControlCheck, m_workerClientWrapper, error)); |
| 237 } | 254 } |
| 238 | 255 |
| 239 void WorkerThreadableLoader::MainThreadBridgeBase::didFailRedirectCheck() | 256 void WorkerThreadableLoader::MainThreadBridgeBase::didFailRedirectCheck() |
| 240 { | 257 { |
| 241 forwardTaskToWorkerOnLoaderDone(createCrossThreadTask(&ThreadableLoaderClien
tWrapper::didFailRedirectCheck, workerClientWrapper())); | 258 forwardTaskToWorkerOnLoaderDone(createCrossThreadTask(&ThreadableLoaderClien
tWrapper::didFailRedirectCheck, m_workerClientWrapper)); |
| 242 } | 259 } |
| 243 | 260 |
| 244 void WorkerThreadableLoader::MainThreadBridgeBase::didReceiveResourceTiming(cons
t ResourceTimingInfo& info) | 261 void WorkerThreadableLoader::MainThreadBridgeBase::didReceiveResourceTiming(cons
t ResourceTimingInfo& info) |
| 245 { | 262 { |
| 246 forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::di
dReceiveResourceTiming, workerClientWrapper(), info)); | 263 forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::di
dReceiveResourceTiming, m_workerClientWrapper, info)); |
| 247 } | 264 } |
| 248 | 265 |
| 249 WorkerThreadableLoader::MainThreadAsyncBridge::MainThreadAsyncBridge( | 266 WorkerThreadableLoader::MainThreadAsyncBridge::MainThreadAsyncBridge( |
| 250 WorkerGlobalScope& workerGlobalScope, | 267 WorkerGlobalScope& workerGlobalScope, |
| 251 PassRefPtr<ThreadableLoaderClientWrapper> workerClientWrapper, | 268 PassRefPtr<ThreadableLoaderClientWrapper> workerClientWrapper, |
| 252 const ResourceRequest& request, | |
| 253 const ThreadableLoaderOptions& options, | 269 const ThreadableLoaderOptions& options, |
| 254 const ResourceLoaderOptions& resourceLoaderOptions, | 270 const ResourceLoaderOptions& resourceLoaderOptions) |
| 255 const ReferrerPolicy referrerPolicy, | |
| 256 const String& outgoingReferrer) | |
| 257 : MainThreadBridgeBase(workerClientWrapper, workerGlobalScope.thread()->work
erLoaderProxy()) | 271 : MainThreadBridgeBase(workerClientWrapper, workerGlobalScope.thread()->work
erLoaderProxy()) |
| 258 { | 272 { |
| 259 createLoader(request, options, resourceLoaderOptions, referrerPolicy, outgoi
ngReferrer); | 273 createLoaderInMainThread(options, resourceLoaderOptions); |
| 274 } |
| 275 |
| 276 void WorkerThreadableLoader::MainThreadAsyncBridge::start(const ResourceRequest&
request, const WorkerGlobalScope& workerGlobalScope) |
| 277 { |
| 278 startInMainThread(request, workerGlobalScope); |
| 260 } | 279 } |
| 261 | 280 |
| 262 WorkerThreadableLoader::MainThreadAsyncBridge::~MainThreadAsyncBridge() | 281 WorkerThreadableLoader::MainThreadAsyncBridge::~MainThreadAsyncBridge() |
| 263 { | 282 { |
| 264 } | 283 } |
| 265 | 284 |
| 266 void WorkerThreadableLoader::MainThreadAsyncBridge::forwardTaskToWorker(PassOwnP
tr<ExecutionContextTask> task) | 285 void WorkerThreadableLoader::MainThreadAsyncBridge::forwardTaskToWorker(PassOwnP
tr<ExecutionContextTask> task) |
| 267 { | 286 { |
| 268 loaderProxy()->postTaskToWorkerGlobalScope(task); | 287 loaderProxy()->postTaskToWorkerGlobalScope(task); |
| 269 } | 288 } |
| 270 | 289 |
| 271 void WorkerThreadableLoader::MainThreadAsyncBridge::forwardTaskToWorkerOnLoaderD
one(PassOwnPtr<ExecutionContextTask> task) | 290 void WorkerThreadableLoader::MainThreadAsyncBridge::forwardTaskToWorkerOnLoaderD
one(PassOwnPtr<ExecutionContextTask> task) |
| 272 { | 291 { |
| 273 loaderProxy()->postTaskToWorkerGlobalScope(task); | 292 loaderProxy()->postTaskToWorkerGlobalScope(task); |
| 274 } | 293 } |
| 275 | 294 |
| 276 WorkerThreadableLoader::MainThreadSyncBridge::MainThreadSyncBridge( | 295 WorkerThreadableLoader::MainThreadSyncBridge::MainThreadSyncBridge( |
| 277 WorkerGlobalScope& workerGlobalScope, | 296 WorkerGlobalScope& workerGlobalScope, |
| 278 PassRefPtr<ThreadableLoaderClientWrapper> workerClientWrapper, | 297 PassRefPtr<ThreadableLoaderClientWrapper> workerClientWrapper, |
| 279 const ResourceRequest& request, | |
| 280 const ThreadableLoaderOptions& options, | 298 const ThreadableLoaderOptions& options, |
| 281 const ResourceLoaderOptions& resourceLoaderOptions, | 299 const ResourceLoaderOptions& resourceLoaderOptions) |
| 282 const ReferrerPolicy referrerPolicy, | |
| 283 const String& outgoingReferrer) | |
| 284 : MainThreadBridgeBase(workerClientWrapper, workerGlobalScope.thread()->work
erLoaderProxy()) | 300 : MainThreadBridgeBase(workerClientWrapper, workerGlobalScope.thread()->work
erLoaderProxy()) |
| 285 , m_done(false) | 301 , m_done(false) |
| 286 { | 302 { |
| 303 createLoaderInMainThread(options, resourceLoaderOptions); |
| 304 } |
| 305 |
| 306 void WorkerThreadableLoader::MainThreadSyncBridge::start(const ResourceRequest&
request, const WorkerGlobalScope& workerGlobalScope) |
| 307 { |
| 287 WaitableEvent* shutdownEvent = workerGlobalScope.thread()->shutdownEvent(); | 308 WaitableEvent* shutdownEvent = workerGlobalScope.thread()->shutdownEvent(); |
| 288 m_loaderDoneEvent = adoptPtr(new WaitableEvent()); | 309 m_loaderDoneEvent = adoptPtr(new WaitableEvent()); |
| 289 | 310 |
| 290 createLoader(request, options, resourceLoaderOptions, referrerPolicy, outgoi
ngReferrer); | 311 startInMainThread(request, workerGlobalScope); |
| 291 | 312 |
| 292 size_t signaledIndex; | 313 size_t signaledIndex; |
| 293 { | 314 { |
| 294 Vector<WaitableEvent*> events; | 315 Vector<WaitableEvent*> events; |
| 295 // Order is important; indicies are used later. | 316 // Order is important; indicies are used later. |
| 296 events.append(shutdownEvent); | 317 events.append(shutdownEvent); |
| 297 events.append(m_loaderDoneEvent.get()); | 318 events.append(m_loaderDoneEvent.get()); |
| 298 | 319 |
| 299 SafePointScope scope(BlinkGC::HeapPointersOnStack); | 320 SafePointScope scope(BlinkGC::HeapPointersOnStack); |
| 300 signaledIndex = WaitableEvent::waitMultiple(events); | 321 signaledIndex = WaitableEvent::waitMultiple(events); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 342 | 363 |
| 343 MutexLocker lock(m_lock); | 364 MutexLocker lock(m_lock); |
| 344 RELEASE_ASSERT(!m_done); | 365 RELEASE_ASSERT(!m_done); |
| 345 | 366 |
| 346 m_clientTasks.append(task); | 367 m_clientTasks.append(task); |
| 347 m_done = true; | 368 m_done = true; |
| 348 m_loaderDoneEvent->signal(); | 369 m_loaderDoneEvent->signal(); |
| 349 } | 370 } |
| 350 | 371 |
| 351 } // namespace blink | 372 } // namespace blink |
| OLD | NEW |