Bug 1314833 - Part 4: Factor out AbstractThread::MainThread() used in U2F. r=billm

MozReview-Commit-ID: 7TcbTE9wab0

--HG--
extra : rebase_source : b2c090e6e154d170f185d0f59ecfb456c074d94c
This commit is contained in:
Bevis Tseng 2016-11-22 14:19:06 +08:00
Родитель 709adf878a
Коммит 07d4b0dc79
3 изменённых файлов: 72 добавлений и 37 удалений

Просмотреть файл

@ -162,10 +162,12 @@ U2FStatus::GetResponse()
}
U2FTask::U2FTask(const nsAString& aOrigin, const nsAString& aAppId,
const Authenticator& aAuthenticator)
const Authenticator& aAuthenticator,
AbstractThread* aMainThread)
: mOrigin(aOrigin)
, mAppId(aAppId)
, mAuthenticator(aAuthenticator)
, mAbstractMainThread(aMainThread)
{}
U2FTask::~U2FTask()
@ -180,12 +182,14 @@ U2FTask::Execute()
// TODO: Use a thread pool here, but we have to solve the PContentChild issues
// of being in a worker thread.
AbstractThread::MainThread()->Dispatch(r.forget());
mAbstractMainThread->Dispatch(r.forget());
return p;
}
U2FPrepTask::U2FPrepTask(const Authenticator& aAuthenticator)
U2FPrepTask::U2FPrepTask(const Authenticator& aAuthenticator,
AbstractThread* aMainThread)
: mAuthenticator(aAuthenticator)
, mAbstractMainThread(aMainThread)
{}
U2FPrepTask::~U2FPrepTask()
@ -200,13 +204,14 @@ U2FPrepTask::Execute()
// TODO: Use a thread pool here, but we have to solve the PContentChild issues
// of being in a worker thread.
AbstractThread::MainThread()->Dispatch(r.forget());
mAbstractMainThread->Dispatch(r.forget());
return p;
}
U2FIsRegisteredTask::U2FIsRegisteredTask(const Authenticator& aAuthenticator,
const LocalRegisteredKey& aRegisteredKey)
: U2FPrepTask(aAuthenticator)
const LocalRegisteredKey& aRegisteredKey,
AbstractThread* aMainThread)
: U2FPrepTask(aAuthenticator, aMainThread)
, mRegisteredKey(aRegisteredKey)
{}
@ -262,8 +267,9 @@ U2FRegisterTask::U2FRegisterTask(const nsAString& aOrigin,
const Authenticator& aAuthenticator,
const CryptoBuffer& aAppParam,
const CryptoBuffer& aChallengeParam,
const LocalRegisterRequest& aRegisterEntry)
: U2FTask(aOrigin, aAppId, aAuthenticator)
const LocalRegisterRequest& aRegisterEntry,
AbstractThread* aMainThread)
: U2FTask(aOrigin, aAppId, aAuthenticator, aMainThread)
, mAppParam(aAppParam)
, mChallengeParam(aChallengeParam)
, mRegisterEntry(aRegisterEntry)
@ -341,8 +347,9 @@ U2FSignTask::U2FSignTask(const nsAString& aOrigin,
const CryptoBuffer& aAppParam,
const CryptoBuffer& aChallengeParam,
const CryptoBuffer& aClientData,
const CryptoBuffer& aKeyHandle)
: U2FTask(aOrigin, aAppId, aAuthenticator)
const CryptoBuffer& aKeyHandle,
AbstractThread* aMainThread)
: U2FTask(aOrigin, aAppId, aAuthenticator, aMainThread)
, mVersion(aVersion)
, mAppParam(aAppParam)
, mChallengeParam(aChallengeParam)
@ -429,9 +436,11 @@ U2FSignTask::Run()
return NS_OK;
}
U2FRunnable::U2FRunnable(const nsAString& aOrigin, const nsAString& aAppId)
U2FRunnable::U2FRunnable(const nsAString& aOrigin, const nsAString& aAppId,
AbstractThread* aMainThread)
: mOrigin(aOrigin)
, mAppId(aAppId)
, mAbstractMainThread(aMainThread)
{}
U2FRunnable::~U2FRunnable()
@ -513,8 +522,9 @@ U2FRegisterRunnable::U2FRegisterRunnable(const nsAString& aOrigin,
const Sequence<RegisterRequest>& aRegisterRequests,
const Sequence<RegisteredKey>& aRegisteredKeys,
const Sequence<Authenticator>& aAuthenticators,
U2FRegisterCallback* aCallback)
: U2FRunnable(aOrigin, aAppId)
U2FRegisterCallback* aCallback,
AbstractThread* aMainThread)
: U2FRunnable(aOrigin, aAppId, aMainThread)
, mAuthenticators(aAuthenticators)
// U2FRegisterCallback does not support threadsafe refcounting, and must be
// used and destroyed on main.
@ -617,15 +627,16 @@ U2FRegisterRunnable::Run()
nsTArray<RefPtr<U2FPrepPromise>> prepPromiseList;
for (size_t a = 0; a < mAuthenticators.Length(); ++a) {
Authenticator token(mAuthenticators[a]);
RefPtr<U2FIsRegisteredTask> compTask = new U2FIsRegisteredTask(token, key);
RefPtr<U2FIsRegisteredTask> compTask =
new U2FIsRegisteredTask(token, key, mAbstractMainThread);
prepPromiseList.AppendElement(compTask->Execute());
}
// Treat each call to Promise::All as a work unit, as it completes together
status->WaitGroupAdd();
U2FPrepPromise::All(AbstractThread::MainThread(), prepPromiseList)
->Then(AbstractThread::MainThread(), __func__,
U2FPrepPromise::All(mAbstractMainThread, prepPromiseList)
->Then(mAbstractMainThread, __func__,
[status] (const nsTArray<Authenticator>& aTokens) {
MOZ_LOG(gU2FLog, LogLevel::Debug,
("ALL: None of the RegisteredKeys were recognized. n=%d",
@ -646,7 +657,7 @@ U2FRegisterRunnable::Run()
// recognized.
if (status->IsStopped()) {
status->WaitGroupAdd();
AbstractThread::MainThread()->Dispatch(NS_NewRunnableFunction(
mAbstractMainThread->Dispatch(NS_NewRunnableFunction(
[status, this] () {
RegisterResponse response;
response.mErrorCode.Construct(
@ -697,10 +708,11 @@ U2FRegisterRunnable::Run()
RefPtr<U2FRegisterTask> registerTask = new U2FRegisterTask(mOrigin, mAppId,
token, appParam,
challengeParam,
req);
req,
mAbstractMainThread);
status->WaitGroupAdd();
registerTask->Execute()->Then(AbstractThread::MainThread(), __func__,
registerTask->Execute()->Then(mAbstractMainThread, __func__,
[status, this] (nsString aResponse) {
if (status->IsStopped()) {
return;
@ -728,7 +740,7 @@ U2FRegisterRunnable::Run()
// Transmit back to the JS engine from the Main Thread
status->WaitGroupAdd();
AbstractThread::MainThread()->Dispatch(NS_NewRunnableFunction(
mAbstractMainThread->Dispatch(NS_NewRunnableFunction(
[status, this] () {
RegisterResponse response;
if (status->GetErrorCode() == ErrorCode::OK) {
@ -752,8 +764,9 @@ U2FSignRunnable::U2FSignRunnable(const nsAString& aOrigin,
const nsAString& aChallenge,
const Sequence<RegisteredKey>& aRegisteredKeys,
const Sequence<Authenticator>& aAuthenticators,
U2FSignCallback* aCallback)
: U2FRunnable(aOrigin, aAppId)
U2FSignCallback* aCallback,
AbstractThread* aMainThread)
: U2FRunnable(aOrigin, aAppId, aMainThread)
, mAuthenticators(aAuthenticators)
// U2FSignCallback does not support threadsafe refcounting, and must be used
// and destroyed on main.
@ -883,10 +896,11 @@ U2FSignRunnable::Run()
RefPtr<U2FSignTask> signTask = new U2FSignTask(mOrigin, mAppId,
key.mVersion, token,
appParam, challengeParam,
mClientData, keyHandle);
mClientData, keyHandle,
mAbstractMainThread);
status->WaitGroupAdd();
signTask->Execute()->Then(AbstractThread::MainThread(), __func__,
signTask->Execute()->Then(mAbstractMainThread, __func__,
[status, this] (nsString aResponse) {
if (status->IsStopped()) {
return;
@ -914,7 +928,7 @@ U2FSignRunnable::Run()
// Transmit back to the JS engine from the Main Thread
status->WaitGroupAdd();
AbstractThread::MainThread()->Dispatch(NS_NewRunnableFunction(
mAbstractMainThread->Dispatch(NS_NewRunnableFunction(
[status, this] () {
SignResponse response;
if (status->GetErrorCode() == ErrorCode::OK) {
@ -1001,6 +1015,8 @@ U2F::Init(nsPIDOMWindowInner* aParent, ErrorResult& aRv)
}
}
mAbstractMainThread = doc->AbstractMainThreadFor(TaskCategory::Other);
mInitialized = true;
}
@ -1024,7 +1040,8 @@ U2F::Register(const nsAString& aAppId,
aRegisterRequests,
aRegisteredKeys,
mAuthenticators,
&aCallback);
&aCallback,
mAbstractMainThread);
pool->Dispatch(task.forget(), NS_DISPATCH_NORMAL);
}
@ -1046,7 +1063,8 @@ U2F::Sign(const nsAString& aAppId,
RefPtr<SharedThreadPool> pool = SharedThreadPool::Get(kPoolName);
RefPtr<U2FSignRunnable> task = new U2FSignRunnable(mOrigin, aAppId, aChallenge,
aRegisteredKeys,
mAuthenticators, &aCallback);
mAuthenticators, &aCallback,
mAbstractMainThread);
pool->Dispatch(task.forget(), NS_DISPATCH_NORMAL);
}

Просмотреть файл

@ -27,6 +27,9 @@
#include "U2FAuthenticator.h"
namespace mozilla {
class AbstractThread;
namespace dom {
class U2FRegisterCallback;
@ -63,7 +66,8 @@ typedef MozPromise<Authenticator, ErrorCode, false> U2FPrepPromise;
class U2FPrepTask : public Runnable
{
public:
explicit U2FPrepTask(const Authenticator& aAuthenticator);
explicit U2FPrepTask(const Authenticator& aAuthenticator,
AbstractThread* aMainThread);
RefPtr<U2FPrepPromise> Execute();
@ -72,6 +76,7 @@ protected:
Authenticator mAuthenticator;
MozPromiseHolder<U2FPrepPromise> mPromise;
const RefPtr<AbstractThread> mAbstractMainThread;
};
// Determine whether the provided Authenticator already knows
@ -80,7 +85,8 @@ class U2FIsRegisteredTask final : public U2FPrepTask
{
public:
U2FIsRegisteredTask(const Authenticator& aAuthenticator,
const LocalRegisteredKey& aRegisteredKey);
const LocalRegisteredKey& aRegisteredKey,
AbstractThread* aMainThread);
NS_DECL_NSIRUNNABLE
private:
@ -94,13 +100,15 @@ class U2FTask : public Runnable
public:
U2FTask(const nsAString& aOrigin,
const nsAString& aAppId,
const Authenticator& aAuthenticator);
const Authenticator& aAuthenticator,
AbstractThread* aMainThread);
RefPtr<U2FPromise> Execute();
nsString mOrigin;
nsString mAppId;
Authenticator mAuthenticator;
const RefPtr<AbstractThread> mAbstractMainThread;
protected:
virtual ~U2FTask();
@ -118,7 +126,8 @@ public:
const Authenticator& aAuthenticator,
const CryptoBuffer& aAppParam,
const CryptoBuffer& aChallengeParam,
const LocalRegisterRequest& aRegisterEntry);
const LocalRegisterRequest& aRegisterEntry,
AbstractThread* aMainThread);
NS_DECL_NSIRUNNABLE
private:
@ -141,7 +150,8 @@ public:
const CryptoBuffer& aAppParam,
const CryptoBuffer& aChallengeParam,
const CryptoBuffer& aClientData,
const CryptoBuffer& aKeyHandle);
const CryptoBuffer& aKeyHandle,
AbstractThread* aMainThread);
NS_DECL_NSIRUNNABLE
private:
@ -189,7 +199,8 @@ class U2FRunnable : public Runnable
, public nsNSSShutDownObject
{
public:
U2FRunnable(const nsAString& aOrigin, const nsAString& aAppId);
U2FRunnable(const nsAString& aOrigin, const nsAString& aAppId,
AbstractThread* aMainThread);
// No NSS resources to release.
virtual
@ -201,6 +212,7 @@ protected:
nsString mOrigin;
nsString mAppId;
const RefPtr<AbstractThread> mAbstractMainThread;
};
// This U2FRunnable completes a single application-requested U2F Register
@ -213,7 +225,8 @@ public:
const Sequence<RegisterRequest>& aRegisterRequests,
const Sequence<RegisteredKey>& aRegisteredKeys,
const Sequence<Authenticator>& aAuthenticators,
U2FRegisterCallback* aCallback);
U2FRegisterCallback* aCallback,
AbstractThread* aMainThread);
void SendResponse(const RegisterResponse& aResponse);
void SetTimeout(const int32_t aTimeoutMillis);
@ -239,7 +252,8 @@ public:
const nsAString& aChallenge,
const Sequence<RegisteredKey>& aRegisteredKeys,
const Sequence<Authenticator>& aAuthenticators,
U2FSignCallback* aCallback);
U2FSignCallback* aCallback,
AbstractThread* aMainThread);
void SendResponse(const SignResponse& aResponse);
void SetTimeout(const int32_t aTimeoutMillis);
@ -305,6 +319,7 @@ private:
nsString mOrigin;
Sequence<Authenticator> mAuthenticators;
bool mInitialized;
RefPtr<AbstractThread> mAbstractMainThread;
~U2F();
};

Просмотреть файл

@ -852,7 +852,8 @@ WebAuthentication::MakeCredential(JSContext* aCx, const Account& aAccount,
requestMonitor->CompleteTask();
monitorPromise->Then(AbstractThread::MainThread(), __func__,
monitorPromise->Then(
global->AbstractMainThreadFor(TaskCategory::Other), __func__,
[promise] (CredentialPtr aInfo) {
promise->MaybeResolve(aInfo);
},
@ -1042,7 +1043,8 @@ WebAuthentication::GetAssertion(const ArrayBufferViewOrArrayBuffer& aChallenge,
requestMonitor->CompleteTask();
monitorPromise->Then(AbstractThread::MainThread(), __func__,
monitorPromise->Then(
global->AbstractMainThreadFor(TaskCategory::Other), __func__,
[promise] (AssertionPtr aAssertion) {
promise->MaybeResolve(aAssertion);
},