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

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

Issue 14657008: Make websocket error messages look better at the devtools console. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 7 years, 7 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 14 matching lines...) Expand all
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */ 29 */
30 30
31 #include "config.h" 31 #include "config.h"
32 32
33 #include "modules/websockets/WorkerThreadableWebSocketChannel.h" 33 #include "modules/websockets/WorkerThreadableWebSocketChannel.h"
34 34
35 #include "RuntimeEnabledFeatures.h"
36 #include "bindings/v8/ScriptCallStackFactory.h"
35 #include "core/dom/CrossThreadTask.h" 37 #include "core/dom/CrossThreadTask.h"
36 #include "core/dom/Document.h" 38 #include "core/dom/Document.h"
37 #include "core/dom/ScriptExecutionContext.h" 39 #include "core/dom/ScriptExecutionContext.h"
38 #include "core/fileapi/Blob.h" 40 #include "core/fileapi/Blob.h"
39 #include "RuntimeEnabledFeatures.h" 41 #include "core/inspector/ScriptCallFrame.h"
42 #include "core/inspector/ScriptCallStack.h"
40 #include "core/workers/WorkerContext.h" 43 #include "core/workers/WorkerContext.h"
41 #include "core/workers/WorkerLoaderProxy.h" 44 #include "core/workers/WorkerLoaderProxy.h"
42 #include "core/workers/WorkerRunLoop.h" 45 #include "core/workers/WorkerRunLoop.h"
43 #include "core/workers/WorkerThread.h" 46 #include "core/workers/WorkerThread.h"
44 #include "modules/websockets/MainThreadWebSocketChannel.h" 47 #include "modules/websockets/MainThreadWebSocketChannel.h"
45 #include "modules/websockets/ThreadableWebSocketChannelClientWrapper.h" 48 #include "modules/websockets/ThreadableWebSocketChannelClientWrapper.h"
46 #include "modules/websockets/WebSocketChannel.h" 49 #include "modules/websockets/WebSocketChannel.h"
47 #include "modules/websockets/WebSocketChannelClient.h" 50 #include "modules/websockets/WebSocketChannelClient.h"
48 #include "wtf/ArrayBuffer.h" 51 #include "wtf/ArrayBuffer.h"
49 #include "wtf/MainThread.h" 52 #include "wtf/MainThread.h"
50 #include "wtf/PassRefPtr.h" 53 #include "wtf/PassRefPtr.h"
51 #include "wtf/text/WTFString.h" 54 #include "wtf/text/WTFString.h"
52 55
53 namespace WebCore { 56 namespace WebCore {
54 57
55 WorkerThreadableWebSocketChannel::WorkerThreadableWebSocketChannel(WorkerContext * context, WebSocketChannelClient* client, const String& taskMode) 58 WorkerThreadableWebSocketChannel::WorkerThreadableWebSocketChannel(WorkerContext * context, WebSocketChannelClient* client, const String& taskMode)
56 : m_workerContext(context) 59 : m_workerContext(context)
57 , m_workerClientWrapper(ThreadableWebSocketChannelClientWrapper::create(cont ext, client)) 60 , m_workerClientWrapper(ThreadableWebSocketChannelClientWrapper::create(cont ext, client))
58 , m_bridge(Bridge::create(m_workerClientWrapper, m_workerContext, taskMode)) 61 , m_bridge(Bridge::create(m_workerClientWrapper, m_workerContext, taskMode))
62 , m_callFrameAtConnection("", "", 0)
59 { 63 {
60 m_bridge->initialize(); 64 // We assume that we can take the JS callstack at WebSocket connection here.
65 ScriptCallFrame frame("", "", 0);
66 RefPtr<ScriptCallStack> callStack = createScriptCallStack(1, true);
67 if (callStack && callStack->size() > 0)
68 frame = callStack->at(0);
69 m_bridge->initialize(frame);
61 } 70 }
62 71
63 WorkerThreadableWebSocketChannel::~WorkerThreadableWebSocketChannel() 72 WorkerThreadableWebSocketChannel::~WorkerThreadableWebSocketChannel()
64 { 73 {
65 if (m_bridge) 74 if (m_bridge)
66 m_bridge->disconnect(); 75 m_bridge->disconnect();
67 } 76 }
68 77
69 void WorkerThreadableWebSocketChannel::connect(const KURL& url, const String& pr otocol) 78 void WorkerThreadableWebSocketChannel::connect(const KURL& url, const String& pr otocol)
70 { 79 {
80 RefPtr<ScriptCallStack> callstack = createScriptCallStack(1, true);
81 m_callFrameAtConnection = (callstack && callstack->size() > 0) ? callstack-> at(0) : ScriptCallFrame("", "", 0);
71 if (m_bridge) 82 if (m_bridge)
72 m_bridge->connect(url, protocol); 83 m_bridge->connect(url, protocol);
73 } 84 }
74 85
75 String WorkerThreadableWebSocketChannel::subprotocol() 86 String WorkerThreadableWebSocketChannel::subprotocol()
76 { 87 {
77 ASSERT(m_workerClientWrapper); 88 ASSERT(m_workerClientWrapper);
78 return m_workerClientWrapper->subprotocol(); 89 return m_workerClientWrapper->subprotocol();
79 } 90 }
80 91
(...skipping 30 matching lines...) Expand all
111 return 0; 122 return 0;
112 return m_bridge->bufferedAmount(); 123 return m_bridge->bufferedAmount();
113 } 124 }
114 125
115 void WorkerThreadableWebSocketChannel::close(int code, const String& reason) 126 void WorkerThreadableWebSocketChannel::close(int code, const String& reason)
116 { 127 {
117 if (m_bridge) 128 if (m_bridge)
118 m_bridge->close(code, reason); 129 m_bridge->close(code, reason);
119 } 130 }
120 131
121 void WorkerThreadableWebSocketChannel::fail(const String& reason) 132 void WorkerThreadableWebSocketChannel::fail(const String& reason, MessageLevel l evel, PassOwnPtr<CallStackWrapper> callStack)
122 { 133 {
123 if (m_bridge) 134 if (m_bridge)
124 m_bridge->fail(reason); 135 m_bridge->fail(reason, level, callStack);
136 }
137
138 void WorkerThreadableWebSocketChannel::fail(const String& reason, MessageLevel l evel)
139 {
140 RefPtr<ScriptCallStack> callStack = createScriptCallStack(ScriptCallStack::m axCallStackSizeToCapture, true);
141 if (!callStack || !callStack->size()) {
142 Vector<ScriptCallFrame> frames;
143 frames.append(m_callFrameAtConnection);
144 callStack = ScriptCallStack::create(frames);
145 }
146 Vector<ScriptCallFrame> frames;
147 for (size_t i = 0; i < callStack->size(); ++i)
148 frames.append(callStack->at(i));
149 fail(reason, level, adoptPtr<CallStackWrapper>(callStack ? new CallStackWrap per(frames) : 0));
125 } 150 }
126 151
127 void WorkerThreadableWebSocketChannel::disconnect() 152 void WorkerThreadableWebSocketChannel::disconnect()
128 { 153 {
129 m_bridge->disconnect(); 154 m_bridge->disconnect();
130 m_bridge.clear(); 155 m_bridge.clear();
131 } 156 }
132 157
133 void WorkerThreadableWebSocketChannel::suspend() 158 void WorkerThreadableWebSocketChannel::suspend()
134 { 159 {
135 m_workerClientWrapper->suspend(); 160 m_workerClientWrapper->suspend();
136 if (m_bridge) 161 if (m_bridge)
137 m_bridge->suspend(); 162 m_bridge->suspend();
138 } 163 }
139 164
140 void WorkerThreadableWebSocketChannel::resume() 165 void WorkerThreadableWebSocketChannel::resume()
141 { 166 {
142 m_workerClientWrapper->resume(); 167 m_workerClientWrapper->resume();
143 if (m_bridge) 168 if (m_bridge)
144 m_bridge->resume(); 169 m_bridge->resume();
145 } 170 }
146 171
147 WorkerThreadableWebSocketChannel::Peer::Peer(PassRefPtr<ThreadableWebSocketChann elClientWrapper> clientWrapper, WorkerLoaderProxy& loaderProxy, ScriptExecutionC ontext* context, const String& taskMode) 172 WorkerThreadableWebSocketChannel::Peer::Peer(PassRefPtr<ThreadableWebSocketChann elClientWrapper> clientWrapper, WorkerLoaderProxy& loaderProxy, ScriptExecutionC ontext* context, const String& taskMode, const ScriptCallFrame& frame)
148 : m_workerClientWrapper(clientWrapper) 173 : m_workerClientWrapper(clientWrapper)
149 , m_loaderProxy(loaderProxy) 174 , m_loaderProxy(loaderProxy)
150 , m_mainWebSocketChannel(0) 175 , m_mainWebSocketChannel(0)
151 , m_taskMode(taskMode) 176 , m_taskMode(taskMode)
152 { 177 {
153 if (RuntimeEnabledFeatures::experimentalWebSocketEnabled()) { 178 if (RuntimeEnabledFeatures::experimentalWebSocketEnabled()) {
154 // FIXME: Create an "experimental" WebSocketChannel instead of a MainThr eadWebSocketChannel. 179 // FIXME: Create an "experimental" WebSocketChannel instead of a MainThr eadWebSocketChannel.
155 m_mainWebSocketChannel = MainThreadWebSocketChannel::create(toDocument(c ontext), this); 180 m_mainWebSocketChannel = MainThreadWebSocketChannel::create(toDocument(c ontext), this, frame);
156 } else 181 } else
157 m_mainWebSocketChannel = MainThreadWebSocketChannel::create(toDocument(c ontext), this); 182 m_mainWebSocketChannel = MainThreadWebSocketChannel::create(toDocument(c ontext), this, frame);
158 ASSERT(isMainThread()); 183 ASSERT(isMainThread());
159 } 184 }
160 185
161 WorkerThreadableWebSocketChannel::Peer::~Peer() 186 WorkerThreadableWebSocketChannel::Peer::~Peer()
162 { 187 {
163 ASSERT(isMainThread()); 188 ASSERT(isMainThread());
164 if (m_mainWebSocketChannel) 189 if (m_mainWebSocketChannel)
165 m_mainWebSocketChannel->disconnect(); 190 m_mainWebSocketChannel->disconnect();
166 } 191 }
167 192
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 } 247 }
223 248
224 void WorkerThreadableWebSocketChannel::Peer::close(int code, const String& reaso n) 249 void WorkerThreadableWebSocketChannel::Peer::close(int code, const String& reaso n)
225 { 250 {
226 ASSERT(isMainThread()); 251 ASSERT(isMainThread());
227 if (!m_mainWebSocketChannel) 252 if (!m_mainWebSocketChannel)
228 return; 253 return;
229 m_mainWebSocketChannel->close(code, reason); 254 m_mainWebSocketChannel->close(code, reason);
230 } 255 }
231 256
232 void WorkerThreadableWebSocketChannel::Peer::fail(const String& reason) 257 void WorkerThreadableWebSocketChannel::Peer::fail(const String& reason, MessageL evel level, PassOwnPtr<CallStackWrapper> callStack)
233 { 258 {
234 ASSERT(isMainThread()); 259 ASSERT(isMainThread());
235 if (!m_mainWebSocketChannel) 260 if (!m_mainWebSocketChannel)
236 return; 261 return;
237 m_mainWebSocketChannel->fail(reason); 262 m_mainWebSocketChannel->fail(reason, level, callStack);
238 } 263 }
239 264
240 void WorkerThreadableWebSocketChannel::Peer::disconnect() 265 void WorkerThreadableWebSocketChannel::Peer::disconnect()
241 { 266 {
242 ASSERT(isMainThread()); 267 ASSERT(isMainThread());
243 if (!m_mainWebSocketChannel) 268 if (!m_mainWebSocketChannel)
244 return; 269 return;
245 m_mainWebSocketChannel->disconnect(); 270 m_mainWebSocketChannel->disconnect();
246 m_mainWebSocketChannel = 0; 271 m_mainWebSocketChannel = 0;
247 } 272 }
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
359 ASSERT(m_workerClientWrapper.get()); 384 ASSERT(m_workerClientWrapper.get());
360 } 385 }
361 386
362 WorkerThreadableWebSocketChannel::Bridge::~Bridge() 387 WorkerThreadableWebSocketChannel::Bridge::~Bridge()
363 { 388 {
364 disconnect(); 389 disconnect();
365 } 390 }
366 391
367 class WorkerThreadableWebSocketChannel::WorkerContextDidInitializeTask : public ScriptExecutionContext::Task { 392 class WorkerThreadableWebSocketChannel::WorkerContextDidInitializeTask : public ScriptExecutionContext::Task {
368 public: 393 public:
369 static PassOwnPtr<ScriptExecutionContext::Task> create(WorkerThreadableWebSo cketChannel::Peer* peer, 394 static PassOwnPtr<ScriptExecutionContext::Task> create(WorkerThreadableWebSo cketChannel::Peer* peer, WorkerLoaderProxy* loaderProxy, PassRefPtr<ThreadableWe bSocketChannelClientWrapper> workerClientWrapper)
370 WorkerLoaderProxy* lo aderProxy,
371 PassRefPtr<Threadable WebSocketChannelClientWrapper> workerClientWrapper)
372 { 395 {
373 return adoptPtr(new WorkerContextDidInitializeTask(peer, loaderProxy, wo rkerClientWrapper)); 396 return adoptPtr(new WorkerContextDidInitializeTask(peer, loaderProxy, wo rkerClientWrapper));
374 } 397 }
375 398
376 virtual ~WorkerContextDidInitializeTask() { } 399 virtual ~WorkerContextDidInitializeTask() { }
377 virtual void performTask(ScriptExecutionContext* context) OVERRIDE 400 virtual void performTask(ScriptExecutionContext* context) OVERRIDE
378 { 401 {
379 ASSERT_UNUSED(context, context->isWorkerContext()); 402 ASSERT_UNUSED(context, context->isWorkerContext());
380 if (m_workerClientWrapper->failedWebSocketChannelCreation()) { 403 if (m_workerClientWrapper->failedWebSocketChannelCreation()) {
381 // If Bridge::initialize() quitted earlier, we need to kick mainThre adDestroy() to delete the peer. 404 // If Bridge::initialize() quitted earlier, we need to kick mainThre adDestroy() to delete the peer.
382 OwnPtr<WorkerThreadableWebSocketChannel::Peer> peer = adoptPtr(m_pee r); 405 OwnPtr<WorkerThreadableWebSocketChannel::Peer> peer = adoptPtr(m_pee r);
383 m_peer = 0; 406 m_peer = 0;
384 m_loaderProxy->postTaskToLoader(createCallbackTask(&WorkerThreadable WebSocketChannel::mainThreadDestroy, peer.release())); 407 m_loaderProxy->postTaskToLoader(createCallbackTask(&WorkerThreadable WebSocketChannel::mainThreadDestroy, peer.release()));
385 } else 408 } else
386 m_workerClientWrapper->didCreateWebSocketChannel(m_peer); 409 m_workerClientWrapper->didCreateWebSocketChannel(m_peer);
387 } 410 }
388 virtual bool isCleanupTask() const OVERRIDE { return true; } 411 virtual bool isCleanupTask() const OVERRIDE { return true; }
389 412
390 private: 413 private:
391 WorkerContextDidInitializeTask(WorkerThreadableWebSocketChannel::Peer* peer, 414 WorkerContextDidInitializeTask(WorkerThreadableWebSocketChannel::Peer* peer, WorkerLoaderProxy* loaderProxy, PassRefPtr<ThreadableWebSocketChannelClientWrap per> workerClientWrapper)
392 WorkerLoaderProxy* loaderProxy,
393 PassRefPtr<ThreadableWebSocketChannelClientWr apper> workerClientWrapper)
394 : m_peer(peer) 415 : m_peer(peer)
395 , m_loaderProxy(loaderProxy) 416 , m_loaderProxy(loaderProxy)
396 , m_workerClientWrapper(workerClientWrapper) 417 , m_workerClientWrapper(workerClientWrapper)
397 { 418 {
398 } 419 }
399 420
400 WorkerThreadableWebSocketChannel::Peer* m_peer; 421 WorkerThreadableWebSocketChannel::Peer* m_peer;
401 WorkerLoaderProxy* m_loaderProxy; 422 WorkerLoaderProxy* m_loaderProxy;
402 RefPtr<ThreadableWebSocketChannelClientWrapper> m_workerClientWrapper; 423 RefPtr<ThreadableWebSocketChannelClientWrapper> m_workerClientWrapper;
403 }; 424 };
404 425
405 void WorkerThreadableWebSocketChannel::Bridge::mainThreadInitialize(ScriptExecut ionContext* context, WorkerLoaderProxy* loaderProxy, PassRefPtr<ThreadableWebSoc ketChannelClientWrapper> prpClientWrapper, const String& taskMode) 426 void WorkerThreadableWebSocketChannel::Bridge::mainThreadInitialize(ScriptExecut ionContext* context, WorkerLoaderProxy* loaderProxy, PassRefPtr<ThreadableWebSoc ketChannelClientWrapper> prpClientWrapper, const String& taskMode, const String& sourceURL, unsigned lineNumber)
406 { 427 {
407 ASSERT(isMainThread()); 428 ASSERT(isMainThread());
408 ASSERT_UNUSED(context, context->isDocument()); 429 ASSERT_UNUSED(context, context->isDocument());
409 430
410 RefPtr<ThreadableWebSocketChannelClientWrapper> clientWrapper = prpClientWra pper; 431 RefPtr<ThreadableWebSocketChannelClientWrapper> clientWrapper = prpClientWra pper;
411 432
412 Peer* peer = Peer::create(clientWrapper, *loaderProxy, context, taskMode); 433 Peer* peer = Peer::create(clientWrapper, *loaderProxy, context, taskMode, Sc riptCallFrame("", sourceURL, lineNumber));
413 bool sent = loaderProxy->postTaskForModeToWorkerContext( 434 bool sent = loaderProxy->postTaskForModeToWorkerContext(
414 WorkerThreadableWebSocketChannel::WorkerContextDidInitializeTask::create (peer, loaderProxy, clientWrapper), taskMode); 435 WorkerThreadableWebSocketChannel::WorkerContextDidInitializeTask::create (peer, loaderProxy, clientWrapper), taskMode);
415 if (!sent) { 436 if (!sent) {
416 clientWrapper->clearPeer(); 437 clientWrapper->clearPeer();
417 delete peer; 438 delete peer;
418 } 439 }
419 } 440 }
420 441
421 void WorkerThreadableWebSocketChannel::Bridge::initialize() 442 void WorkerThreadableWebSocketChannel::Bridge::initialize(const ScriptCallFrame& frame)
422 { 443 {
423 ASSERT(!m_peer); 444 ASSERT(!m_peer);
424 setMethodNotCompleted(); 445 setMethodNotCompleted();
425 RefPtr<Bridge> protect(this); 446 RefPtr<Bridge> protect(this);
426 m_loaderProxy.postTaskToLoader( 447 m_loaderProxy.postTaskToLoader(
427 createCallbackTask(&Bridge::mainThreadInitialize, 448 createCallbackTask(&Bridge::mainThreadInitialize, AllowCrossThreadAccess (&m_loaderProxy), m_workerClientWrapper, m_taskMode, frame.sourceURL(), frame.li neNumber()));
428 AllowCrossThreadAccess(&m_loaderProxy), m_workerClien tWrapper, m_taskMode));
429 waitForMethodCompletion(); 449 waitForMethodCompletion();
430 // m_peer may be null when the nested runloop exited before a peer has creat ed. 450 // m_peer may be null when the nested runloop exited before a peer has creat ed.
431 m_peer = m_workerClientWrapper->peer(); 451 m_peer = m_workerClientWrapper->peer();
432 if (!m_peer) 452 if (!m_peer)
433 m_workerClientWrapper->setFailedWebSocketChannelCreation(); 453 m_workerClientWrapper->setFailedWebSocketChannelCreation();
434 } 454 }
435 455
436 void WorkerThreadableWebSocketChannel::mainThreadConnect(ScriptExecutionContext* context, Peer* peer, const KURL& url, const String& protocol) 456 void WorkerThreadableWebSocketChannel::mainThreadConnect(ScriptExecutionContext* context, Peer* peer, const KURL& url, const String& protocol)
437 { 457 {
438 ASSERT(isMainThread()); 458 ASSERT(isMainThread());
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
557 peer->close(code, reason); 577 peer->close(code, reason);
558 } 578 }
559 579
560 void WorkerThreadableWebSocketChannel::Bridge::close(int code, const String& rea son) 580 void WorkerThreadableWebSocketChannel::Bridge::close(int code, const String& rea son)
561 { 581 {
562 if (!m_peer) 582 if (!m_peer)
563 return; 583 return;
564 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocket Channel::mainThreadClose, AllowCrossThreadAccess(m_peer), code, reason)); 584 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocket Channel::mainThreadClose, AllowCrossThreadAccess(m_peer), code, reason));
565 } 585 }
566 586
567 void WorkerThreadableWebSocketChannel::mainThreadFail(ScriptExecutionContext* co ntext, Peer* peer, const String& reason) 587 void WorkerThreadableWebSocketChannel::mainThreadFail(ScriptExecutionContext* co ntext, Peer* peer, const String& reason, MessageLevel level, PassOwnPtr<CallStac kWrapper> callStack)
568 { 588 {
569 ASSERT(isMainThread()); 589 ASSERT(isMainThread());
570 ASSERT_UNUSED(context, context->isDocument()); 590 ASSERT_UNUSED(context, context->isDocument());
571 ASSERT(peer); 591 ASSERT(peer);
572 592
573 peer->fail(reason); 593 peer->fail(reason, level, callStack);
574 } 594 }
575 595
576 void WorkerThreadableWebSocketChannel::Bridge::fail(const String& reason) 596 void WorkerThreadableWebSocketChannel::Bridge::fail(const String& reason, Messag eLevel level, PassOwnPtr<CallStackWrapper> callStack)
577 { 597 {
578 if (!m_peer) 598 if (!m_peer)
579 return; 599 return;
580 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocket Channel::mainThreadFail, AllowCrossThreadAccess(m_peer), reason)); 600 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocket Channel::mainThreadFail, AllowCrossThreadAccess(m_peer), reason, level, callStac k));
581 } 601 }
582 602
583 void WorkerThreadableWebSocketChannel::mainThreadDestroy(ScriptExecutionContext* context, PassOwnPtr<Peer> peer) 603 void WorkerThreadableWebSocketChannel::mainThreadDestroy(ScriptExecutionContext* context, PassOwnPtr<Peer> peer)
584 { 604 {
585 ASSERT(isMainThread()); 605 ASSERT(isMainThread());
586 ASSERT_UNUSED(context, context->isDocument()); 606 ASSERT_UNUSED(context, context->isDocument());
587 ASSERT_UNUSED(peer, peer); 607 ASSERT_UNUSED(peer, peer);
588 608
589 // Peer object will be deleted even if the task does not run in the main thr ead's cleanup period, because 609 // Peer object will be deleted even if the task does not run in the main thr ead's cleanup period, because
590 // the destructor for the task object (created by createCallbackTask()) will automatically delete the peer. 610 // the destructor for the task object (created by createCallbackTask()) will automatically delete the peer.
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
653 WorkerRunLoop& runLoop = m_workerContext->thread()->runLoop(); 673 WorkerRunLoop& runLoop = m_workerContext->thread()->runLoop();
654 MessageQueueWaitResult result = MessageQueueMessageReceived; 674 MessageQueueWaitResult result = MessageQueueMessageReceived;
655 ThreadableWebSocketChannelClientWrapper* clientWrapper = m_workerClientWrapp er.get(); 675 ThreadableWebSocketChannelClientWrapper* clientWrapper = m_workerClientWrapp er.get();
656 while (m_workerContext && clientWrapper && !clientWrapper->syncMethodDone() && result != MessageQueueTerminated) { 676 while (m_workerContext && clientWrapper && !clientWrapper->syncMethodDone() && result != MessageQueueTerminated) {
657 result = runLoop.runInMode(m_workerContext.get(), m_taskMode); // May ca use this bridge to get disconnected, which makes m_workerContext become null. 677 result = runLoop.runInMode(m_workerContext.get(), m_taskMode); // May ca use this bridge to get disconnected, which makes m_workerContext become null.
658 clientWrapper = m_workerClientWrapper.get(); 678 clientWrapper = m_workerClientWrapper.get();
659 } 679 }
660 } 680 }
661 681
662 } // namespace WebCore 682 } // namespace WebCore
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