Bug 1299937 - Part 4: Handling vibrate haptic promise in VRManager; r=qdot

MozReview-Commit-ID: 3KZ8MNx3Dnq

--HG--
extra : rebase_source : 1b11f7948da7477e31f7448878a6d5874ba69087
This commit is contained in:
Daosheng Mu 2017-02-02 14:59:44 +08:00
parent 3905da3aea
commit c1d89a986e
9 changed files with 59 additions and 13 deletions

View File

@ -60,7 +60,8 @@ NS_IMPL_ISUPPORTS(GamepadManager, nsIObserver)
GamepadManager::GamepadManager()
: mEnabled(false),
mNonstandardEventsEnabled(false),
mShuttingDown(false)
mShuttingDown(false),
mPromiseID(0)
{}
nsresult
@ -667,17 +668,29 @@ GamepadManager::Update(const GamepadChangeEvent& aEvent)
}
void
already_AddRefed<Promise>
GamepadManager::VibrateHaptic(uint32_t aControllerIdx, uint32_t aHapticIndex,
double aIntensity, double aDuration)
double aIntensity, double aDuration,
nsIGlobalObject* aGlobal, ErrorResult& aRv)
{
RefPtr<Promise> promise = Promise::Create(aGlobal, aRv);
if (NS_WARN_IF(aRv.Failed())) {
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
}
if (aControllerIdx >= VR_GAMEPAD_IDX_OFFSET) {
uint32_t index = aControllerIdx - VR_GAMEPAD_IDX_OFFSET;
mVRChannelChild->AddPromise(mPromiseID, promise);
mVRChannelChild->SendVibrateHaptic(index, aHapticIndex,
aIntensity, aDuration);
aIntensity, aDuration,
mPromiseID);
} else {
// TODO: Bug 680289, implement for standard gamepads
}
++mPromiseID;
return promise.forget();
}
//Override nsIIPCBackgroundChildCreateCallback

View File

@ -85,8 +85,9 @@ class GamepadManager final : public nsIObserver,
void Update(const GamepadChangeEvent& aGamepadEvent);
// Trigger vibrate haptic event to gamepad channels.
void VibrateHaptic(uint32_t aControllerIdx, uint32_t aHapticIndex,
double aIntensity, double aDuration);
already_AddRefed<Promise> VibrateHaptic(uint32_t aControllerIdx, uint32_t aHapticIndex,
double aIntensity, double aDuration,
nsIGlobalObject* aGlobal, ErrorResult& aRv);
protected:
GamepadManager();
@ -153,6 +154,7 @@ class GamepadManager final : public nsIObserver,
// Inner windows that are listening for gamepad events.
// has been sent to that window.
nsTArray<RefPtr<nsGlobalWindow>> mListeners;
uint32_t mPromiseID;
};
} // namespace dom

View File

@ -425,11 +425,12 @@ VRManager::NotifyGamepadChange(const T& aInfo)
void
VRManager::VibrateHaptic(uint32_t aControllerIdx, uint32_t aHapticIndex,
double aIntensity, double aDuration)
double aIntensity, double aDuration, uint32_t aPromiseID)
{
for (uint32_t i = 0; i < mManagers.Length(); ++i) {
mManagers[i]->VibrateHaptic(aControllerIdx, aHapticIndex,
aIntensity, aDuration);
aIntensity, aDuration, aPromiseID);
}
}

View File

@ -50,7 +50,7 @@ public:
void GetVRControllerInfo(nsTArray<VRControllerInfo>& aControllerInfo);
void CreateVRTestSystem();
void VibrateHaptic(uint32_t aControllerIdx, uint32_t aHapticIndex,
double aIntensity, double aDuration);
double aIntensity, double aDuration, uint32_t aPromiseID);
protected:
VRManager();

View File

