mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-08 10:44:56 +00:00
Bug 1151609 - WebSocket::CloseConnection must be thread-safe, r=smaug CLOSED TREE
This commit is contained in:
parent
1b034b250f
commit
4e17cd5e14
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user