Bug 1151609 - WebSocket::CloseConnection must be thread-safe, r=smaug CLOSED TREE

This commit is contained in:
Andrea Marchesini 2015-04-08 19:09:26 +01:00
parent 1b034b250f
commit 4e17cd5e14

View File

@ -432,12 +432,40 @@ private:
WebSocketImpl* mImpl;
};
class CloseConnectionRunnable final : public nsRunnable
{
public:
CloseConnectionRunnable(WebSocketImpl* aImpl,
uint16_t aReasonCode,
const nsACString& aReasonString)
: mImpl(aImpl)
, mReasonCode(aReasonCode)
, mReasonString(aReasonString)
{}
NS_IMETHOD Run() override
{
return mImpl->CloseConnection(mReasonCode, mReasonString);
}
private:
nsRefPtr<WebSocketImpl> mImpl;
uint16_t mReasonCode;
const nsCString mReasonString;
};
} // anonymous namespace
nsresult
WebSocketImpl::CloseConnection(uint16_t aReasonCode,
const nsACString& aReasonString)
{
if (!IsTargetThread()) {
nsRefPtr<nsRunnable> runnable =
new CloseConnectionRunnable(this, aReasonCode, aReasonString);
return Dispatch(runnable, NS_DISPATCH_NORMAL);
}
AssertIsOnTargetThread();
if (mDisconnectingOrDisconnected) {
@ -471,7 +499,6 @@ WebSocketImpl::CloseConnection(uint16_t aReasonCode,
}
// No channel, but not disconnected: canceled or failed early
//
MOZ_ASSERT(readyState == WebSocket::CONNECTING,
"Should only get here for early websocket cancel/error");
@ -622,10 +649,12 @@ WebSocketImpl::DisconnectInternal()
mWeakLoadGroup = nullptr;
}
nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService();
if (os) {
os->RemoveObserver(this, DOM_WINDOW_DESTROYED_TOPIC);
os->RemoveObserver(this, DOM_WINDOW_FROZEN_TOPIC);
if (!mWorkerPrivate) {
nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService();
if (os) {
os->RemoveObserver(this, DOM_WINDOW_DESTROYED_TOPIC);
os->RemoveObserver(this, DOM_WINDOW_FROZEN_TOPIC);
}
}
}