Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(165)

Side by Side Diff: Source/modules/websockets/WorkerThreadableWebSocketChannel.cpp

Issue 410393003: Use typedef to shorten WorkerThreadableWebSocketChannel inner classes. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « Source/modules/websockets/WorkerThreadableWebSocketChannel.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011, 2012 Google Inc. All rights reserved. 2 * Copyright (C) 2011, 2012 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 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 #include "platform/RuntimeEnabledFeatures.h" 47 #include "platform/RuntimeEnabledFeatures.h"
48 #include "public/platform/Platform.h" 48 #include "public/platform/Platform.h"
49 #include "public/platform/WebWaitableEvent.h" 49 #include "public/platform/WebWaitableEvent.h"
50 #include "wtf/ArrayBuffer.h" 50 #include "wtf/ArrayBuffer.h"
51 #include "wtf/Assertions.h" 51 #include "wtf/Assertions.h"
52 #include "wtf/Functional.h" 52 #include "wtf/Functional.h"
53 #include "wtf/MainThread.h" 53 #include "wtf/MainThread.h"
54 54
55 namespace blink { 55 namespace blink {
56 56
57 typedef WorkerThreadableWebSocketChannel::Bridge Bridge;
58 typedef WorkerThreadableWebSocketChannel::Peer Peer;
59
57 // Created and destroyed on the worker thread. All setters of this class are 60 // Created and destroyed on the worker thread. All setters of this class are
58 // called on the main thread, while all getters are called on the worker 61 // called on the main thread, while all getters are called on the worker
59 // thread. signalWorkerThread() must be called before any getters are called. 62 // thread. signalWorkerThread() must be called before any getters are called.
60 class ThreadableWebSocketChannelSyncHelper : public ThreadSafeRefCountedWillBeGa rbageCollectedFinalized<ThreadableWebSocketChannelSyncHelper> { 63 class ThreadableWebSocketChannelSyncHelper : public ThreadSafeRefCountedWillBeGa rbageCollectedFinalized<ThreadableWebSocketChannelSyncHelper> {
61 public: 64 public:
62 static PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelSyncHelper> create(P assOwnPtr<blink::WebWaitableEvent> event) 65 static PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelSyncHelper> create(P assOwnPtr<blink::WebWaitableEvent> event)
63 { 66 {
64 return adoptRefWillBeNoop(new ThreadableWebSocketChannelSyncHelper(event )); 67 return adoptRefWillBeNoop(new ThreadableWebSocketChannelSyncHelper(event ));
65 } 68 }
66 69
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 } 195 }
193 196
194 void WorkerThreadableWebSocketChannel::trace(Visitor* visitor) 197 void WorkerThreadableWebSocketChannel::trace(Visitor* visitor)
195 { 198 {
196 visitor->trace(m_bridge); 199 visitor->trace(m_bridge);
197 visitor->trace(m_workerClientWrapper); 200 visitor->trace(m_workerClientWrapper);
198 WebSocketChannel::trace(visitor); 201 WebSocketChannel::trace(visitor);
199 } 202 }
200 203
201 #if ENABLE(OILPAN) 204 #if ENABLE(OILPAN)
202 WorkerThreadableWebSocketChannel::Peer::Peer(RawPtr<ThreadableWebSocketChannelCl ientWrapper> clientWrapper, WorkerLoaderProxy& loaderProxy, ExecutionContext* co ntext, const String& sourceURL, unsigned lineNumber, RawPtr<ThreadableWebSocketC hannelSyncHelper> syncHelper) 205 Peer::Peer(RawPtr<ThreadableWebSocketChannelClientWrapper> clientWrapper, Worker LoaderProxy& loaderProxy, ExecutionContext* context, const String& sourceURL, un signed lineNumber, RawPtr<ThreadableWebSocketChannelSyncHelper> syncHelper)
203 #else 206 #else
204 WorkerThreadableWebSocketChannel::Peer::Peer(PassRefPtr<WeakReference<Peer> > re ference, PassRefPtr<ThreadableWebSocketChannelClientWrapper> clientWrapper, Work erLoaderProxy& loaderProxy, ExecutionContext* context, const String& sourceURL, unsigned lineNumber, PassRefPtr<ThreadableWebSocketChannelSyncHelper> syncHelper ) 207 Peer::Peer(PassRefPtr<WeakReference<Peer> > reference, PassRefPtr<ThreadableWebS ocketChannelClientWrapper> clientWrapper, WorkerLoaderProxy& loaderProxy, Execut ionContext* context, const String& sourceURL, unsigned lineNumber, PassRefPtr<Th readableWebSocketChannelSyncHelper> syncHelper)
205 #endif 208 #endif
206 : m_workerClientWrapper(clientWrapper) 209 : m_workerClientWrapper(clientWrapper)
207 , m_loaderProxy(loaderProxy) 210 , m_loaderProxy(loaderProxy)
208 , m_mainWebSocketChannel(nullptr) 211 , m_mainWebSocketChannel(nullptr)
209 , m_syncHelper(syncHelper) 212 , m_syncHelper(syncHelper)
210 #if ENABLE(OILPAN) 213 #if ENABLE(OILPAN)
211 , m_keepAlive(this) 214 , m_keepAlive(this)
212 #else 215 #else
213 , m_weakFactory(reference, this) 216 , m_weakFactory(reference, this)
214 #endif 217 #endif
215 { 218 {
216 ASSERT(isMainThread()); 219 ASSERT(isMainThread());
217 ASSERT(m_workerClientWrapper.get()); 220 ASSERT(m_workerClientWrapper.get());
218 221
219 Document* document = toDocument(context); 222 Document* document = toDocument(context);
220 if (RuntimeEnabledFeatures::experimentalWebSocketEnabled()) { 223 if (RuntimeEnabledFeatures::experimentalWebSocketEnabled()) {
221 m_mainWebSocketChannel = NewWebSocketChannelImpl::create(document, this, sourceURL, lineNumber); 224 m_mainWebSocketChannel = NewWebSocketChannelImpl::create(document, this, sourceURL, lineNumber);
222 } else { 225 } else {
223 m_mainWebSocketChannel = MainThreadWebSocketChannel::create(document, th is, sourceURL, lineNumber); 226 m_mainWebSocketChannel = MainThreadWebSocketChannel::create(document, th is, sourceURL, lineNumber);
224 } 227 }
225 } 228 }
226 229
227 WorkerThreadableWebSocketChannel::Peer::~Peer() 230 Peer::~Peer()
228 { 231 {
229 ASSERT(isMainThread()); 232 ASSERT(isMainThread());
230 } 233 }
231 234
232 #if ENABLE(OILPAN) 235 #if ENABLE(OILPAN)
233 void WorkerThreadableWebSocketChannel::Peer::initialize(ExecutionContext* contex t, WeakMember<Peer>* reference, WorkerLoaderProxy* loaderProxy, RawPtr<Threadabl eWebSocketChannelClientWrapper> clientWrapper, const String& sourceURLAtConnecti on, unsigned lineNumberAtConnection, RawPtr<ThreadableWebSocketChannelSyncHelper > syncHelper) 236 void Peer::initialize(ExecutionContext* context, WeakMember<Peer>* reference, Wo rkerLoaderProxy* loaderProxy, RawPtr<ThreadableWebSocketChannelClientWrapper> cl ientWrapper, const String& sourceURLAtConnection, unsigned lineNumberAtConnectio n, RawPtr<ThreadableWebSocketChannelSyncHelper> syncHelper)
234 { 237 {
235 // The caller must call destroy() to free the peer. 238 // The caller must call destroy() to free the peer.
236 *reference = new Peer(clientWrapper, *loaderProxy, context, sourceURLAtConne ction, lineNumberAtConnection, syncHelper); 239 *reference = new Peer(clientWrapper, *loaderProxy, context, sourceURLAtConne ction, lineNumberAtConnection, syncHelper);
237 syncHelper->signalWorkerThread(); 240 syncHelper->signalWorkerThread();
238 } 241 }
239 #else 242 #else
240 void WorkerThreadableWebSocketChannel::Peer::initialize(ExecutionContext* contex t, PassRefPtr<WeakReference<Peer> > reference, WorkerLoaderProxy* loaderProxy, P assRefPtr<ThreadableWebSocketChannelClientWrapper> clientWrapper, const String& sourceURLAtConnection, unsigned lineNumberAtConnection, PassRefPtr<ThreadableWeb SocketChannelSyncHelper> prpSyncHelper) 243 void Peer::initialize(ExecutionContext* context, PassRefPtr<WeakReference<Peer> > reference, WorkerLoaderProxy* loaderProxy, PassRefPtr<ThreadableWebSocketChann elClientWrapper> clientWrapper, const String& sourceURLAtConnection, unsigned li neNumberAtConnection, PassRefPtr<ThreadableWebSocketChannelSyncHelper> prpSyncHe lper)
241 { 244 {
242 RefPtr<ThreadableWebSocketChannelSyncHelper> syncHelper = prpSyncHelper; 245 RefPtr<ThreadableWebSocketChannelSyncHelper> syncHelper = prpSyncHelper;
243 // The caller must call destroy() to free the peer. 246 // The caller must call destroy() to free the peer.
244 new Peer(reference, clientWrapper, *loaderProxy, context, sourceURLAtConnect ion, lineNumberAtConnection, syncHelper); 247 new Peer(reference, clientWrapper, *loaderProxy, context, sourceURLAtConnect ion, lineNumberAtConnection, syncHelper);
245 syncHelper->signalWorkerThread(); 248 syncHelper->signalWorkerThread();
246 } 249 }
247 #endif 250 #endif
248 251
249 void WorkerThreadableWebSocketChannel::Peer::destroy() 252 void Peer::destroy()
250 { 253 {
251 ASSERT(isMainThread()); 254 ASSERT(isMainThread());
252 disconnect(); 255 disconnect();
253 256
254 #if ENABLE(OILPAN) 257 #if ENABLE(OILPAN)
255 m_keepAlive = nullptr; 258 m_keepAlive = nullptr;
256 m_syncHelper->signalWorkerThread(); 259 m_syncHelper->signalWorkerThread();
257 m_syncHelper = nullptr; 260 m_syncHelper = nullptr;
258 #else 261 #else
259 delete this; 262 delete this;
260 #endif 263 #endif
261 } 264 }
262 265
263 void WorkerThreadableWebSocketChannel::Peer::connect(const KURL& url, const Stri ng& protocol) 266 void Peer::connect(const KURL& url, const String& protocol)
264 { 267 {
265 ASSERT(isMainThread()); 268 ASSERT(isMainThread());
266 ASSERT(m_syncHelper); 269 ASSERT(m_syncHelper);
267 if (!m_mainWebSocketChannel) { 270 if (!m_mainWebSocketChannel) {
268 m_syncHelper->setConnectRequestResult(false); 271 m_syncHelper->setConnectRequestResult(false);
269 } else { 272 } else {
270 bool connectRequestResult = m_mainWebSocketChannel->connect(url, protoco l); 273 bool connectRequestResult = m_mainWebSocketChannel->connect(url, protoco l);
271 m_syncHelper->setConnectRequestResult(connectRequestResult); 274 m_syncHelper->setConnectRequestResult(connectRequestResult);
272 } 275 }
273 m_syncHelper->signalWorkerThread(); 276 m_syncHelper->signalWorkerThread();
274 } 277 }
275 278
276 void WorkerThreadableWebSocketChannel::Peer::send(const String& message) 279 void Peer::send(const String& message)
277 { 280 {
278 ASSERT(isMainThread()); 281 ASSERT(isMainThread());
279 ASSERT(m_syncHelper); 282 ASSERT(m_syncHelper);
280 if (!m_mainWebSocketChannel) { 283 if (!m_mainWebSocketChannel) {
281 m_syncHelper->setSendRequestResult(WebSocketChannel::SendFail); 284 m_syncHelper->setSendRequestResult(WebSocketChannel::SendFail);
282 } else { 285 } else {
283 WebSocketChannel::SendResult sendRequestResult = m_mainWebSocketChannel- >send(message); 286 WebSocketChannel::SendResult sendRequestResult = m_mainWebSocketChannel- >send(message);
284 m_syncHelper->setSendRequestResult(sendRequestResult); 287 m_syncHelper->setSendRequestResult(sendRequestResult);
285 } 288 }
286 m_syncHelper->signalWorkerThread(); 289 m_syncHelper->signalWorkerThread();
287 } 290 }
288 291
289 void WorkerThreadableWebSocketChannel::Peer::sendArrayBuffer(PassOwnPtr<Vector<c har> > data) 292 void Peer::sendArrayBuffer(PassOwnPtr<Vector<char> > data)
290 { 293 {
291 ASSERT(isMainThread()); 294 ASSERT(isMainThread());
292 ASSERT(m_syncHelper); 295 ASSERT(m_syncHelper);
293 if (!m_mainWebSocketChannel) { 296 if (!m_mainWebSocketChannel) {
294 m_syncHelper->setSendRequestResult(WebSocketChannel::SendFail); 297 m_syncHelper->setSendRequestResult(WebSocketChannel::SendFail);
295 } else { 298 } else {
296 WebSocketChannel::SendResult sendRequestResult = m_mainWebSocketChannel- >send(data); 299 WebSocketChannel::SendResult sendRequestResult = m_mainWebSocketChannel- >send(data);
297 m_syncHelper->setSendRequestResult(sendRequestResult); 300 m_syncHelper->setSendRequestResult(sendRequestResult);
298 } 301 }
299 m_syncHelper->signalWorkerThread(); 302 m_syncHelper->signalWorkerThread();
300 } 303 }
301 304
302 void WorkerThreadableWebSocketChannel::Peer::sendBlob(PassRefPtr<BlobDataHandle> blobData) 305 void Peer::sendBlob(PassRefPtr<BlobDataHandle> blobData)
303 { 306 {
304 ASSERT(isMainThread()); 307 ASSERT(isMainThread());
305 ASSERT(m_syncHelper); 308 ASSERT(m_syncHelper);
306 if (!m_mainWebSocketChannel) { 309 if (!m_mainWebSocketChannel) {
307 m_syncHelper->setSendRequestResult(WebSocketChannel::SendFail); 310 m_syncHelper->setSendRequestResult(WebSocketChannel::SendFail);
308 } else { 311 } else {
309 WebSocketChannel::SendResult sendRequestResult = m_mainWebSocketChannel- >send(blobData); 312 WebSocketChannel::SendResult sendRequestResult = m_mainWebSocketChannel- >send(blobData);
310 m_syncHelper->setSendRequestResult(sendRequestResult); 313 m_syncHelper->setSendRequestResult(sendRequestResult);
311 } 314 }
312 m_syncHelper->signalWorkerThread(); 315 m_syncHelper->signalWorkerThread();
313 } 316 }
314 317
315 void WorkerThreadableWebSocketChannel::Peer::close(int code, const String& reaso n) 318 void Peer::close(int code, const String& reason)
316 { 319 {
317 ASSERT(isMainThread()); 320 ASSERT(isMainThread());
318 ASSERT(m_syncHelper); 321 ASSERT(m_syncHelper);
319 if (!m_mainWebSocketChannel) 322 if (!m_mainWebSocketChannel)
320 return; 323 return;
321 m_mainWebSocketChannel->close(code, reason); 324 m_mainWebSocketChannel->close(code, reason);
322 } 325 }
323 326
324 void WorkerThreadableWebSocketChannel::Peer::fail(const String& reason, MessageL evel level, const String& sourceURL, unsigned lineNumber) 327 void Peer::fail(const String& reason, MessageLevel level, const String& sourceUR L, unsigned lineNumber)
325 { 328 {
326 ASSERT(isMainThread()); 329 ASSERT(isMainThread());
327 ASSERT(m_syncHelper); 330 ASSERT(m_syncHelper);
328 if (!m_mainWebSocketChannel) 331 if (!m_mainWebSocketChannel)
329 return; 332 return;
330 m_mainWebSocketChannel->fail(reason, level, sourceURL, lineNumber); 333 m_mainWebSocketChannel->fail(reason, level, sourceURL, lineNumber);
331 } 334 }
332 335
333 void WorkerThreadableWebSocketChannel::Peer::disconnect() 336 void Peer::disconnect()
334 { 337 {
335 ASSERT(isMainThread()); 338 ASSERT(isMainThread());
336 ASSERT(m_syncHelper); 339 ASSERT(m_syncHelper);
337 if (!m_mainWebSocketChannel) 340 if (!m_mainWebSocketChannel)
338 return; 341 return;
339 m_mainWebSocketChannel->disconnect(); 342 m_mainWebSocketChannel->disconnect();
340 m_mainWebSocketChannel = nullptr; 343 m_mainWebSocketChannel = nullptr;
341 } 344 }
342 345
343 static void workerGlobalScopeDidConnect(ExecutionContext* context, PassRefPtrWil lBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, const St ring& subprotocol, const String& extensions) 346 static void workerGlobalScopeDidConnect(ExecutionContext* context, PassRefPtrWil lBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, const St ring& subprotocol, const String& extensions)
344 { 347 {
345 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); 348 ASSERT_UNUSED(context, context->isWorkerGlobalScope());
346 workerClientWrapper->didConnect(subprotocol, extensions); 349 workerClientWrapper->didConnect(subprotocol, extensions);
347 } 350 }
348 351
349 void WorkerThreadableWebSocketChannel::Peer::didConnect(const String& subprotoco l, const String& extensions) 352 void Peer::didConnect(const String& subprotocol, const String& extensions)
350 { 353 {
351 ASSERT(isMainThread()); 354 ASSERT(isMainThread());
352 // It is important to seprate task creation from posting 355 // It is important to seprate task creation from posting
353 // the task. See the above comment. 356 // the task. See the above comment.
354 OwnPtr<ExecutionContextTask> task = createCrossThreadTask(&workerGlobalScope DidConnect, m_workerClientWrapper.get(), subprotocol, extensions); 357 OwnPtr<ExecutionContextTask> task = createCrossThreadTask(&workerGlobalScope DidConnect, m_workerClientWrapper.get(), subprotocol, extensions);
355 m_loaderProxy.postTaskToWorkerGlobalScope(task.release()); 358 m_loaderProxy.postTaskToWorkerGlobalScope(task.release());
356 } 359 }
357 360
358 static void workerGlobalScopeDidReceiveMessage(ExecutionContext* context, PassRe fPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, c onst String& message) 361 static void workerGlobalScopeDidReceiveMessage(ExecutionContext* context, PassRe fPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, c onst String& message)
359 { 362 {
360 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); 363 ASSERT_UNUSED(context, context->isWorkerGlobalScope());
361 workerClientWrapper->didReceiveMessage(message); 364 workerClientWrapper->didReceiveMessage(message);
362 } 365 }
363 366
364 void WorkerThreadableWebSocketChannel::Peer::didReceiveMessage(const String& mes sage) 367 void Peer::didReceiveMessage(const String& message)
365 { 368 {
366 ASSERT(isMainThread()); 369 ASSERT(isMainThread());
367 // It is important to seprate task creation from posting 370 // It is important to seprate task creation from posting
368 // the task. See the above comment. 371 // the task. See the above comment.
369 OwnPtr<ExecutionContextTask> task = createCrossThreadTask(&workerGlobalScope DidReceiveMessage, m_workerClientWrapper.get(), message); 372 OwnPtr<ExecutionContextTask> task = createCrossThreadTask(&workerGlobalScope DidReceiveMessage, m_workerClientWrapper.get(), message);
370 m_loaderProxy.postTaskToWorkerGlobalScope(task.release()); 373 m_loaderProxy.postTaskToWorkerGlobalScope(task.release());
371 } 374 }
372 375
373 static void workerGlobalScopeDidReceiveBinaryData(ExecutionContext* context, Pas sRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper , PassOwnPtr<Vector<char> > binaryData) 376 static void workerGlobalScopeDidReceiveBinaryData(ExecutionContext* context, Pas sRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper , PassOwnPtr<Vector<char> > binaryData)
374 { 377 {
375 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); 378 ASSERT_UNUSED(context, context->isWorkerGlobalScope());
376 workerClientWrapper->didReceiveBinaryData(binaryData); 379 workerClientWrapper->didReceiveBinaryData(binaryData);
377 } 380 }
378 381
379 void WorkerThreadableWebSocketChannel::Peer::didReceiveBinaryData(PassOwnPtr<Vec tor<char> > binaryData) 382 void Peer::didReceiveBinaryData(PassOwnPtr<Vector<char> > binaryData)
380 { 383 {
381 ASSERT(isMainThread()); 384 ASSERT(isMainThread());
382 // It is important to seprate task creation from posting 385 // It is important to seprate task creation from posting
383 // the task. See the above comment. 386 // the task. See the above comment.
384 OwnPtr<ExecutionContextTask> task = createCrossThreadTask(&workerGlobalScope DidReceiveBinaryData, m_workerClientWrapper.get(), binaryData); 387 OwnPtr<ExecutionContextTask> task = createCrossThreadTask(&workerGlobalScope DidReceiveBinaryData, m_workerClientWrapper.get(), binaryData);
385 m_loaderProxy.postTaskToWorkerGlobalScope(task.release()); 388 m_loaderProxy.postTaskToWorkerGlobalScope(task.release());
386 } 389 }
387 390
388 static void workerGlobalScopeDidConsumeBufferedAmount(ExecutionContext* context, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWra pper, unsigned long consumed) 391 static void workerGlobalScopeDidConsumeBufferedAmount(ExecutionContext* context, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWra pper, unsigned long consumed)
389 { 392 {
390 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); 393 ASSERT_UNUSED(context, context->isWorkerGlobalScope());
391 workerClientWrapper->didConsumeBufferedAmount(consumed); 394 workerClientWrapper->didConsumeBufferedAmount(consumed);
392 } 395 }
393 396
394 void WorkerThreadableWebSocketChannel::Peer::didConsumeBufferedAmount(unsigned l ong consumed) 397 void Peer::didConsumeBufferedAmount(unsigned long consumed)
395 { 398 {
396 ASSERT(isMainThread()); 399 ASSERT(isMainThread());
397 // It is important to seprate task creation from posting 400 // It is important to seprate task creation from posting
398 // the task. See the above comment. 401 // the task. See the above comment.
399 OwnPtr<ExecutionContextTask> task = createCrossThreadTask(&workerGlobalScope DidConsumeBufferedAmount, m_workerClientWrapper.get(), consumed); 402 OwnPtr<ExecutionContextTask> task = createCrossThreadTask(&workerGlobalScope DidConsumeBufferedAmount, m_workerClientWrapper.get(), consumed);
400 m_loaderProxy.postTaskToWorkerGlobalScope(task.release()); 403 m_loaderProxy.postTaskToWorkerGlobalScope(task.release());
401 } 404 }
402 405
403 static void workerGlobalScopeDidStartClosingHandshake(ExecutionContext* context, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWra pper) 406 static void workerGlobalScopeDidStartClosingHandshake(ExecutionContext* context, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWra pper)
404 { 407 {
405 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); 408 ASSERT_UNUSED(context, context->isWorkerGlobalScope());
406 workerClientWrapper->didStartClosingHandshake(); 409 workerClientWrapper->didStartClosingHandshake();
407 } 410 }
408 411
409 void WorkerThreadableWebSocketChannel::Peer::didStartClosingHandshake() 412 void Peer::didStartClosingHandshake()
410 { 413 {
411 ASSERT(isMainThread()); 414 ASSERT(isMainThread());
412 // It is important to seprate task creation from posting 415 // It is important to seprate task creation from posting
413 // the task. See the above comment. 416 // the task. See the above comment.
414 OwnPtr<ExecutionContextTask> task = createCrossThreadTask(&workerGlobalScope DidStartClosingHandshake, m_workerClientWrapper.get()); 417 OwnPtr<ExecutionContextTask> task = createCrossThreadTask(&workerGlobalScope DidStartClosingHandshake, m_workerClientWrapper.get());
415 m_loaderProxy.postTaskToWorkerGlobalScope(task.release()); 418 m_loaderProxy.postTaskToWorkerGlobalScope(task.release());
416 } 419 }
417 420
418 static void workerGlobalScopeDidClose(ExecutionContext* context, PassRefPtrWillB eRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, WebSocketC hannelClient::ClosingHandshakeCompletionStatus closingHandshakeCompletion, unsig ned short code, const String& reason) 421 static void workerGlobalScopeDidClose(ExecutionContext* context, PassRefPtrWillB eRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, WebSocketC hannelClient::ClosingHandshakeCompletionStatus closingHandshakeCompletion, unsig ned short code, const String& reason)
419 { 422 {
420 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); 423 ASSERT_UNUSED(context, context->isWorkerGlobalScope());
421 workerClientWrapper->didClose(closingHandshakeCompletion, code, reason); 424 workerClientWrapper->didClose(closingHandshakeCompletion, code, reason);
422 } 425 }
423 426
424 void WorkerThreadableWebSocketChannel::Peer::didClose(ClosingHandshakeCompletion Status closingHandshakeCompletion, unsigned short code, const String& reason) 427 void Peer::didClose(ClosingHandshakeCompletionStatus closingHandshakeCompletion, unsigned short code, const String& reason)
425 { 428 {
426 ASSERT(isMainThread()); 429 ASSERT(isMainThread());
427 m_mainWebSocketChannel = nullptr; 430 m_mainWebSocketChannel = nullptr;
428 // It is important to seprate task creation from posting 431 // It is important to seprate task creation from posting
429 // the task. See the above comment. 432 // the task. See the above comment.
430 OwnPtr<ExecutionContextTask> task = createCrossThreadTask(&workerGlobalScope DidClose, m_workerClientWrapper.get(), closingHandshakeCompletion, code, reason) ; 433 OwnPtr<ExecutionContextTask> task = createCrossThreadTask(&workerGlobalScope DidClose, m_workerClientWrapper.get(), closingHandshakeCompletion, code, reason) ;
431 m_loaderProxy.postTaskToWorkerGlobalScope(task.release()); 434 m_loaderProxy.postTaskToWorkerGlobalScope(task.release());
432 } 435 }
433 436
434 static void workerGlobalScopeDidReceiveMessageError(ExecutionContext* context, P assRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapp er) 437 static void workerGlobalScopeDidReceiveMessageError(ExecutionContext* context, P assRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapp er)
435 { 438 {
436 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); 439 ASSERT_UNUSED(context, context->isWorkerGlobalScope());
437 workerClientWrapper->didReceiveMessageError(); 440 workerClientWrapper->didReceiveMessageError();
438 } 441 }
439 442
440 void WorkerThreadableWebSocketChannel::Peer::didReceiveMessageError() 443 void Peer::didReceiveMessageError()
441 { 444 {
442 ASSERT(isMainThread()); 445 ASSERT(isMainThread());
443 // It is important to seprate task creation from posting 446 // It is important to seprate task creation from posting
444 // the task. See the above comment. 447 // the task. See the above comment.
445 OwnPtr<ExecutionContextTask> task = createCrossThreadTask(&workerGlobalScope DidReceiveMessageError, m_workerClientWrapper.get()); 448 OwnPtr<ExecutionContextTask> task = createCrossThreadTask(&workerGlobalScope DidReceiveMessageError, m_workerClientWrapper.get());
446 m_loaderProxy.postTaskToWorkerGlobalScope(task.release()); 449 m_loaderProxy.postTaskToWorkerGlobalScope(task.release());
447 } 450 }
448 451
449 void WorkerThreadableWebSocketChannel::Peer::trace(Visitor* visitor) 452 void Peer::trace(Visitor* visitor)
450 { 453 {
451 visitor->trace(m_workerClientWrapper); 454 visitor->trace(m_workerClientWrapper);
452 visitor->trace(m_mainWebSocketChannel); 455 visitor->trace(m_mainWebSocketChannel);
453 visitor->trace(m_syncHelper); 456 visitor->trace(m_syncHelper);
454 WebSocketChannelClient::trace(visitor); 457 WebSocketChannelClient::trace(visitor);
455 } 458 }
456 459
457 WorkerThreadableWebSocketChannel::Bridge::Bridge(PassRefPtrWillBeRawPtr<Threadab leWebSocketChannelClientWrapper> workerClientWrapper, WorkerGlobalScope& workerG lobalScope) 460 Bridge::Bridge(PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> w orkerClientWrapper, WorkerGlobalScope& workerGlobalScope)
458 : m_workerClientWrapper(workerClientWrapper) 461 : m_workerClientWrapper(workerClientWrapper)
459 , m_workerGlobalScope(workerGlobalScope) 462 , m_workerGlobalScope(workerGlobalScope)
460 , m_loaderProxy(m_workerGlobalScope->thread()->workerLoaderProxy()) 463 , m_loaderProxy(m_workerGlobalScope->thread()->workerLoaderProxy())
461 , m_syncHelper(nullptr) 464 , m_syncHelper(nullptr)
462 , m_peer(nullptr) 465 , m_peer(nullptr)
463 { 466 {
464 ASSERT(m_workerClientWrapper.get()); 467 ASSERT(m_workerClientWrapper.get());
465 } 468 }
466 469
467 WorkerThreadableWebSocketChannel::Bridge::~Bridge() 470 Bridge::~Bridge()
468 { 471 {
469 ASSERT(hasTerminatedPeer()); 472 ASSERT(hasTerminatedPeer());
470 } 473 }
471 474
472 void WorkerThreadableWebSocketChannel::Bridge::initialize(const String& sourceUR L, unsigned lineNumber) 475 void Bridge::initialize(const String& sourceURL, unsigned lineNumber)
473 { 476 {
474 #if !ENABLE(OILPAN) 477 #if !ENABLE(OILPAN)
475 RefPtr<WeakReference<Peer> > reference = WeakReference<Peer>::createUnbound( ); 478 RefPtr<WeakReference<Peer> > reference = WeakReference<Peer>::createUnbound( );
476 m_peer = WeakPtr<Peer>(reference); 479 m_peer = WeakPtr<Peer>(reference);
477 #endif 480 #endif
478 481
479 RefPtrWillBeRawPtr<ThreadableWebSocketChannelSyncHelper> syncHelper = Thread ableWebSocketChannelSyncHelper::create(adoptPtr(blink::Platform::current()->crea teWaitableEvent())); 482 RefPtrWillBeRawPtr<ThreadableWebSocketChannelSyncHelper> syncHelper = Thread ableWebSocketChannelSyncHelper::create(adoptPtr(blink::Platform::current()->crea teWaitableEvent()));
480 // This pointer is guaranteed to be valid until we call terminatePeer. 483 // This pointer is guaranteed to be valid until we call terminatePeer.
481 m_syncHelper = syncHelper.get(); 484 m_syncHelper = syncHelper.get();
482 485
483 RefPtrWillBeRawPtr<Bridge> protect(this); 486 RefPtrWillBeRawPtr<Bridge> protect(this);
484 #if ENABLE(OILPAN) 487 #if ENABLE(OILPAN)
485 // In order to assure all temporary objects to be destroyed before 488 // In order to assure all temporary objects to be destroyed before
486 // posting the task, we separate task creation and posting. 489 // posting the task, we separate task creation and posting.
487 // In other words, it is dangerous to have a complicated expression 490 // In other words, it is dangerous to have a complicated expression
488 // as a waitForMethodCompletion argument. 491 // as a waitForMethodCompletion argument.
489 OwnPtr<ExecutionContextTask> task = createCrossThreadTask(&Peer::initialize, &m_peer, AllowCrossThreadAccess(&m_loaderProxy), m_workerClientWrapper.get(), s ourceURL, lineNumber, syncHelper.get()); 492 OwnPtr<ExecutionContextTask> task = createCrossThreadTask(&Peer::initialize, &m_peer, AllowCrossThreadAccess(&m_loaderProxy), m_workerClientWrapper.get(), s ourceURL, lineNumber, syncHelper.get());
490 #else 493 #else
491 // See the above comment. 494 // See the above comment.
492 OwnPtr<ExecutionContextTask> task = createCrossThreadTask(&Peer::initialize, reference, AllowCrossThreadAccess(&m_loaderProxy), m_workerClientWrapper.get(), sourceURL, lineNumber, syncHelper.get()); 495 OwnPtr<ExecutionContextTask> task = createCrossThreadTask(&Peer::initialize, reference, AllowCrossThreadAccess(&m_loaderProxy), m_workerClientWrapper.get(), sourceURL, lineNumber, syncHelper.get());
493 #endif 496 #endif
494 if (!waitForMethodCompletion(task.release())) { 497 if (!waitForMethodCompletion(task.release())) {
495 // The worker thread has been signalled to shutdown before method comple tion. 498 // The worker thread has been signalled to shutdown before method comple tion.
496 disconnect(); 499 disconnect();
497 } 500 }
498 } 501 }
499 502
500 bool WorkerThreadableWebSocketChannel::Bridge::connect(const KURL& url, const St ring& protocol) 503 bool Bridge::connect(const KURL& url, const String& protocol)
501 { 504 {
502 if (hasTerminatedPeer()) 505 if (hasTerminatedPeer())
503 return false; 506 return false;
504 507
505 RefPtrWillBeRawPtr<Bridge> protect(this); 508 RefPtrWillBeRawPtr<Bridge> protect(this);
506 if (!waitForMethodCompletion(createCrossThreadTask(&Peer::connect, m_peer, u rl, protocol))) 509 if (!waitForMethodCompletion(createCrossThreadTask(&Peer::connect, m_peer, u rl, protocol)))
507 return false; 510 return false;
508 511
509 return m_syncHelper->connectRequestResult(); 512 return m_syncHelper->connectRequestResult();
510 } 513 }
511 514
512 WebSocketChannel::SendResult WorkerThreadableWebSocketChannel::Bridge::send(cons t String& message) 515 WebSocketChannel::SendResult Bridge::send(const String& message)
513 { 516 {
514 if (hasTerminatedPeer()) 517 if (hasTerminatedPeer())
515 return WebSocketChannel::SendFail; 518 return WebSocketChannel::SendFail;
516 519
517 RefPtrWillBeRawPtr<Bridge> protect(this); 520 RefPtrWillBeRawPtr<Bridge> protect(this);
518 if (!waitForMethodCompletion(createCrossThreadTask(&Peer::send, m_peer, mess age))) 521 if (!waitForMethodCompletion(createCrossThreadTask(&Peer::send, m_peer, mess age)))
519 return WebSocketChannel::SendFail; 522 return WebSocketChannel::SendFail;
520 523
521 return m_syncHelper->sendRequestResult(); 524 return m_syncHelper->sendRequestResult();
522 } 525 }
523 526
524 WebSocketChannel::SendResult WorkerThreadableWebSocketChannel::Bridge::send(cons t ArrayBuffer& binaryData, unsigned byteOffset, unsigned byteLength) 527 WebSocketChannel::SendResult Bridge::send(const ArrayBuffer& binaryData, unsigne d byteOffset, unsigned byteLength)
525 { 528 {
526 if (hasTerminatedPeer()) 529 if (hasTerminatedPeer())
527 return WebSocketChannel::SendFail; 530 return WebSocketChannel::SendFail;
528 531
529 // ArrayBuffer isn't thread-safe, hence the content of ArrayBuffer is copied into Vector<char>. 532 // ArrayBuffer isn't thread-safe, hence the content of ArrayBuffer is copied into Vector<char>.
530 OwnPtr<Vector<char> > data = adoptPtr(new Vector<char>(byteLength)); 533 OwnPtr<Vector<char> > data = adoptPtr(new Vector<char>(byteLength));
531 if (binaryData.byteLength()) 534 if (binaryData.byteLength())
532 memcpy(data->data(), static_cast<const char*>(binaryData.data()) + byteO ffset, byteLength); 535 memcpy(data->data(), static_cast<const char*>(binaryData.data()) + byteO ffset, byteLength);
533 536
534 RefPtrWillBeRawPtr<Bridge> protect(this); 537 RefPtrWillBeRawPtr<Bridge> protect(this);
535 if (!waitForMethodCompletion(createCrossThreadTask(&Peer::sendArrayBuffer, m _peer, data.release()))) 538 if (!waitForMethodCompletion(createCrossThreadTask(&Peer::sendArrayBuffer, m _peer, data.release())))
536 return WebSocketChannel::SendFail; 539 return WebSocketChannel::SendFail;
537 540
538 return m_syncHelper->sendRequestResult(); 541 return m_syncHelper->sendRequestResult();
539 } 542 }
540 543
541 WebSocketChannel::SendResult WorkerThreadableWebSocketChannel::Bridge::send(Pass RefPtr<BlobDataHandle> data) 544 WebSocketChannel::SendResult Bridge::send(PassRefPtr<BlobDataHandle> data)
542 { 545 {
543 if (hasTerminatedPeer()) 546 if (hasTerminatedPeer())
544 return WebSocketChannel::SendFail; 547 return WebSocketChannel::SendFail;
545 548
546 RefPtrWillBeRawPtr<Bridge> protect(this); 549 RefPtrWillBeRawPtr<Bridge> protect(this);
547 if (!waitForMethodCompletion(createCrossThreadTask(&Peer::sendBlob, m_peer, data))) 550 if (!waitForMethodCompletion(createCrossThreadTask(&Peer::sendBlob, m_peer, data)))
548 return WebSocketChannel::SendFail; 551 return WebSocketChannel::SendFail;
549 552
550 return m_syncHelper->sendRequestResult(); 553 return m_syncHelper->sendRequestResult();
551 } 554 }
552 555
553 void WorkerThreadableWebSocketChannel::Bridge::close(int code, const String& rea son) 556 void Bridge::close(int code, const String& reason)
554 { 557 {
555 if (hasTerminatedPeer()) 558 if (hasTerminatedPeer())
556 return; 559 return;
557 560
558 m_loaderProxy.postTaskToLoader(createCrossThreadTask(&Peer::close, m_peer, c ode, reason)); 561 m_loaderProxy.postTaskToLoader(createCrossThreadTask(&Peer::close, m_peer, c ode, reason));
559 } 562 }
560 563
561 void WorkerThreadableWebSocketChannel::Bridge::fail(const String& reason, Messag eLevel level, const String& sourceURL, unsigned lineNumber) 564 void Bridge::fail(const String& reason, MessageLevel level, const String& source URL, unsigned lineNumber)
562 { 565 {
563 if (hasTerminatedPeer()) 566 if (hasTerminatedPeer())
564 return; 567 return;
565 568
566 m_loaderProxy.postTaskToLoader(createCrossThreadTask(&Peer::fail, m_peer, re ason, level, sourceURL, lineNumber)); 569 m_loaderProxy.postTaskToLoader(createCrossThreadTask(&Peer::fail, m_peer, re ason, level, sourceURL, lineNumber));
567 } 570 }
568 571
569 void WorkerThreadableWebSocketChannel::Bridge::disconnect() 572 void Bridge::disconnect()
570 { 573 {
571 if (hasTerminatedPeer()) 574 if (hasTerminatedPeer())
572 return; 575 return;
573 576
574 clearClientWrapper(); 577 clearClientWrapper();
575 terminatePeer(); 578 terminatePeer();
576 } 579 }
577 580
578 void WorkerThreadableWebSocketChannel::Bridge::clearClientWrapper() 581 void Bridge::clearClientWrapper()
579 { 582 {
580 m_workerClientWrapper->clearClient(); 583 m_workerClientWrapper->clearClient();
581 } 584 }
582 585
583 // Caller of this function should hold a reference to the bridge, because this f unction may call WebSocket::didClose() in the end, 586 // Caller of this function should hold a reference to the bridge, because this f unction may call WebSocket::didClose() in the end,
584 // which causes the bridge to get disconnected from the WebSocket and deleted if there is no other reference. 587 // which causes the bridge to get disconnected from the WebSocket and deleted if there is no other reference.
585 bool WorkerThreadableWebSocketChannel::Bridge::waitForMethodCompletion(PassOwnPt r<ExecutionContextTask> task) 588 bool Bridge::waitForMethodCompletion(PassOwnPtr<ExecutionContextTask> task)
586 { 589 {
587 ASSERT(m_workerGlobalScope); 590 ASSERT(m_workerGlobalScope);
588 ASSERT(m_syncHelper); 591 ASSERT(m_syncHelper);
589 592
590 m_loaderProxy.postTaskToLoader(task); 593 m_loaderProxy.postTaskToLoader(task);
591 594
592 // We wait for the syncHelper event even if a shutdown event is fired. 595 // We wait for the syncHelper event even if a shutdown event is fired.
593 // See https://codereview.chromium.org/267323004/#msg43 for why we need to w ait this. 596 // See https://codereview.chromium.org/267323004/#msg43 for why we need to w ait this.
594 Vector<blink::WebWaitableEvent*> events; 597 Vector<blink::WebWaitableEvent*> events;
595 events.append(m_syncHelper->event()); 598 events.append(m_syncHelper->event());
596 ThreadState::SafePointScope scope(ThreadState::HeapPointersOnStack); 599 ThreadState::SafePointScope scope(ThreadState::HeapPointersOnStack);
597 blink::Platform::current()->waitMultipleEvents(events); 600 blink::Platform::current()->waitMultipleEvents(events);
598 // This is checking whether a shutdown event is fired or not. 601 // This is checking whether a shutdown event is fired or not.
599 return !m_workerGlobalScope->thread()->terminated(); 602 return !m_workerGlobalScope->thread()->terminated();
600 } 603 }
601 604
602 void WorkerThreadableWebSocketChannel::Bridge::terminatePeer() 605 void Bridge::terminatePeer()
603 { 606 {
604 ASSERT(!hasTerminatedPeer()); 607 ASSERT(!hasTerminatedPeer());
605 608
606 #if ENABLE(OILPAN) 609 #if ENABLE(OILPAN)
607 // The worker thread has to wait for the main thread to complete Peer::destr oy, 610 // The worker thread has to wait for the main thread to complete Peer::destr oy,
608 // because the worker thread has to make sure that the main thread does not have any 611 // because the worker thread has to make sure that the main thread does not have any
609 // references to on-heap objects allocated in the thread heap of the worker thread 612 // references to on-heap objects allocated in the thread heap of the worker thread
610 // before the worker thread shuts down. 613 // before the worker thread shuts down.
611 waitForMethodCompletion(createCrossThreadTask(&Peer::destroy, m_peer)); 614 waitForMethodCompletion(createCrossThreadTask(&Peer::destroy, m_peer));
612 #else 615 #else
613 m_loaderProxy.postTaskToLoader(createCrossThreadTask(&Peer::destroy, m_peer) ); 616 m_loaderProxy.postTaskToLoader(createCrossThreadTask(&Peer::destroy, m_peer) );
614 #endif 617 #endif
615 618
616 // Peer::destroy() deletes m_peer and then m_syncHelper will be released. 619 // Peer::destroy() deletes m_peer and then m_syncHelper will be released.
617 // We must not touch m_syncHelper any more. 620 // We must not touch m_syncHelper any more.
618 m_syncHelper = nullptr; 621 m_syncHelper = nullptr;
619 622
620 // We won't use this any more. 623 // We won't use this any more.
621 m_workerGlobalScope = nullptr; 624 m_workerGlobalScope = nullptr;
622 } 625 }
623 626
624 void WorkerThreadableWebSocketChannel::Bridge::trace(Visitor* visitor) 627 void Bridge::trace(Visitor* visitor)
625 { 628 {
626 visitor->trace(m_workerClientWrapper); 629 visitor->trace(m_workerClientWrapper);
627 visitor->trace(m_workerGlobalScope); 630 visitor->trace(m_workerGlobalScope);
628 visitor->trace(m_syncHelper); 631 visitor->trace(m_syncHelper);
629 visitor->trace(m_peer); 632 visitor->trace(m_peer);
630 } 633 }
631 634
632 } // namespace blink 635 } // namespace blink
OLDNEW
« no previous file with comments | « Source/modules/websockets/WorkerThreadableWebSocketChannel.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698