Changeset 113138 in webkit
- Timestamp:
- Apr 3, 2012, 10:00:54 PM (14 years ago)
- Location:
- trunk
- Files:
-
- 4 added
- 15 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/http/tests/websocket/tests/hybi/workers/resources/worker-reload-iframe.html (added)
-
LayoutTests/http/tests/websocket/tests/hybi/workers/resources/worker-reload.js (added)
-
LayoutTests/http/tests/websocket/tests/hybi/workers/worker-reload-expected.txt (added)
-
LayoutTests/http/tests/websocket/tests/hybi/workers/worker-reload.html (added)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/Modules/websockets/ThreadableWebSocketChannelClientWrapper.cpp (modified) (2 diffs)
-
Source/WebCore/Modules/websockets/ThreadableWebSocketChannelClientWrapper.h (modified) (3 diffs)
-
Source/WebCore/Modules/websockets/WorkerThreadableWebSocketChannel.cpp (modified) (13 diffs)
-
Source/WebCore/Modules/websockets/WorkerThreadableWebSocketChannel.h (modified) (5 diffs)
-
Source/WebCore/workers/DefaultSharedWorkerRepository.cpp (modified) (2 diffs)
-
Source/WebCore/workers/WorkerLoaderProxy.h (modified) (1 diff)
-
Source/WebCore/workers/WorkerMessagingProxy.cpp (modified) (1 diff)
-
Source/WebCore/workers/WorkerMessagingProxy.h (modified) (1 diff)
-
Source/WebKit/chromium/ChangeLog (modified) (1 diff)
-
Source/WebKit/chromium/src/WebSharedWorkerImpl.cpp (modified) (1 diff)
-
Source/WebKit/chromium/src/WebSharedWorkerImpl.h (modified) (1 diff)
-
Source/WebKit/chromium/src/WebWorkerClientImpl.cpp (modified) (1 diff)
-
Source/WebKit/chromium/src/WebWorkerClientImpl.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r113137 r113138 1 2012-04-03 Yuta Kitamura <yutak@chromium.org> 2 3 Crash in WebCore::WorkerThreadableWebSocketChannel::Bridge::mainThreadCreateWebSocketChannel 4 https://bugs.webkit.org/show_bug.cgi?id=82873 5 6 Reviewed by David Levin. 7 8 * http/tests/websocket/tests/hybi/workers/resources/worker-reload-iframe.html: Added. 9 * http/tests/websocket/tests/hybi/workers/resources/worker-reload.js: Added. 10 * http/tests/websocket/tests/hybi/workers/worker-reload-expected.txt: Added. 11 * http/tests/websocket/tests/hybi/workers/worker-reload.html: Added. 12 1 13 2012-04-03 Keishi Hattori <keishi@webkit.org> 2 14 -
trunk/Source/WebCore/ChangeLog
r113137 r113138 1 2012-04-03 Yuta Kitamura <yutak@chromium.org> 2 3 Crash in WebCore::WorkerThreadableWebSocketChannel::Bridge::mainThreadCreateWebSocketChannel 4 https://bugs.webkit.org/show_bug.cgi?id=82873 5 6 Reviewed by David Levin. 7 8 WorkerThreadableWebSocketChannel::Bridge should properly handle the cases where inter-thread 9 callback is not called due to the termination of the worker run loop. Specifically, the bridge 10 should not send its "this" pointer to the main thread, because the bridge object may be freed 11 in the worker thread before the main thread starts to process. 12 13 Test: http/tests/websocket/tests/hybi/workers/worker-reload.html 14 15 * Modules/websockets/ThreadableWebSocketChannelClientWrapper.cpp: 16 (WebCore::ThreadableWebSocketChannelClientWrapper::ThreadableWebSocketChannelClientWrapper): 17 (WebCore::ThreadableWebSocketChannelClientWrapper::peer): 18 (WebCore::ThreadableWebSocketChannelClientWrapper::didCreateWebSocketChannel): 19 Renamed from setUseHixie76Protocol, as this funtion now also sets m_peer. 20 Sets m_syncMethodDone to true, because this function is called in the end of 21 synchronous wait of Bridge::initialize(). 22 (WebCore::ThreadableWebSocketChannelClientWrapper::clearPeer): 23 (WebCore::ThreadableWebSocketChannelClientWrapper::useHixie76Protocol): 24 * Modules/websockets/ThreadableWebSocketChannelClientWrapper.h: 25 Add WorkerThreadableWebSocketChannel::Peer which is initialized after the creation of 26 WebSocketChannel in the main thread. 27 (ThreadableWebSocketChannelClientWrapper): 28 * Modules/websockets/WorkerThreadableWebSocketChannel.cpp: 29 (WebCore::WorkerThreadableWebSocketChannel::WorkerThreadableWebSocketChannel): 30 Don't do synchronous wait in the constructor, as a member function may be called 31 during the wait before the constructor finishes. The meat of the constructor has 32 moved to initialize() function. 33 (WebCore::WorkerThreadableWebSocketChannel::Bridge::Bridge): 34 (WebCore::WorkerThreadableWebSocketChannel::Bridge::~Bridge): 35 (WorkerContextDidInitializeTask): 36 (WebCore::WorkerContextDidInitializeTask::create): 37 (WebCore::WorkerContextDidInitializeTask::~WorkerContextDidInitializeTask): 38 (WebCore::WorkerContextDidInitializeTask::WorkerContextDidInitializeTask): 39 (WebCore::WorkerThreadableWebSocketChannel::Bridge::mainThreadInitialize): 40 (WebCore::WorkerThreadableWebSocketChannel::Bridge::initialize): 41 Don't pass "this" object to the main thread. Receive the pointer to the peer object 42 via ThreadableWebSocketChannelClientWrapper which is ThreadSafeRefCounted<>. 43 (WebCore::WorkerThreadableWebSocketChannel::Bridge::connect): 44 m_peer may be NULL, and we should not do anything in that case. 45 (WebCore::WorkerThreadableWebSocketChannel::Bridge::send): 46 (WebCore::WorkerThreadableWebSocketChannel::Bridge::bufferedAmount): 47 (WebCore::WorkerThreadableWebSocketChannel::mainThreadClose): 48 (WebCore::WorkerThreadableWebSocketChannel::Bridge::close): 49 (WebCore::WorkerThreadableWebSocketChannel::Bridge::fail): 50 (WebCore::WorkerThreadableWebSocketChannel::Bridge::suspend): 51 (WebCore::WorkerThreadableWebSocketChannel::Bridge::resume): 52 * Modules/websockets/WorkerThreadableWebSocketChannel.h: 53 (WorkerThreadableWebSocketChannel): 54 (WebCore::WorkerThreadableWebSocketChannel::refThreadableWebSocketChannel): 55 (WebCore::WorkerThreadableWebSocketChannel::derefThreadableWebSocketChannel): 56 (Bridge): 57 * workers/DefaultSharedWorkerRepository.cpp: 58 (SharedWorkerProxy): 59 (WebCore::SharedWorkerProxy::postTaskForModeToWorkerContext): 60 * workers/WorkerLoaderProxy.h: 61 (WorkerLoaderProxy::postTaskForModeToWorkerContext): 62 Return bool to indicate whether postTask was successful or not. This is necessary 63 to avoid memory leaks of Peer object in Bridge::initialize() function. 64 * workers/WorkerMessagingProxy.cpp: 65 (WebCore::WorkerMessagingProxy::postTaskForModeToWorkerContext): 66 * workers/WorkerMessagingProxy.h: 67 (WorkerMessagingProxy): 68 1 69 2012-04-03 Keishi Hattori <keishi@webkit.org> 2 70 -
trunk/Source/WebCore/Modules/websockets/ThreadableWebSocketChannelClientWrapper.cpp
r110012 r113138 45 45 : m_context(context) 46 46 , m_client(client) 47 , m_peer(0) 47 48 , m_syncMethodDone(true) 48 49 , m_useHixie76Protocol(true) … … 73 74 } 74 75 76 WorkerThreadableWebSocketChannel::Peer* ThreadableWebSocketChannelClientWrapper::peer() const 77 { 78 return m_peer; 79 } 80 81 void ThreadableWebSocketChannelClientWrapper::didCreateWebSocketChannel(WorkerThreadableWebSocketChannel::Peer* peer, bool useHixie76Protocol) 82 { 83 m_peer = peer; 84 m_useHixie76Protocol = useHixie76Protocol; 85 m_syncMethodDone = true; 86 } 87 88 void ThreadableWebSocketChannelClientWrapper::clearPeer() 89 { 90 m_peer = 0; 91 } 92 75 93 bool ThreadableWebSocketChannelClientWrapper::useHixie76Protocol() const 76 94 { 77 95 return m_useHixie76Protocol; 78 }79 80 void ThreadableWebSocketChannelClientWrapper::setUseHixie76Protocol(bool useHixie76Protocol)81 {82 m_useHixie76Protocol = useHixie76Protocol;83 96 } 84 97 -
trunk/Source/WebCore/Modules/websockets/ThreadableWebSocketChannelClientWrapper.h
r110012 r113138 38 38 #include "ThreadableWebSocketChannel.h" 39 39 #include "WebSocketChannelClient.h" 40 #include "WorkerThreadableWebSocketChannel.h" 40 41 #include <wtf/Forward.h> 41 42 #include <wtf/OwnPtr.h> … … 57 58 bool syncMethodDone() const; 58 59 60 WorkerThreadableWebSocketChannel::Peer* peer() const; 61 void didCreateWebSocketChannel(WorkerThreadableWebSocketChannel::Peer*, bool useHixie76Protocol); 62 void clearPeer(); 63 59 64 // The value of useHixie76Protocol flag is cachable; this value is saved after WebSocketChannel (on the main 60 65 // thread) is constructed. 61 66 bool useHixie76Protocol() const; 62 void setUseHixie76Protocol(bool);63 67 64 68 // Subprotocol and extensions are cached too. Will be available when didConnect() callback is invoked. … … 101 105 ScriptExecutionContext* m_context; 102 106 WebSocketChannelClient* m_client; 107 WorkerThreadableWebSocketChannel::Peer* m_peer; 103 108 bool m_syncMethodDone; 104 109 bool m_useHixie76Protocol; -
trunk/Source/WebCore/Modules/websockets/WorkerThreadableWebSocketChannel.cpp
r110012 r113138 58 58 , m_bridge(Bridge::create(m_workerClientWrapper, m_workerContext, taskMode)) 59 59 { 60 m_bridge->initialize(); 60 61 } 61 62 … … 343 344 m_mainWebSocketChannel = 0; 344 345 m_loaderProxy.postTaskForModeToWorkerContext(createCallbackTask(&workerContextDidClose, m_workerClientWrapper, unhandledBufferedAmount, closingHandshakeCompletion, code, reason), m_taskMode); 345 }346 347 void WorkerThreadableWebSocketChannel::Bridge::setWebSocketChannel(ScriptExecutionContext* context, Bridge* thisPtr, Peer* peer, PassRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, bool useHixie76Protocol)348 {349 ASSERT_UNUSED(context, context->isWorkerContext());350 thisPtr->m_peer = peer;351 workerClientWrapper->setUseHixie76Protocol(useHixie76Protocol);352 workerClientWrapper->setSyncMethodDone();353 }354 355 void WorkerThreadableWebSocketChannel::Bridge::mainThreadCreateWebSocketChannel(ScriptExecutionContext* context, Bridge* thisPtr, PassRefPtr<ThreadableWebSocketChannelClientWrapper> prpClientWrapper, const String& taskMode)356 {357 ASSERT(isMainThread());358 ASSERT_UNUSED(context, context->isDocument());359 360 RefPtr<ThreadableWebSocketChannelClientWrapper> clientWrapper = prpClientWrapper;361 362 Peer* peer = Peer::create(clientWrapper, thisPtr->m_loaderProxy, context, taskMode);363 thisPtr->m_loaderProxy.postTaskForModeToWorkerContext(364 createCallbackTask(&Bridge::setWebSocketChannel,365 AllowCrossThreadAccess(thisPtr),366 AllowCrossThreadAccess(peer), clientWrapper, peer->useHixie76Protocol()), taskMode);367 346 } 368 347 … … 375 354 { 376 355 ASSERT(m_workerClientWrapper.get()); 356 } 357 358 WorkerThreadableWebSocketChannel::Bridge::~Bridge() 359 { 360 disconnect(); 361 } 362 363 class WorkerContextDidInitializeTask : public ScriptExecutionContext::Task { 364 public: 365 static PassOwnPtr<ScriptExecutionContext::Task> create(WorkerThreadableWebSocketChannel::Peer* peer, 366 PassRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, 367 bool useHixie76Protocol) 368 { 369 return adoptPtr(new WorkerContextDidInitializeTask(peer, workerClientWrapper, useHixie76Protocol)); 370 } 371 372 virtual ~WorkerContextDidInitializeTask() { } 373 virtual void performTask(ScriptExecutionContext* context) OVERRIDE 374 { 375 ASSERT_UNUSED(context, context->isWorkerContext()); 376 m_workerClientWrapper->didCreateWebSocketChannel(m_peer, m_useHixie76Protocol); 377 } 378 virtual bool isCleanupTask() const OVERRIDE { return true; } 379 380 private: 381 WorkerContextDidInitializeTask(WorkerThreadableWebSocketChannel::Peer* peer, 382 PassRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, 383 bool useHixie76Protocol) 384 : m_peer(peer) 385 , m_workerClientWrapper(workerClientWrapper) 386 , m_useHixie76Protocol(useHixie76Protocol) 387 { 388 } 389 390 WorkerThreadableWebSocketChannel::Peer* m_peer; 391 RefPtr<ThreadableWebSocketChannelClientWrapper> m_workerClientWrapper; 392 bool m_useHixie76Protocol; 393 }; 394 395 void WorkerThreadableWebSocketChannel::Bridge::mainThreadInitialize(ScriptExecutionContext* context, WorkerLoaderProxy* loaderProxy, PassRefPtr<ThreadableWebSocketChannelClientWrapper> prpClientWrapper, const String& taskMode) 396 { 397 ASSERT(isMainThread()); 398 ASSERT_UNUSED(context, context->isDocument()); 399 400 RefPtr<ThreadableWebSocketChannelClientWrapper> clientWrapper = prpClientWrapper; 401 402 Peer* peer = Peer::create(clientWrapper, *loaderProxy, context, taskMode); 403 bool sent = loaderProxy->postTaskForModeToWorkerContext( 404 WorkerContextDidInitializeTask::create(peer, clientWrapper, peer->useHixie76Protocol()), taskMode); 405 if (!sent) { 406 clientWrapper->clearPeer(); 407 delete peer; 408 } 409 } 410 411 void WorkerThreadableWebSocketChannel::Bridge::initialize() 412 { 413 ASSERT(!m_peer); 377 414 setMethodNotCompleted(); 415 RefPtr<Bridge> protect(this); 378 416 m_loaderProxy.postTaskToLoader( 379 createCallbackTask(&Bridge::mainThread CreateWebSocketChannel,380 AllowCrossThreadAccess( this), m_workerClientWrapper, m_taskMode));417 createCallbackTask(&Bridge::mainThreadInitialize, 418 AllowCrossThreadAccess(&m_loaderProxy), m_workerClientWrapper, m_taskMode)); 381 419 waitForMethodCompletion(); 382 ASSERT(m_peer); 383 } 384 385 WorkerThreadableWebSocketChannel::Bridge::~Bridge() 386 { 387 disconnect(); 420 // m_peer may be null when the nested runloop exited before a peer has created. 421 m_peer = m_workerClientWrapper->peer(); 388 422 } 389 423 … … 400 434 { 401 435 ASSERT(m_workerClientWrapper); 402 ASSERT(m_peer); 436 if (!m_peer) 437 return; 403 438 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocketChannel::mainThreadConnect, AllowCrossThreadAccess(m_peer), url, protocol)); 404 439 } … … 435 470 ThreadableWebSocketChannel::SendResult WorkerThreadableWebSocketChannel::Bridge::send(const String& message) 436 471 { 437 if (!m_workerClientWrapper) 438 return ThreadableWebSocketChannel::SendFail; 439 ASSERT(m_peer); 472 if (!m_workerClientWrapper || !m_peer) 473 return ThreadableWebSocketChannel::SendFail; 440 474 setMethodNotCompleted(); 441 475 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocketChannel::mainThreadSend, AllowCrossThreadAccess(m_peer), message)); … … 450 484 ThreadableWebSocketChannel::SendResult WorkerThreadableWebSocketChannel::Bridge::send(const ArrayBuffer& binaryData) 451 485 { 452 if (!m_workerClientWrapper) 453 return ThreadableWebSocketChannel::SendFail; 454 ASSERT(m_peer); 486 if (!m_workerClientWrapper || !m_peer) 487 return ThreadableWebSocketChannel::SendFail; 455 488 // ArrayBuffer isn't thread-safe, hence the content of ArrayBuffer is copied into Vector<char>. 456 489 OwnPtr<Vector<char> > data = adoptPtr(new Vector<char>(binaryData.byteLength())); … … 469 502 ThreadableWebSocketChannel::SendResult WorkerThreadableWebSocketChannel::Bridge::send(const Blob& binaryData) 470 503 { 471 if (!m_workerClientWrapper) 472 return ThreadableWebSocketChannel::SendFail; 473 ASSERT(m_peer); 504 if (!m_workerClientWrapper || !m_peer) 505 return ThreadableWebSocketChannel::SendFail; 474 506 setMethodNotCompleted(); 475 507 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocketChannel::mainThreadSendBlob, AllowCrossThreadAccess(m_peer), binaryData.url(), binaryData.type(), binaryData.size())); … … 493 525 unsigned long WorkerThreadableWebSocketChannel::Bridge::bufferedAmount() 494 526 { 495 if (!m_workerClientWrapper )527 if (!m_workerClientWrapper || !m_peer) 496 528 return 0; 497 ASSERT(m_peer);498 529 setMethodNotCompleted(); 499 530 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocketChannel::mainThreadBufferedAmount, AllowCrossThreadAccess(m_peer))); … … 506 537 } 507 538 508 void WorkerThreadableWebSocketChannel::mainThreadClose(ScriptExecutionContext* context, Peer* peer, int code, const String& reason)539 void WorkerThreadableWebSocketChannel::mainThreadClose(ScriptExecutionContext* context, Peer* peer, int code, const String& reason) 509 540 { 510 541 ASSERT(isMainThread()); … … 517 548 void WorkerThreadableWebSocketChannel::Bridge::close(int code, const String& reason) 518 549 { 519 ASSERT(m_peer); 550 if (!m_peer) 551 return; 520 552 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocketChannel::mainThreadClose, AllowCrossThreadAccess(m_peer), code, reason)); 521 553 } … … 532 564 void WorkerThreadableWebSocketChannel::Bridge::fail(const String& reason) 533 565 { 534 ASSERT(m_peer); 566 if (!m_peer) 567 return; 535 568 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocketChannel::mainThreadFail, AllowCrossThreadAccess(m_peer), reason)); 536 569 } … … 567 600 void WorkerThreadableWebSocketChannel::Bridge::suspend() 568 601 { 569 ASSERT(m_peer); 602 if (!m_peer) 603 return; 570 604 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocketChannel::mainThreadSuspend, AllowCrossThreadAccess(m_peer))); 571 605 } … … 582 616 void WorkerThreadableWebSocketChannel::Bridge::resume() 583 617 { 584 ASSERT(m_peer); 618 if (!m_peer) 619 return; 585 620 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocketChannel::mainThreadResume, AllowCrossThreadAccess(m_peer))); 586 621 } -
trunk/Source/WebCore/Modules/websockets/WorkerThreadableWebSocketChannel.h
r110012 r113138 37 37 #include "ThreadableWebSocketChannel.h" 38 38 #include "WebSocketChannelClient.h" 39 #include "WorkerContext.h" 39 40 40 41 #include <wtf/PassRefPtr.h> … … 76 77 virtual void resume() OVERRIDE; 77 78 78 using RefCounted<WorkerThreadableWebSocketChannel>::ref;79 using RefCounted<WorkerThreadableWebSocketChannel>::deref;80 81 protected:82 virtual void refThreadableWebSocketChannel() { ref(); }83 virtual void derefThreadableWebSocketChannel() { deref(); }84 85 private:86 79 // Generated by the bridge. The Peer and its bridge should have identical 87 80 // lifetimes. … … 124 117 }; 125 118 119 using RefCounted<WorkerThreadableWebSocketChannel>::ref; 120 using RefCounted<WorkerThreadableWebSocketChannel>::deref; 121 122 protected: 123 virtual void refThreadableWebSocketChannel() { ref(); } 124 virtual void derefThreadableWebSocketChannel() { deref(); } 125 126 private: 126 127 // Bridge for Peer. Running on the worker thread. 127 128 class Bridge : public RefCounted<Bridge> { … … 132 133 } 133 134 ~Bridge(); 135 void initialize(); 134 136 void connect(const KURL&, const String& protocol); 135 137 ThreadableWebSocketChannel::SendResult send(const String& message); … … 152 154 153 155 // Executed on the main thread to create a Peer for this bridge. 154 static void mainThread CreateWebSocketChannel(ScriptExecutionContext*, Bridge* thisPtr, PassRefPtr<ThreadableWebSocketChannelClientWrapper>, const String& taskMode);156 static void mainThreadInitialize(ScriptExecutionContext*, WorkerLoaderProxy*, PassRefPtr<ThreadableWebSocketChannelClientWrapper>, const String& taskMode); 155 157 156 158 // Executed on the worker context's thread. -
trunk/Source/WebCore/workers/DefaultSharedWorkerRepository.cpp
r110023 r113138 78 78 // WorkerLoaderProxy 79 79 virtual void postTaskToLoader(PassOwnPtr<ScriptExecutionContext::Task>); 80 virtual voidpostTaskForModeToWorkerContext(PassOwnPtr<ScriptExecutionContext::Task>, const String&);80 virtual bool postTaskForModeToWorkerContext(PassOwnPtr<ScriptExecutionContext::Task>, const String&); 81 81 82 82 // WorkerReportingProxy … … 152 152 } 153 153 154 voidSharedWorkerProxy::postTaskForModeToWorkerContext(PassOwnPtr<ScriptExecutionContext::Task> task, const String& mode)154 bool SharedWorkerProxy::postTaskForModeToWorkerContext(PassOwnPtr<ScriptExecutionContext::Task> task, const String& mode) 155 155 { 156 156 if (isClosing()) 157 return ;157 return false; 158 158 ASSERT(m_thread); 159 159 m_thread->runLoop().postTaskForMode(task, mode); 160 return true; 160 161 } 161 162 -
trunk/Source/WebCore/workers/WorkerLoaderProxy.h
r95901 r113138 54 54 // Posts callbacks from loading code to the WorkerContext. The 'mode' is used to differentiate 55 55 // specific synchronous loading requests so they can be 'nested', per spec. 56 virtual void postTaskForModeToWorkerContext(PassOwnPtr<ScriptExecutionContext::Task>, const String& mode) = 0; 56 // Returns true if the task was posted successfully. 57 virtual bool postTaskForModeToWorkerContext(PassOwnPtr<ScriptExecutionContext::Task>, const String& mode) = 0; 57 58 }; 58 59 -
trunk/Source/WebCore/workers/WorkerMessagingProxy.cpp
r108344 r113138 297 297 } 298 298 299 voidWorkerMessagingProxy::postTaskForModeToWorkerContext(PassOwnPtr<ScriptExecutionContext::Task> task, const String& mode)300 { 301 if (m_askedToTerminate) 302 return ;299 bool WorkerMessagingProxy::postTaskForModeToWorkerContext(PassOwnPtr<ScriptExecutionContext::Task> task, const String& mode) 300 { 301 if (m_askedToTerminate) 302 return false; 303 303 304 304 ASSERT(m_workerThread); 305 305 m_workerThread->runLoop().postTaskForMode(task, mode); 306 return true; 306 307 } 307 308 -
trunk/Source/WebCore/workers/WorkerMessagingProxy.h
r98237 r113138 83 83 // requests and to send callbacks back to WorkerContext. 84 84 virtual void postTaskToLoader(PassOwnPtr<ScriptExecutionContext::Task>); 85 virtual voidpostTaskForModeToWorkerContext(PassOwnPtr<ScriptExecutionContext::Task>, const String& mode);85 virtual bool postTaskForModeToWorkerContext(PassOwnPtr<ScriptExecutionContext::Task>, const String& mode); 86 86 87 87 void workerThreadCreated(PassRefPtr<DedicatedWorkerThread>); -
trunk/Source/WebKit/chromium/ChangeLog
r113116 r113138 1 2012-04-03 Yuta Kitamura <yutak@chromium.org> 2 3 Crash in WebCore::WorkerThreadableWebSocketChannel::Bridge::mainThreadCreateWebSocketChannel 4 https://bugs.webkit.org/show_bug.cgi?id=82873 5 6 Reviewed by David Levin. 7 8 Change the function signature of WorkerLoaderProxy::postTaskForModeToWorkerContext(). 9 10 * src/WebSharedWorkerImpl.cpp: 11 (WebKit::WebSharedWorkerImpl::postTaskForModeToWorkerContext): 12 * src/WebSharedWorkerImpl.h: 13 (WebSharedWorkerImpl): 14 * src/WebWorkerClientImpl.cpp: 15 (WebKit::WebWorkerClientImpl::postTaskForModeToWorkerContext): 16 * src/WebWorkerClientImpl.h: 17 (WebWorkerClientImpl): 18 1 19 2012-04-03 Ian Vollick <vollick@chromium.org> 2 20 -
trunk/Source/WebKit/chromium/src/WebSharedWorkerImpl.cpp
r108344 r113138 321 321 } 322 322 323 voidWebSharedWorkerImpl::postTaskForModeToWorkerContext(323 bool WebSharedWorkerImpl::postTaskForModeToWorkerContext( 324 324 PassOwnPtr<ScriptExecutionContext::Task> task, const String& mode) 325 325 { 326 326 m_workerThread->runLoop().postTaskForMode(task, mode); 327 return true; 327 328 } 328 329 -
trunk/Source/WebKit/chromium/src/WebSharedWorkerImpl.h
r105687 r113138 87 87 // WebCore::WorkerLoaderProxy methods: 88 88 virtual void postTaskToLoader(PassOwnPtr<WebCore::ScriptExecutionContext::Task>); 89 virtual voidpostTaskForModeToWorkerContext(89 virtual bool postTaskForModeToWorkerContext( 90 90 PassOwnPtr<WebCore::ScriptExecutionContext::Task>, const WTF::String& mode); 91 91 -
trunk/Source/WebKit/chromium/src/WebWorkerClientImpl.cpp
r109948 r113138 150 150 } 151 151 152 voidWebWorkerClientImpl::postTaskForModeToWorkerContext(PassOwnPtr<ScriptExecutionContext::Task> task, const String& mode)152 bool WebWorkerClientImpl::postTaskForModeToWorkerContext(PassOwnPtr<ScriptExecutionContext::Task> task, const String& mode) 153 153 { 154 154 m_proxy->postTaskForModeToWorkerContext(task, mode); 155 return true; 155 156 } 156 157 -
trunk/Source/WebKit/chromium/src/WebWorkerClientImpl.h
r109958 r113138 87 87 // WebCore::WorkerLoaderProxy methods: 88 88 virtual void postTaskToLoader(PassOwnPtr<WebCore::ScriptExecutionContext::Task>) OVERRIDE; 89 virtual voidpostTaskForModeToWorkerContext(PassOwnPtr<WebCore::ScriptExecutionContext::Task>, const String& mode) OVERRIDE;89 virtual bool postTaskForModeToWorkerContext(PassOwnPtr<WebCore::ScriptExecutionContext::Task>, const String& mode) OVERRIDE; 90 90 91 91 // WebCore::WorkerObjectProxy methods:
Note:
See TracChangeset
for help on using the changeset viewer.