зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
709adf878a
Коммит
07d4b0dc79
|
@ -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);
|
||||
},
|
||||
|
|
Загрузка…
Ссылка в новой задаче