@ -55,7 +55,7 @@ parent:
async ControllerListenerAdded();
async ControllerListenerRemoved();
async VibrateHaptic(uint32_t aControllerIdx, uint32_t aHapticIndex,
double aIntensity, double aDuration);
double aIntensity, double aDuration, uint32_t aPromiseID);
async CreateVRTestSystem();
async CreateVRServiceTestDisplay(nsCString aID, uint32_t aPromiseID);
@ -82,6 +82,8 @@ child:
async NotifyVSync();
async NotifyVRVSync(uint32_t aDisplayID);
async GamepadUpdate(GamepadChangeEvent aGamepadEvent);
async ReplyGamepadVibrateHaptic(uint32_t aPromiseID);
async ReplyCreateVRServiceTestDisplay(nsCString aID, uint32_t aPromiseID,
uint32_t aDeviceID);
async ReplyCreateVRServiceTestController(nsCString aID, uint32_t aPromiseID,

View File

@ -677,5 +677,25 @@ VRManagerChild::HandleFatalError(const char* aName, const char* aMsg) const
dom::ContentChild::FatalErrorIfNotUsingGPUProcess(aName, aMsg, OtherPid());
}
void
VRManagerChild::AddPromise(const uint32_t& aID, dom::Promise* aPromise)
{
MOZ_ASSERT(!mGamepadPromiseList.Get(aID, nullptr));
mGamepadPromiseList.Put(aID, aPromise);
}
mozilla::ipc::IPCResult
VRManagerChild::RecvReplyGamepadVibrateHaptic(const uint32_t& aPromiseID)
{
RefPtr<dom::Promise> p;
if (!mGamepadPromiseList.Get(aPromiseID, getter_AddRefs(p))) {
MOZ_CRASH("We should always have a promise.");
}
p->MaybeResolve(true);
mGamepadPromiseList.Remove(aPromiseID);
return IPC_OK();
}
} // namespace gfx
} // namespace mozilla

View File

@ -17,6 +17,7 @@
namespace mozilla {
namespace dom {
class Promise;
class GamepadManager;
class Navigator;
class VRDisplay;
@ -50,6 +51,8 @@ public:
int GetInputFrameID();
bool GetVRDisplays(nsTArray<RefPtr<VRDisplayClient> >& aDisplays);
bool RefreshVRDisplaysWithCallback(uint64_t aWindowId);
void AddPromise(const uint32_t& aID, dom::Promise* aPromise);
void CreateVRServiceTestDisplay(const nsCString& aID, dom::Promise* aPromise);
void CreateVRServiceTestController(const nsCString& aID, dom::Promise* aPromise);
@ -120,6 +123,8 @@ protected:
virtual mozilla::ipc::IPCResult RecvNotifyVSync() override;
virtual mozilla::ipc::IPCResult RecvNotifyVRVSync(const uint32_t& aDisplayID) override;
virtual mozilla::ipc::IPCResult RecvGamepadUpdate(const GamepadChangeEvent& aGamepadEvent) override;
virtual mozilla::ipc::IPCResult RecvReplyGamepadVibrateHaptic(const uint32_t& aPromiseID) override;
virtual mozilla::ipc::IPCResult RecvReplyCreateVRServiceTestDisplay(const nsCString& aID,
const uint32_t& aPromiseID,
const uint32_t& aDeviceID) override;
@ -186,6 +191,7 @@ private:
layers::LayersBackend mBackend;
RefPtr<layers::SyncObject> mSyncObject;
nsRefPtrHashtable<nsUint32HashKey, dom::Promise> mGamepadPromiseList; // TODO: check if it can merge into one list?
uint32_t mPromiseID;
nsRefPtrHashtable<nsUint32HashKey, dom::Promise> mPromiseList;
RefPtr<dom::VRMockDisplay> mVRMockDisplay;

View File

@ -442,11 +442,12 @@ mozilla::ipc::IPCResult
VRManagerParent::RecvVibrateHaptic(const uint32_t& aControllerIdx,
const uint32_t& aHapticIndex,
const double& aIntensity,
const double& aDuration)
const double& aDuration,
const uint32_t& aPromiseID)
{
VRManager* vm = VRManager::Get();
vm->VibrateHaptic(aControllerIdx, aHapticIndex, aIntensity,
aDuration);
aDuration, aPromiseID);
return IPC_OK();
}

View File

@ -92,7 +92,8 @@ protected:
virtual mozilla::ipc::IPCResult RecvControllerListenerAdded() override;
virtual mozilla::ipc::IPCResult RecvControllerListenerRemoved() override;
virtual mozilla::ipc::IPCResult RecvVibrateHaptic(const uint32_t& aControllerIdx, const uint32_t& aHapticIndex,
const double& aIntensity, const double& aDuration) override;
const double& aIntensity, const double& aDuration, const uint32_t& aPromiseID) override;
virtual mozilla::ipc::IPCResult RecvCreateVRTestSystem() override;
virtual mozilla::ipc::IPCResult RecvCreateVRServiceTestDisplay(const nsCString& aID, const uint32_t& aPromiseID) override;
virtual mozilla::ipc::IPCResult RecvCreateVRServiceTestController(const nsCString& aID, const uint32_t& aPromiseID) override;