Bug 1150805 - WorkerPrivate should use nsTObserverArray for the WorkerFeatures, r=bent CLOSED TREE

This commit is contained in:
Andrea Marchesini 2015-04-07 18:31:51 +01:00
parent ae3f008388
commit 670fb6a86b
3 changed files with 12 additions and 54 deletions

View File

@ -125,8 +125,7 @@ public:
void FailConnection(uint16_t reasonCode,
const nsACString& aReasonString = EmptyCString());
nsresult CloseConnection(uint16_t reasonCode,
const nsACString& aReasonString = EmptyCString(),
bool aCanceling = false);
const nsACString& aReasonString = EmptyCString());
nsresult Disconnect();
void DisconnectInternal();
@ -385,38 +384,6 @@ WebSocketImpl::PrintErrorOnConsole(const char *aBundleURI,
namespace {
class CloseRunnable final : public WorkerMainThreadRunnable
{
public:
CloseRunnable(WebSocketImpl* aImpl, uint16_t aReasonCode,
const nsACString& aReasonString)
: WorkerMainThreadRunnable(aImpl->mWorkerPrivate)
, mImpl(aImpl)
, mReasonCode(aReasonCode)
, mReasonString(aReasonString)
, mRv(NS_ERROR_FAILURE)
{ }
bool MainThreadRun() override
{
mRv = mImpl->mChannel->Close(mReasonCode, mReasonString);
return true;
}
nsresult ErrorCode() const
{
return mRv;
}
private:
// A raw pointer because this runnable is sync.
WebSocketImpl* mImpl;
uint16_t mReasonCode;
const nsACString& mReasonString;
nsresult mRv;
};
class CancelWebSocketRunnable final : public nsRunnable
{
public:
@ -469,11 +436,9 @@ private:
nsresult
WebSocketImpl::CloseConnection(uint16_t aReasonCode,
const nsACString& aReasonString,
bool aCanceling)
const nsACString& aReasonString)
{
AssertIsOnTargetThread();
MOZ_ASSERT(!NS_IsMainThread() || !aCanceling);
if (mDisconnectingOrDisconnected) {
return NS_OK;
@ -500,16 +465,9 @@ WebSocketImpl::CloseConnection(uint16_t aReasonCode,
return mChannel->Close(aReasonCode, aReasonString);
}
if (aCanceling) {
nsRefPtr<CancelWebSocketRunnable> runnable =
new CancelWebSocketRunnable(mChannel, aReasonCode, aReasonString);
return NS_DispatchToMainThread(runnable);
}
nsRefPtr<CloseRunnable> runnable =
new CloseRunnable(this, aReasonCode, aReasonString);
runnable->Dispatch(mWorkerPrivate->GetJSContext());
return runnable->ErrorCode();
nsRefPtr<CancelWebSocketRunnable> runnable =
new CancelWebSocketRunnable(mChannel, aReasonCode, aReasonString);
return NS_DispatchToMainThread(runnable);
}
// No channel, but not disconnected: canceled or failed early
@ -2033,7 +1991,7 @@ public:
}
mWebSocketImpl->CloseConnection(nsIWebSocketChannel::CLOSE_GOING_AWAY,
EmptyCString(), true);
EmptyCString());
}
return true;

View File

@ -5898,11 +5898,10 @@ WorkerPrivate::NotifyFeatures(JSContext* aCx, Status aStatus)
CancelAllTimeouts(aCx);
}
nsAutoTArray<WorkerFeature*, 30> features;
features.AppendElements(mFeatures);
for (uint32_t index = 0; index < features.Length(); index++) {
if (!features[index]->Notify(aCx, aStatus)) {
nsTObserverArray<WorkerFeature*>::ForwardIterator iter(mFeatures);
while (iter.HasMore()) {
WorkerFeature* feature = iter.GetNext();
if (!feature->Notify(aCx, aStatus)) {
NS_WARNING("Failed to notify feature!");
}
}

View File

@ -25,6 +25,7 @@
#include "nsString.h"
#include "nsTArray.h"
#include "nsThreadUtils.h"
#include "nsTObserverArray.h"
#include "mozilla/dom/StructuredCloneTags.h"
#include "Queue.h"
@ -852,7 +853,7 @@ class WorkerPrivate : public WorkerPrivateParent<WorkerPrivate>
nsRefPtr<WorkerGlobalScope> mScope;
nsRefPtr<WorkerDebuggerGlobalScope> mDebuggerScope;
nsTArray<ParentType*> mChildWorkers;
nsTArray<WorkerFeature*> mFeatures;
nsTObserverArray<WorkerFeature*> mFeatures;
nsTArray<nsAutoPtr<TimeoutInfo>> mTimeouts;
uint32_t mDebuggerEventLoopLevel;