Index: Source/modules/websockets/WorkerThreadableWebSocketChannel.cpp |
diff --git a/Source/modules/websockets/WorkerThreadableWebSocketChannel.cpp b/Source/modules/websockets/WorkerThreadableWebSocketChannel.cpp |
index 1b85adce8dd38ad1a50ab4e078f1c43ee93d00dd..47dccd2bdc4da478781688419491d58c0eb85ab3 100644 |
--- a/Source/modules/websockets/WorkerThreadableWebSocketChannel.cpp |
+++ b/Source/modules/websockets/WorkerThreadableWebSocketChannel.cpp |
@@ -228,7 +228,13 @@ void WorkerThreadableWebSocketChannel::resume() |
m_bridge->resume(); |
} |
-WorkerThreadableWebSocketChannel::Peer::Peer(PassRefPtr<WeakReference<Peer> > reference, PassRefPtr<ThreadableWebSocketChannelClientWrapper> clientWrapper, WorkerLoaderProxy& loaderProxy, ExecutionContext* context, const String& sourceURL, unsigned lineNumber, PassOwnPtr<ThreadableWebSocketChannelSyncHelper> syncHelper) |
+void WorkerThreadableWebSocketChannel::trace(Visitor* visitor) |
+{ |
+ visitor->trace(m_workerClientWrapper); |
+ WebSocketChannel::trace(visitor); |
+} |
+ |
+WorkerThreadableWebSocketChannel::Peer::Peer(PassRefPtr<WeakReference<Peer> > reference, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> clientWrapper, WorkerLoaderProxy& loaderProxy, ExecutionContext* context, const String& sourceURL, unsigned lineNumber, PassOwnPtr<ThreadableWebSocketChannelSyncHelper> syncHelper) |
: m_workerClientWrapper(clientWrapper) |
, m_loaderProxy(loaderProxy) |
, m_mainWebSocketChannel(nullptr) |
@@ -255,7 +261,7 @@ WorkerThreadableWebSocketChannel::Peer::~Peer() |
m_mainWebSocketChannel->disconnect(); |
} |
-void WorkerThreadableWebSocketChannel::Peer::initialize(ExecutionContext* context, PassRefPtr<WeakReference<Peer> > reference, WorkerLoaderProxy* loaderProxy, PassRefPtr<ThreadableWebSocketChannelClientWrapper> clientWrapper, const String& sourceURLAtConnection, unsigned lineNumberAtConnection, PassOwnPtr<ThreadableWebSocketChannelSyncHelper> syncHelper) |
+void WorkerThreadableWebSocketChannel::Peer::initialize(ExecutionContext* context, PassRefPtr<WeakReference<Peer> > reference, WorkerLoaderProxy* loaderProxy, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> clientWrapper, const String& sourceURLAtConnection, unsigned lineNumberAtConnection, PassOwnPtr<ThreadableWebSocketChannelSyncHelper> syncHelper) |
{ |
// The caller must call destroy() to free the peer. |
new Peer(reference, clientWrapper, *loaderProxy, context, sourceURLAtConnection, lineNumberAtConnection, syncHelper); |
@@ -368,7 +374,7 @@ void WorkerThreadableWebSocketChannel::Peer::resume() |
m_mainWebSocketChannel->resume(); |
} |
-static void workerGlobalScopeDidConnect(ExecutionContext* context, PassRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, const String& subprotocol, const String& extensions) |
+static void workerGlobalScopeDidConnect(ExecutionContext* context, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, const String& subprotocol, const String& extensions) |
{ |
ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
workerClientWrapper->setSubprotocol(subprotocol); |
@@ -379,10 +385,10 @@ static void workerGlobalScopeDidConnect(ExecutionContext* context, PassRefPtr<Th |
void WorkerThreadableWebSocketChannel::Peer::didConnect() |
{ |
ASSERT(isMainThread()); |
- m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalScopeDidConnect, m_workerClientWrapper, m_mainWebSocketChannel->subprotocol(), m_mainWebSocketChannel->extensions())); |
+ m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalScopeDidConnect, m_workerClientWrapper.get(), m_mainWebSocketChannel->subprotocol(), m_mainWebSocketChannel->extensions())); |
} |
-static void workerGlobalScopeDidReceiveMessage(ExecutionContext* context, PassRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, const String& message) |
+static void workerGlobalScopeDidReceiveMessage(ExecutionContext* context, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, const String& message) |
{ |
ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
workerClientWrapper->didReceiveMessage(message); |
@@ -391,10 +397,10 @@ static void workerGlobalScopeDidReceiveMessage(ExecutionContext* context, PassRe |
void WorkerThreadableWebSocketChannel::Peer::didReceiveMessage(const String& message) |
{ |
ASSERT(isMainThread()); |
- m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalScopeDidReceiveMessage, m_workerClientWrapper, message)); |
+ m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalScopeDidReceiveMessage, m_workerClientWrapper.get(), message)); |
} |
-static void workerGlobalScopeDidReceiveBinaryData(ExecutionContext* context, PassRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, PassOwnPtr<Vector<char> > binaryData) |
+static void workerGlobalScopeDidReceiveBinaryData(ExecutionContext* context, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, PassOwnPtr<Vector<char> > binaryData) |
{ |
ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
workerClientWrapper->didReceiveBinaryData(binaryData); |
@@ -403,10 +409,10 @@ static void workerGlobalScopeDidReceiveBinaryData(ExecutionContext* context, Pas |
void WorkerThreadableWebSocketChannel::Peer::didReceiveBinaryData(PassOwnPtr<Vector<char> > binaryData) |
{ |
ASSERT(isMainThread()); |
- m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalScopeDidReceiveBinaryData, m_workerClientWrapper, binaryData)); |
+ m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalScopeDidReceiveBinaryData, m_workerClientWrapper.get(), binaryData)); |
} |
-static void workerGlobalScopeDidUpdateBufferedAmount(ExecutionContext* context, PassRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, unsigned long bufferedAmount) |
+static void workerGlobalScopeDidUpdateBufferedAmount(ExecutionContext* context, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, unsigned long bufferedAmount) |
{ |
ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
workerClientWrapper->didUpdateBufferedAmount(bufferedAmount); |
@@ -415,10 +421,10 @@ static void workerGlobalScopeDidUpdateBufferedAmount(ExecutionContext* context, |
void WorkerThreadableWebSocketChannel::Peer::didUpdateBufferedAmount(unsigned long bufferedAmount) |
{ |
ASSERT(isMainThread()); |
- m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalScopeDidUpdateBufferedAmount, m_workerClientWrapper, bufferedAmount)); |
+ m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalScopeDidUpdateBufferedAmount, m_workerClientWrapper.get(), bufferedAmount)); |
} |
-static void workerGlobalScopeDidStartClosingHandshake(ExecutionContext* context, PassRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper) |
+static void workerGlobalScopeDidStartClosingHandshake(ExecutionContext* context, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper) |
{ |
ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
workerClientWrapper->didStartClosingHandshake(); |
@@ -427,10 +433,10 @@ static void workerGlobalScopeDidStartClosingHandshake(ExecutionContext* context, |
void WorkerThreadableWebSocketChannel::Peer::didStartClosingHandshake() |
{ |
ASSERT(isMainThread()); |
- m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalScopeDidStartClosingHandshake, m_workerClientWrapper)); |
+ m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalScopeDidStartClosingHandshake, m_workerClientWrapper.get())); |
} |
-static void workerGlobalScopeDidClose(ExecutionContext* context, PassRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, unsigned long unhandledBufferedAmount, WebSocketChannelClient::ClosingHandshakeCompletionStatus closingHandshakeCompletion, unsigned short code, const String& reason) |
+static void workerGlobalScopeDidClose(ExecutionContext* context, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, unsigned long unhandledBufferedAmount, WebSocketChannelClient::ClosingHandshakeCompletionStatus closingHandshakeCompletion, unsigned short code, const String& reason) |
{ |
ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
workerClientWrapper->didClose(unhandledBufferedAmount, closingHandshakeCompletion, code, reason); |
@@ -440,10 +446,10 @@ void WorkerThreadableWebSocketChannel::Peer::didClose(unsigned long unhandledBuf |
{ |
ASSERT(isMainThread()); |
m_mainWebSocketChannel = nullptr; |
- m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalScopeDidClose, m_workerClientWrapper, unhandledBufferedAmount, closingHandshakeCompletion, code, reason)); |
+ m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalScopeDidClose, m_workerClientWrapper.get(), unhandledBufferedAmount, closingHandshakeCompletion, code, reason)); |
} |
-static void workerGlobalScopeDidReceiveMessageError(ExecutionContext* context, PassRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper) |
+static void workerGlobalScopeDidReceiveMessageError(ExecutionContext* context, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper) |
{ |
ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
workerClientWrapper->didReceiveMessageError(); |
@@ -452,10 +458,10 @@ static void workerGlobalScopeDidReceiveMessageError(ExecutionContext* context, P |
void WorkerThreadableWebSocketChannel::Peer::didReceiveMessageError() |
{ |
ASSERT(isMainThread()); |
- m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalScopeDidReceiveMessageError, m_workerClientWrapper)); |
+ m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalScopeDidReceiveMessageError, m_workerClientWrapper.get())); |
} |
-WorkerThreadableWebSocketChannel::Bridge::Bridge(PassRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, WorkerGlobalScope& workerGlobalScope) |
+WorkerThreadableWebSocketChannel::Bridge::Bridge(PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, WorkerGlobalScope& workerGlobalScope) |
: m_workerClientWrapper(workerClientWrapper) |
, m_workerGlobalScope(workerGlobalScope) |
, m_loaderProxy(m_workerGlobalScope->thread()->workerLoaderProxy()) |
@@ -479,7 +485,7 @@ void WorkerThreadableWebSocketChannel::Bridge::initialize(const String& sourceUR |
m_syncHelper = syncHelper.get(); |
RefPtr<Bridge> protect(this); |
- if (!waitForMethodCompletion(createCallbackTask(&Peer::initialize, reference.release(), AllowCrossThreadAccess(&m_loaderProxy), m_workerClientWrapper, sourceURL, lineNumber, syncHelper.release()))) { |
+ if (!waitForMethodCompletion(createCallbackTask(&Peer::initialize, reference.release(), AllowCrossThreadAccess(&m_loaderProxy), m_workerClientWrapper.get(), sourceURL, lineNumber, syncHelper.release()))) { |
haraken
2014/06/02 01:39:44
This line is the culprit of the crash. A problem h
|
// The worker thread has been signalled to shutdown before method completion. |
terminatePeer(); |
} |