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() GamepadManager::GamepadManager()
: mEnabled(false), : mEnabled(false),
mNonstandardEventsEnabled(false), mNonstandardEventsEnabled(false),
mShuttingDown(false) mShuttingDown(false),
mPromiseID(0)
{} {}
nsresult nsresult
@ -667,17 +668,29 @@ GamepadManager::Update(const GamepadChangeEvent& aEvent)
} }
void already_AddRefed<Promise>
GamepadManager::VibrateHaptic(uint32_t aControllerIdx, uint32_t aHapticIndex, 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) { if (aControllerIdx >= VR_GAMEPAD_IDX_OFFSET) {
uint32_t index = aControllerIdx - VR_GAMEPAD_IDX_OFFSET; uint32_t index = aControllerIdx - VR_GAMEPAD_IDX_OFFSET;
mVRChannelChild->AddPromise(mPromiseID, promise);
mVRChannelChild->SendVibrateHaptic(index, aHapticIndex, mVRChannelChild->SendVibrateHaptic(index, aHapticIndex,
aIntensity, aDuration); aIntensity, aDuration,
mPromiseID);
} else { } else {
// TODO: Bug 680289, implement for standard gamepads // TODO: Bug 680289, implement for standard gamepads
} }
++mPromiseID;
return promise.forget();
} }
//Override nsIIPCBackgroundChildCreateCallback //Override nsIIPCBackgroundChildCreateCallback

View File

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

View File

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

View File

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

View File

@ -55,7 +55,7 @@ parent:
async ControllerListenerAdded(); async ControllerListenerAdded();
async ControllerListenerRemoved(); async ControllerListenerRemoved();
async VibrateHaptic(uint32_t aControllerIdx, uint32_t aHapticIndex, async VibrateHaptic(uint32_t aControllerIdx, uint32_t aHapticIndex,
double aIntensity, double aDuration); double aIntensity, double aDuration, uint32_t aPromiseID);
async CreateVRTestSystem(); async CreateVRTestSystem();
async CreateVRServiceTestDisplay(nsCString aID, uint32_t aPromiseID); async CreateVRServiceTestDisplay(nsCString aID, uint32_t aPromiseID);
@ -82,6 +82,8 @@ child:
async NotifyVSync(); async NotifyVSync();
async NotifyVRVSync(uint32_t aDisplayID); async NotifyVRVSync(uint32_t aDisplayID);
async GamepadUpdate(GamepadChangeEvent aGamepadEvent); async GamepadUpdate(GamepadChangeEvent aGamepadEvent);
async ReplyGamepadVibrateHaptic(uint32_t aPromiseID);
async ReplyCreateVRServiceTestDisplay(nsCString aID, uint32_t aPromiseID, async ReplyCreateVRServiceTestDisplay(nsCString aID, uint32_t aPromiseID,
uint32_t aDeviceID); uint32_t aDeviceID);
async ReplyCreateVRServiceTestController(nsCString aID, uint32_t aPromiseID, 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()); 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 gfx
} // namespace mozilla } // namespace mozilla

View File

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

View File

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

View File

@ -92,7 +92,8 @@ protected:
virtual mozilla::ipc::IPCResult RecvControllerListenerAdded() override; virtual mozilla::ipc::IPCResult RecvControllerListenerAdded() override;
virtual mozilla::ipc::IPCResult RecvControllerListenerRemoved() override; virtual mozilla::ipc::IPCResult RecvControllerListenerRemoved() override;
virtual mozilla::ipc::IPCResult RecvVibrateHaptic(const uint32_t& aControllerIdx, const uint32_t& aHapticIndex, 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 RecvCreateVRTestSystem() override;
virtual mozilla::ipc::IPCResult RecvCreateVRServiceTestDisplay(const nsCString& aID, const uint32_t& aPromiseID) 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; virtual mozilla::ipc::IPCResult RecvCreateVRServiceTestController(const nsCString& aID, const uint32_t& aPromiseID) override;